热门标签:
Q:

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

我正在处理一个试图开发一个web-app的问题,其中一部分将上传的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作为子进程。 除了切换到更复杂的托管服务器之外,还有什么解决方案吗?

原网址
A:

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的标准错误流输出错误消息(或者至少它为我做了),但它仍然有效,并且可以忽略错误消息。

所有回答

共 3 条

author avatar

您可以使用的另一个是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)
author avatar

这里是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")
author avatar

我在Linux Env中找到了一个最简单的方法来做到这一点。..

导入操作系统

操作系统。system("lowriter--convert-to pdf"+str("")+str(file_path))

相似问题