我正在开发一个 Web 应用程序,其中一部分将上传的 docx 文件转换为 PDF 文件(经过一些处理后)。使用 python-docx
等方法,大多数处理都不需要 Windows 机器上安装 Word,甚至不需要在 Linux 上安装 LibreOffice (我的 Web 服务器是 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
作为子进程。除了切换到更复杂的托管服务器外,是否有其他解决方案?
pandoc
。 - pylang