使用纯Python将docx转换为pdf(在Linux上,不使用libreoffice)

qgzx9mmu  于 2023-05-16  发布在  Python
关注(0)|答案(5)|浏览(490)

我正在处理一个问题,试图开发一个网络应用程序,其中一部分将上传的docx文件转换为pdf文件(经过一些处理)。使用python-docx和其他方法,我不需要安装了word的windows机器,甚至不需要linux上的libreoffice,就可以进行大部分处理(我的web服务器是pythonanywhere - linux,但没有libreoffice,也没有sudoapt 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作为子进程。除了切换到一个更复杂的托管服务器,有什么解决方案吗?

t5zmwmid

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(或者至少对我来说是这样),但它仍然可以工作,并且可以忽略错误消息。

jw5wzhpr

jw5wzhpr2#

另一个你可以使用的是libreoffice,但是正如第一个响应者所说,质量永远不会像使用实际的comtypes一样好。
无论如何,在你安装了libreoffice之后,下面是代码。

from subprocess import  Popen
LIBRE_OFFICE = r"C:\Program Files\LibreOffice\program\soffice.exe"

def convert_to_pdf(input_docx, out_folder):
    p = Popen([LIBRE_OFFICE, '--headless', '--convert-to', 'pdf', '--outdir',
               out_folder, input_docx])
    print([LIBRE_OFFICE, '--convert-to', 'pdf', input_docx])
    p.communicate()

sample_doc = 'file.docx'
out_folder = 'some_folder'
convert_to_pdf(sample_doc, out_folder)
x8goxv8g

x8goxv8g3#

下面是Linux下的docx到pdf的代码(对于Windows,只需下载LibreOffice并将soffice路径替换为soffice)

import subprocess

def generate_pdf(doc_path, path):

    subprocess.call(['soffice',
                 # '--headless',
                 '--convert-to',
                 'pdf',
                 '--outdir',
                 path,
                 doc_path])
    return doc_path
generate_pdf("docx_path.docx", "output_path")
gcuhipw9

gcuhipw94#

您可以使用Aspose.Words for Python将DOCX和其他文档格式转换为PDF。代码很简单-加载文档并将其保存为PDF:

import aspose.words as aw

doc = aw.Document("in.docx")
doc.save("out.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

mzillmmw

mzillmmw5#

我在Linux环境中找到了一个最简单的方法来做到这一点。
导入操作系统
os.system(“lowriter --convert-to pdf”+str(““)+ str(file_path))

相关问题