uWSGI เดชเดพเดšเด•เด•เตเด•เตเดฑเดฟเดชเตเดชเตเด•เตพ: LibreOffice เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดฎเดพเดฃเด™เตเด™เตพ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดžเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเตเดฐเดฎเดพเดฃ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เดพเตป เดฒเดฟเดฌเตเดฐเต†, uwsgi-เดชเตˆเดคเตเดคเตบ, เดชเตˆเดฒเต‹เด•เดฟเดฑเตเดฑเต ะธ เดตเต†เดฌเตเดฌเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚ เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต. เดŽเดจเตเดจเดพเตฝ เด‡เดคเต uWSGI เดธเต†เตผเดตเตผ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ uWSGI เดธเต†เตผเดตเดฑเดฟเดฒเต‡เด•เตเด•เต เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดฎเดพเดคเตเดฐเดฎเดพเดฃเต. nginx.

เดชเตˆเดคเตเดคเดฃเดฟเดฒเต† เดเดฑเตเดฑเดตเตเด‚ เดฒเดณเดฟเดคเดฎเดพเดฏ uWSGI เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดŽเตปเดตเดฏเต‹เตบ, เดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเต_เดฑเต†เดธเตโ€Œเดชเต‹เตบเดธเต เดŽเดจเตเดจเต€ เดฐเดฃเตเดŸเต เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เดณเตเดณเตเดณ เด’เดฐเต เดซเด‚เด—เตโ€Œเดทเตป เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเต.

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•