Resipi uWSGI: Menukar Dokumen Menggunakan LibreOffice

Untuk menyediakan penukaran dokumen yang kami perlukan LibreOffice, uwsgi-python, pylokit ΠΈ webob. Anda juga boleh menggunakan siap sedia. Tetapi ini hanya untuk melancarkan pelayan uWSGI, dan untuk menyambung ke pelayan uWSGI yang akan kami gunakan nginx.

Aplikasi uWSGI yang paling mudah dalam python terdiri daripada aplikasi fungsi dengan dua argumen environ dan start_response

import os       # ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ
import pylokit  # Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅
import tempfile # Π½Π°ΠΌ
import webob    # ΠΌΠΎΠ΄ΡƒΠ»ΠΈ

office = pylokit.Office('/usr/lib/libreoffice/program') # Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ LibreOffice ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ

def application(environ, start_response): # функция для uWSGI
    request = webob.Request(environ) # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ запрос ΠΈΠ· окруТСния
    file = request.POST['file'] # Ρ„Π°ΠΉΠ» для прСобразования пСрСдаётся Ρ‡Π΅Ρ€Π΅Π· multipart/form-data с ΠΈΠΌΠ΅Π½Π΅ΠΌ file
    filename, extension = os.path.splitext(file.filename) # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ имя ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅
    with tempfile.NamedTemporaryFile(suffix=extension) as inp, tempfile.NamedTemporaryFile(suffix='.%s' % request.path.split('/')[-1]) as out: # создаём ΠΎΠ΄ΠΈΠ½ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· окончания запроса (для совмСстимости с unoconv-api)
        inp.write(file.file.read()) # записываСм содСрТимоС ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»
        inp.flush() # (Ρ‚.ΠΊ. LibreOfficeKit ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ)
        with office.documentLoad(inp.name) as doc: # Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» 
            doc.saveAs(out.name) # экспортируСм Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ бСрётся ΠΈΠ· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ)
            with open(out.name, 'rb') as out2: # ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»
                response = webob.Response(body=out2.read()) # создаём Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ· чтСния Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°
                return response(environ, start_response) # ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ

Anda juga boleh, tentu saja, menambah pengendalian ralat.

Menukar fail odt satu halaman ujian kepada pdf adalah kira-kira 1,5 kali lebih pantas berbanding dengan unoconv-api.

Sumber: www.habr.com

Tambah komen