1

我一直在寻找一个好的 PDF 2 图像转换器。我需要将 PDF 转换为图像才能使用 Qt 进行打印。我在 Python/Pyside 编程,所以如果我可以使用子进程将 PDF 转换为一系列(PNG)图像,我可以毫无问题地打印它们。

我通过从 Imagemagick 调用 convert.exe 实现了这一点。它工作得很好,但它依赖于 GhostScript,这是一个我想避免的大包,因为它的集成更复杂。

我还尝试了 GhostScript 中的 muPDF,但这似乎没有标准输入和标准输出选项。很遗憾,因为它首先保存了我的文件。用 muPDF 打开它,转换并保存它,然后在我的 Python 应用程序中重新加载它。没有所有这些步骤应该是可能的!

今天我开始尝试使用 Poppler 的 pdf2cairo。我认为它会以这种方式将我的(多页)PDF 转换为一系列图像并将其通过管道传输到标准输出。不幸的是,它没有,我遇到了两个问题:

  • 它抱怨说,当您还使用 -singlepage 参数时,它只能导出到标准输出。如何将所有页面导出到标准输出?
  • 当我导出到标准输出时,我收到错误:'Error opening output file fd://0.png\r\n

将 pdf 从标准输入转换为图像文件完全没有问题。

这是我的代码,它也会触发有关打开输出文件的错误:

import subprocess

pdf = open('test.pdf')
p = subprocess.Popen(['pop/pdftocairo.exe', '-singlefile', '-png', '-', '-'],stdin = pdf, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
print(p.stderr.read())
print(p.stdout.read())

我已经下载了预编译的 PDF2Cairo:http ://blog.alivate.com.au/poppler-windows/ pdf2cairo 的命令行选项的文档可以在这里找到:http: //manpages.ubuntu.com/手册页/精确/man1/pdftocairo.1.html

希望你能帮助我完成这项工作!

更新 正如您在下面的答案中看到的那样,pdftocairo 有问题,并且在您想使用标准输出时无法正常工作。pdftoppm 确实有效,它返回的是 PDF 文件的字节对象:

pdf = open('test.pdf')
p = subprocess.Popen(['pop/pdftoppm.exe',  '-png'],stdin = pdf, stdout = subprocess.PIPE,   stderr = subprocess.PIPE)
data, error = p.communicate()

我唯一需要做的就是将字节对象拆分为多个文件。

4

2 回答 2

2

这是 pdftocairo 中的一个错误。

输出文件名首先传递给getOutputFilename,它返回特殊字符串fd://0作为stdout.

但是后来该字符串被传递给getImageFilename,它无条件地为文件名添加扩展名,因此后来比较失败并且程序厌倦了打开文字文件fd://0.png而不是使用stdout.

不幸的是,您唯一能做的就是提交错误报告

至于将多页文档导出到stdout,根本不支持,并且无论如何它都不适用于 png 或 jpeg 等文件类型,因为这些格式不支持多页文档。它确实适用于svgpdf和输出文件,因为这些格式确实支持多页文档(eps并且ps为这些文件正确处理了文件名。)

于 2013-06-21T11:22:11.207 回答
0

我认为只使用 os.system 并传递整个命令字符串会更容易。这假设有“pdfs”和“imgs”文件夹;相应地改变。

import os
import glob

for pdf_file in glob.glob("pdfs\*.pdf"):
    cmd_str = "pdftocairo.exe -jpeg \"%s\" \"%s\"" % (pdf_file, os.path.join("imgs", os.path.splitext(os.path.split(pdf_file)[1])[0]))
    print cmd_str
    os.system(cmd_str)
于 2013-06-21T11:23:38.373 回答