เบชเบนเบ” uWSGI: เบเบฒเบ™เปเบ›เบ‡เป€เบญเบเบฐเบชเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰ LibreOffice

ะ”ะปั ะฟั€ะธะณะพั‚ะพะฒะปะตะฝะธั ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธั ะดะพะบัƒะผะตะฝั‚ะพะฒ ะฝะฐะผ ะฟะพะฝะฐะดะพะฑะธั‚ัั LibreOffice, uwsgi-python, pylokit ะธ webob. ะœะพะถะฝะพ ั‚ะฐะบะถะต ะฒะพัะฟะพะปัŒะทะพะฒะฐั‚ัŒัั เบžเป‰เบญเบกเปเบฅเป‰เบง. ะะพ ัั‚ะพ ั‚ะพะปัŒะบะพ ะดะปั ะทะฐะฟัƒัะบะฐ uWSGI-ัะตั€ะฒะตั€ะฐ, ะฐ ะดะปั ะฟะพะดะบะปัŽั‡ะตะฝะธั ะบ uWSGI-ัะตั€ะฒะตั€ัƒ ะฑัƒะดะตะผ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ nginx.

ะกะฐะผะพะต ะฟั€ะพัั‚ะพะต 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 ั€ะฐะทะฐ ะฑั‹ัั‚ั€ะตะต ะฟะพ ัั€ะฐะฒะฝะตะฝะธัŽ ั unoconv-api.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™