Как обрабатывать многостраничные изображения в PythonMagick?

Я хочу преобразовать несколько многостраничных файлов.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. Конечно, я мог загружать каждую страницу отдельно и конвертировать их одну за другой. Но должен быть способ сделать их всех сразу?

3 ответа

Решение

ImageMagick неэффективно использует память, поэтому, если вы попытаетесь прочитать большой PDF-файл, например, около 100 страниц, требования к памяти будут огромными и могут привести к сбою или серьезному замедлению работы вашей системы. Так что чтение всех страниц одновременно с PythonMagick - плохая идея, и это небезопасно. Так что для PDF я сделал это постранично, но для этого мне нужно сначала получить количество страниц, используя 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')

Более полный пример основан на ответе 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')

У меня была та же проблема, и как обходной путь, я использовал ImageMagick и сделал

import subprocess
params = ['convert', 'src.pdf', 'out.png']
subprocess.check_call(params)
Другие вопросы по тегам