【问题标题】:An efficient way to convert document to pdf format将文档转换为 pdf 格式的有效方法
【发布时间】:2014-01-20 10:08:42
【问题描述】:

我一直在尝试找到转换文档的有效方法,例如doc、docx、ppt、pptx转pdf。到目前为止,我已经尝试过 docsplitoowriter,但两者都花费了超过 10 秒的时间来完成 pptx file 大小为 1.7MB 的工作。任何人都可以建议我更好的方法或建议来改进我的方法吗?

我尝试过的:

from subprocess import Popen, PIPE
import time

def convert(src, dst):
    d = {'src': src, 'dst': dst}
    commands = [
        '/usr/bin/docsplit pdf --output %(dst)s %(src)s' % d,
        'oowriter --headless -convert-to pdf:writer_pdf_Export %(dst)s %(src)s' % d,
    ]

    for i in range(len(commands)):
        command = commands[i]
        st = time.time()
        process = Popen(command, stdout=PIPE, stderr=PIPE, shell=True) # I am aware of consequences of using `shell=True` 
        out, err = process.communicate()
        errcode = process.returncode
        if errcode != 0:
            raise Exception(err)
        en = time.time() - st
        print 'Command %s: Completed in %s seconds' % (str(i+1), str(round(en, 2)))

if __name__ == '__main__':
    src = '/path/to/source/file/'
    dst = '/path/to/destination/folder/'
    convert(src, dst)

输出:

Command 1: Completed in 11.91 seconds
Command 2: Completed in 11.55 seconds

环境:

  • Linux - Ubuntu 12.04
  • Python 2.7.3

更多工具结果:

【问题讨论】:

  • 请注意,这不是一个真正的基准。单一的结果没有意义。结果应计算为多次试验的平均值,并且至少应显示标准偏差。
  • @BartoszKP 感谢您的澄清。我选错词了。
  • 好吧,既然您对效率感兴趣,那么“基准”是正确的词,因为这是衡量效率的工具。所以你的代码是错误的,而不是文字:)
  • Microsoft 和 PDF 格式都非常复杂。 11 秒可能并不过分。
  • 如果您在 shell 中而不是在 Python 中运行这些命令,会有什么不同吗?也就是说,如果你在没有 Python 的情况下运行 /usr/bin/docsplit pdf --output dst src

标签: python pdf ubuntu document-conversion docsplit


【解决方案1】:

尝试从您的 Python 代码中调用 unoconv,在我的本地机器上花了 8 秒,我不知道它是否足够快:

time unoconv 15.\ Text-Files.pptx
real    0m8.604s

【讨论】:

  • Python Uno 是从各种 MS Office 文档类型中获得体面的 pdf 输出的最可靠方法。它使用 (Star|Libre|Open)office 后端来转换文档。原则上,您可以做的不仅仅是转换文档。您也可以合并基本 例程。我仍然会非常小心地使用 Uno。众所周知,办公软件会占用大量内存。请浏览wiki.openoffice.org/wiki/PyUNO_bridge
  • 感谢您的回答,我会尽力让您知道:)
  • 仍然希望它更快:P 但我认为这是迄今为止最好的时间。谢谢
【解决方案2】:

Pandoc 是一款出色的工具,能够快速完成您想做的事情。由于您使用 Popen 来有效地为该工具执行命令,因此该工具是用什么语言编写的(Pandoc 是用 Haskell 编写的)并不重要。

【讨论】:

  • 感谢您的回答,我会尽力让您知道:)
  • 添加 pypi.org/project/pypandoc 以供仍然希望这样做的人使用。它消除了使用 Popen 来输出命令的需要。
【解决方案3】:

很遗憾,我没有时间进行完整的基准测试,但您可能想查看 xtopdf,这是我用于创建 PDF 的 Python 工具包。它不能进行您想要的全部转换,并且某些转换有限制,但它可能有用。 xtopdf 链接:

关于 xtopdf 的在线演示 - 很好地总结了它是什么、它的作用、平台、功能、用户、用途等:http://slid.es/vasudevram/xtopdf

Bitbucket 上的 xtopdf:https://bitbucket.org/vasudevram/xtopdf

许多博客文章展示了如何将 xtopdf 用于各种目的,包括许多展示如何使用它将不同的输入格式转换为 PDF 的博客文章:http://jugad2.blogspot.com/search/label/xtopdf

HTH, 瓦苏德夫拉姆

【讨论】:

  • xtopdf 上的 DOCX 转换似乎只提取文本并去除格式。用处不大。
  • @fatuhoku:是的,它就是这样做的。这就是“某些转换有限制”所暗示的 - 如果您阅读了我的评论,应该会有些明显。我依赖库进行大多数输入格式转换,所以如果它们有限制,xtopdf 在这些情况下也是如此。直截了当。此外,并非所有内容都必须“非常有用”。对于很多用例来说,“有用”就足够了——甚至可以通过自定义代码或手动进行一些调整。现实生活中经常发生。
  • 嘿@Vasudev 并不是要放弃你的项目。确实,我没有阅读您的全部答案。编辑我的评论为时已晚。像xtopdf 这样的名字,说它“不进行全方位的转换”实际上是轻描淡写,这促使我对后代发表评论。
  • 不,这不是轻描淡写,因为名称中的 x 代表“求解 x”——这意味着,就像涉及 x 的数学方程一样,对于 x 的某些值可能没有解,或者可能有,但还没有找到——或者还没有工作:)另外,你承认你没有阅读我的全部答案;现在您正在将主题从引用的短语之一更改为中游的另一个。
  • 另外,您引用的两个短语(来自我的回答)出现在我回答的第二句话中(不是很久以后的某个地方)。因此,您不仅没有阅读我的全部答案,而且在评论之前甚至没有阅读第二句话。我什至说“它可能有用”——而不是“将有用”或“非常有用”。所以你在没有做功课的情况下过于挑剔——这在互联网上很常见。
【解决方案4】:

对于 doc 和 docx(但不是 ppt/pptx),您可以在 OnlineDemo/docx_to_pdf 在线试用我们独立(但商业)的高保真渲染引擎

我所说的“高保真度”是指它从一开始就被设计为具有与 Microsoft Word 相同的换行符和分段符、制表位等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多