我正在处理一个问题,试图开发一个网络应用程序,其中一部分将上传的docx文件转换为pdf文件(经过一些处理)。使用python-docx
和其他方法,我不需要安装了word的windows机器,甚至不需要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
作为子进程。除了切换到一个更复杂的托管服务器,有什么解决方案吗?
5条答案
按热度按时间t5zmwmid1#
PythonAnywhere帮助页面在此处提供了有关使用PDF文件的信息:https://help.pythonanywhere.com/pages/PDF
摘要:PythonAnywhere安装了许多用于PDF操作的Python包,其中一个可以执行您想要的操作。但是,对我来说,向
abiword
脱壳似乎最容易。shell命令abiword --to=pdf filetoconvert.docx
将把docx文件转换为PDF,并在docx所在的目录下生成一个名为filetoconvert.pdf
的文件。请注意,这个命令将向标准错误流输出一条错误消息,抱怨XDG_RUNTIME_DIR
(或者至少对我来说是这样),但它仍然可以工作,并且可以忽略错误消息。jw5wzhpr2#
另一个你可以使用的是libreoffice,但是正如第一个响应者所说,质量永远不会像使用实际的comtypes一样好。
无论如何,在你安装了libreoffice之后,下面是代码。
x8goxv8g3#
下面是Linux下的docx到pdf的代码(对于Windows,只需下载LibreOffice并将soffice路径替换为soffice)
gcuhipw94#
您可以使用Aspose.Words for Python将DOCX和其他文档格式转换为PDF。代码很简单-加载文档并将其保存为PDF:
可以使用PdfSaveOptions指定其他转换选项,例如PDF合规性:https://docs.aspose.com/words/python-net/convert-a-document-to-pdf/尽管Aspose有额外的要求。Linux下的Python词汇:https://docs.aspose.com/words/python-net/system-requirements/#system-requirements-for-target-linux-platform
mzillmmw5#
我在Linux环境中找到了一个最简单的方法来做到这一点。
导入操作系统
os.system(“lowriter --convert-to pdf”+str(““)+ str(file_path))