cairo html转为pdf,使用pdf2cairo在Python中将PDF转换为PNG

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

我通过调用Imagemagick的convert.exe实现了这一点。它工作得很好,但是它依赖于GhostScript,这是一个大软件包,我希望避免使用它,因为它集成起来比较复杂。

我也尝试了GhostScript的muPDF,但这似乎没有stdin和stdout选项。很遗憾,因为它首先保存了我的文件。使用muPDF打开它,进行转换并保存,然后再次将其重新加载到我的Python应用程序中。无需所有这些步骤就可以实现!

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

它抱怨说,仅当您还使用-singlepage参数时,它才能导出到stdout。如何将所有页面导出到stdout?

当我导出到标准输出时,出现错误:'Error opening output file fd://0.png\r\n

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

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

更新正如您在下面的答案中看到的那样,pdftocairo有问题,当您要使用stdout时无法正常工作。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中的错误。

但是后来,该字符串传递给getImageFilename,后者无条件地向文件名添加了扩展名,因此,以后比较失败,程序不愿fd://0.png使用而不是打开文字文件stdout。

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

至于将多页文档导出到stdout,则完全不支持,并且无论如何都不能与png或jpeg这样的文件类型一起使用,因为这些格式不支持多页文档。它确实工作svg,pdf,eps和ps输出文件,这些格式做支持多页文档(以及这些做正确的文件名的处理。)

站长简介:前每日优鲜python全栈开发工程师,自媒体达人,逗比程序猿,钱少话少特宅,关注我,做朋友, 我们一起谈人生和理想吧!我的公众号:想吃麻辣香锅

关注公众号回复充值+你的账号,免费为您充值1000积分

你可能感兴趣的:(cairo,html转为pdf)