Преобразование 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
(или, по крайней мере, для меня), но он все еще работает, и сообщение об ошибке можно игнорировать.