PDF to PNG in Python with pdf2cairo



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

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

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

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

  • 它抱怨说,当你也使用-singlepage参数时,它只能导出到标准输出。如何将所有页面导出为标准输出?
  • 当我导出到标准输出时,我得到错误:'Error opening output file fd://0.pngrn

将pdf从stdin文件转换为图像文件是没有问题的。

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

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())

我从:http://blog.alivate.com.au/poppler-windows/下载了预编译的PDF2Cairopdf2cairo的命令行选项的文档可以在这里找到:http://manpages.ubuntu.com/manpages/precise/man1/pdftocairo.1.html

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

正如您在下面的答案中看到的,pdftocairo有bug,当您想要使用标准输出时不能正常工作。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()

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

这是pdftocairo中的一个bug。

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

但是后来该字符串被传递给getImageFilename,它无条件地向文件名添加扩展名,以便稍后比较失败,程序尝试打开文字文件fd://0.png而不是使用stdout

不幸的是,你唯一能做的就是提交一个bug报告。

至于将多页文档导出到stdout,这根本不受支持,而且它也不能与png或jpeg这样的文件类型一起工作,因为这些格式不支持多页文档。它确实适用于svg, pdf, epsps输出文件,因为这些格式确实支持多页文档(并且文件名的处理正确地完成了这些)

我认为直接使用os会更容易。系统并传递整个命令字符串。这假设有"pdf"one_answers"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)

相关内容

  • 没有找到相关文章