Преобразование docx в pdf с помощью чистого python (в linux, без libreoffice)

Я имею дело с проблемой, пытаясь разработать веб-приложение, часть которого преобразует загруженные файлы docx в pdf-файлы (после некоторой обработки). С python-docx и другие методы, мне не требуется машина windows с установленным word или даже libreoffice на linux для большей части обработки (мой веб-сервер pythonanywhere-linux, но без libreoffice и без sudo или apt install разрешения). Но преобразование в pdf, похоже, требует одного из них. От изучения вопросов здесь и в другом месте, это то, что я до сих пор:

import subprocess

try:
    from comtypes import client
except ImportError:
    client = None

def doc2pdf(doc):
    """
    convert a doc/docx document to pdf format
    :param doc: path to document
    """
    doc = os.path.abspath(doc) # bugfix - searching files in windows/system32
    if client is None:
        return doc2pdf_linux(doc)
    name, ext = os.path.splitext(doc)
    try:
        word = client.CreateObject('Word.Application')
        worddoc = word.Documents.Open(doc)
        worddoc.SaveAs(name + '.pdf', FileFormat=17)
    except Exception:
        raise
    finally:
        worddoc.Close()
        word.Quit()


def doc2pdf_linux(doc):
    """
    convert a doc/docx document to pdf format (linux only, requires libreoffice)
    :param doc: path to document
    """
    cmd = 'libreoffice --convert-to pdf'.split() + [doc]
    p = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    p.wait(timeout=10)
    stdout, stderr = p.communicate()
    if stderr:
        raise subprocess.SubprocessError(stderr)

как вы можете видеть, один способ требует comtypes, еще требует libreoffice как подпроцесс. Помимо перехода на более сложный хостинг-сервер, есть ли какое-либо решение?

1 ответов


страницы справки PythonAnywhere предлагают информацию о работе с PDF-файлами здесь:https://help.pythonanywhere.com/pages/PDF

сводка: PythonAnywhere имеет ряд пакетов Python для манипуляции PDF, и один из них может делать то, что вы хотите. Тем не менее, обстрел abiword Мне кажется, проще всего. Команда оболочки abiword --to=pdf filetoconvert.docx преобразует файл docx в PDF и создаст файл с именем filetoconvert.pdf в том же каталоге, что и docx. Обратите внимание, что это команда выведет сообщение об ошибке в стандартный поток ошибок, жалующийся на XDG_RUNTIME_DIR (или, по крайней мере, для меня), но он все еще работает, и сообщение об ошибке можно игнорировать.