Как обрабатывать многостраничные изображения в 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")

Но я конвертирую в png только 1 страницу. Конечно, я мог бы загружать каждую страницу по отдельности и конвертировать их одну за другой. Но должен же быть способ сделать их все сразу?


person Tickon    schedule 07.05.2012    source источник
comment
Вы нашли какое-либо решение для файла mul pages pdf?   -  person Aragon    schedule 10.07.2012
comment
Нашли ли вы какие-либо решения. У меня такая же проблема.   -  person stormlifter    schedule 02.08.2012


Ответы (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')
person Tickon    schedule 02.08.2012

Более полный пример, основанный на ответе Иво Флипса и 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')
person Daniël van Eeden    schedule 30.05.2014

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

import subprocess
params = ['convert', 'src.pdf', 'out.png']
subprocess.check_call(params)
person Rakesh    schedule 01.08.2012