当前位置: 首页 > 知识库问答 >
问题:

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

李景天
2023-03-14

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

共有2个答案

岳城
2023-03-14

另一个你可以使用的是libreoffice,然而,正如第一个响应者所说,质量永远不会像使用实际的格子一样好。

不管怎样,在你安装了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)
范麒
2023-03-14

PythonyWhere帮助页面提供了有关使用PDF文件的信息,请参见:https://help.pythonanywhere.com/pages/PDF

摘要:PythonyWhere安装了许多用于PDF操作的Python包,其中一个包可以执行您想要的操作。然而,对我来说,向abiword开火似乎是最容易的。shell命令abiword--to=pdf filetoconvert.docx将docx文件转换为pdf文件,并在与docx相同的目录中生成名为filetoconvert.pdf的文件。请注意,此命令将向标准错误流输出一条错误消息,抱怨XDG\u RUNTIME\u DIR(至少对我来说是这样),但它仍然有效,并且可以忽略错误消息。

 类似资料:
  • 我正在努力寻找用Python将PDF文件转换为.docx文件的方法。 我见过其他与此相关的帖子,但在我的情况下,它们似乎都不正常。 我特别使用 这给了我输出[1],但在我的文件夹中找不到任何.docx文档。 我已经安装了LibreOffice 5.3。 有什么线索吗? 提前谢谢你!

  • 我花了大量的时间试图确定到底出了什么问题,使用LibreOffice将pdf转换为docx(以及doc转换为docx)的代码。 我使用了两个windows run接口来测试运行一些我发现相关的代码,也尝试了python,但两者都不起作用。 我在Windows上安装了LibreOffice v6.0.2。 我一直在使用此代码的变体尝试将某些pdf文件转换为与特定pdf文件不相关的docx: 我已经在

  • 我正在使用一个带有python函数的env将docx转换为pdf文件。我在用邮递员寄base64。然后我挂载docx文件(一切都正常),但是当它将docx文件转换为pdf时,会出现一个错误。我想那是因为我的环境里没有办公室?没有办公室我怎么能修好它?谢谢 系统。私人。CoreLib:执行函数时的异常:函数。FunConzer.系统。私人。CoreLib:结果:失败异常:属性错误:模块'comtyp

  • 我正试图用Docx4J将一个DOCX文件转换为PDF,并收到两个不同文档的两个不同的异常。 1)对于文档1,第一个文档的org.docx4j.utils.singletRaversAlutilVisitorCallback.apply(SingletRaversAlutilVisitorCallback.java:27)中出现一个NullPointerException。 下面包含的代码是否是在P

  • 问题内容: 如何使用Python将PDF文件转换为HTML? 我只是在想Google会(或似乎会)对PDF文件建立索引的行为。 我的最终目标是设置Apache以显示PDF文件的HTML,因此,向该方向发展的任何事情也将不胜感激。 问题答案: 该poppler的包提供了一个实用PDF2HTML您可能能够使用。还有一个Python绑定到libpoppler。

  • 我需要使用python将.doc和.docx文件转换为.pdf。我已经看到了一些可用的答案,但它们使用的是comtypes和OpenWordApplication。我不能那样做。我寻求的是一种使用一些python库的方法,这些库保留字体、表格、标题大小和图像等,而不打开MS Word或LibreOffice或类似的东西,如果需要的话,将.doc和.docx文件转换为某种中间格式(然后将该格式转换为