【发布时间】:2018-12-01 14:02:14
【问题描述】:
我正在处理一个尝试开发网络应用程序的问题,其中一部分将上传的 docx 文件转换为 pdf 文件(经过一些处理)。使用python-docx 和其他方法,我不需要安装word 的windows 机器,甚至不需要Linux 上的libreoffice,进行大部分处理(我的网络服务器是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 作为子进程。除了切换到更复杂的托管服务器之外,还有什么解决方案吗?
【问题讨论】:
-
Python-docx 不需要 Word(也不需要 Windows),因为它几乎可以在其源代码中完成所有工作。 (“几乎全部”,除了一些外部标准模块,例如 XML、ZIP 内容和图像处理。)由于 Python 是图灵完备的语言,您可以做同样的事情来无中生有地创建 PDF,无需外部软件.从前到后阅读the official specifications,您就会知道为什么使用外部程序要容易得多。
-
@usr2564301 当然更简单,但如果不切换服务器,这对我来说不是一个选择
-
然后找到一个用于创建 PDF 的纯 Python 实现(推荐一个是违反 Stack Overflow 准则的,但您当然可以使用搜索引擎并找到一个适合您的目的和编程水平的),或者滚动您的自己的。但请注意,“每个人”都在使用外部实用程序是有充分理由的——阅读上述规范以了解原因。
-
为什么不使用通过 python 触发的 api,例如convertapi.com/docx-to-pdf ?还要检查这个问题stackoverflow.com/questions/3815983/…
-
改用
pandoc。
标签: python pdf docx pythonanywhere python-docx