ΠΠ»Ρ ΠΏΡΠΈΠ³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ
Π‘Π°ΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΠΎΠ΅ uWSGI-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° python ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ application Ρ Π΄Π²ΡΠΌΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ environ ΠΈ 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) # ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ Π΅Π³ΠΎ
ΠΠΎΠΆΠ½ΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π΅ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π²ΡΡΠΊΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΡΡΡΠ°Π½ΠΈΡΠ½ΠΎΠ³ΠΎ odt-ΡΠ°ΠΉΠ»Π° Π² pdf Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² 1,5 ΡΠ°Π·Π° Π±ΡΡΡΡΠ΅Π΅ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com