我想将一些多页.tif或.pdf文件转换为单独的.png图像。从命令行(使用ImageMagick)我做:
convert multi_page.pdf file_out.png
我将所有页面都作为单独的图像(file_out-0.png,file_out-1.png,...)
我想在Python中处理这个文件转换,遗憾的是PIL无法读取.pdf文件,所以我想使用PythonMagick。我试过了:
import PythonMagick
im = PythonMagick.Image('multi_page.pdf')
im.write("file_out%d.png")
或只是
im.write("file_out.png")
但我只有1页转换为png。 当然,我可以单独加载每个页面并逐个转换它们。但必须有办法一次完成所有这些操作吗?
答案 0 :(得分:7)
ImageMagick不具有内存效率,因此如果您尝试读取大型pdf(例如100页左右),内存需求将会很大,并且可能会崩溃或严重降低系统速度。因此,毕竟用PythonMagick一次阅读所有页面是一个坏主意,它不安全。 所以对于pdfs,我最终逐页进行,但为此我需要首先使用pyPdf获取页面数量,其速度相当快:
pdf_im = pyPdf.PdfFileReader(file('multi_page.pdf', "rb"))
npage = pdf_im.getNumPages()
for p in npage:
im = PythonMagick.Image('multi_page.pdf['+ str(p) +']')
im.write('file_out-' + str(p)+ '.png')
答案 1 :(得分:1)
基于Ivo Flipse和http://p-s.co.nz/wordpress/pdf-to-png-using-pythonmagick/
的答案的更完整示例这使用更高的分辨率并使用PyPDF2而不是旧的pyPDF。
import sys
import PyPDF2
import PythonMagick
pdffilename = sys.argv[1]
pdf_im = PyPDF2.PdfFileReader(file(pdffilename, "rb"))
npage = pdf_im.getNumPages()
print('Converting %d pages.' % npage)
for p in range(npage):
im = PythonMagick.Image()
im.density('300')
im.read(pdffilename + '[' + str(p) +']')
im.write('file_out-' + str(p)+ '.png')
答案 2 :(得分:0)
我有同样的问题,作为一个解决方法,我使用ImageMagick并做了
import subprocess
params = ['convert', 'src.pdf', 'out.png']
subprocess.check_call(params)