Python imagemagick wand将pdf页面另存为图像

Python imagemagick wand将pdf页面另存为图像,python,pdf,imagemagick,imagemagick-convert,wand,Python,Pdf,Imagemagick,Imagemagick Convert,Wand,我想使用imagemagick Wand软件包将pdf文件的所有页面转换为单个图像文件。但我遇到了以下问题(请参阅下面突出问题的注释) 我的最终目标是能够指定哪些页面要转换为一个连续的图像。这可以通过命令行执行,只需执行一点 convert -append input.pdf[0-4] 但我正在尝试使用python 我看到我们可以通过这样做得到切片: [x for x in w.sequence[0:1]] # get page 1 and 2 现在的问题是如何将这些页面连接在一起。注意:这

我想使用imagemagick Wand软件包将pdf文件的所有页面转换为单个图像文件。但我遇到了以下问题(请参阅下面突出问题的注释)

我的最终目标是能够指定哪些页面要转换为一个连续的图像。这可以通过命令行执行,只需执行一点

convert -append input.pdf[0-4]
但我正在尝试使用python

我看到我们可以通过这样做得到切片:

[x for x in w.sequence[0:1]] # get page 1 and 2

现在的问题是如何将这些页面连接在一起。

注意:这会导致内存泄漏

我找到了一条路。也许有更好的方法,但它是有效的

class Preview(object):
    def __init__(self, file):
        self.image = Image(file=file)

    def join_pages(self, page_count):
        canvas = self.create_canvas(page_count=page_count)
        for page_number in xrange(page_count):
            canvas.composite(
                self.image.sequence[page_number],
                top=self.image.height*page_number,
                left=0,
            )

    def create_canvas(self, page_count):
        return Image(
            width=self.pdf.width,
            height=self.image.height*page_count,
        )

    preview = Preview(open('path/to/pdf')
    preview.join_pages(3)

对@rikAtee的回答进行了略微简化/增加了通过计算序列长度自动检测页数的功能:

def convert_pdf_to_png(blob):
    pdf = Image(blob=blob)

    pages = len(pdf.sequence)

    image = Image(
        width=pdf.width,
        height=pdf.height * pages
    )

    for i in xrange(pages):
        image.composite(
            pdf.sequence[i],
            top=pdf.height * i,
            left=0
        )

    return image.make_blob('png')
我没有注意到任何内存链接问题,尽管我的PDF通常只有2或3页。

我的解决方案:

from wand.image import Image

diag='yourpdf.pdf'

with(Image(filename=diag,resolution=200)) as source:
    images=source.sequence
    pages=len(images)
    for i in range(pages):
        Image(images[i]).save(filename=str(i)+'.png')

它可以工作,与其他答案相比,对于不同页面中大小可变的一些多页pdf文件,它似乎更灵活

谢谢@Steve。在运行代码大约一个小时后,我注意到内存泄漏。你能把你的代码放在一个循环中,并在内存泄漏发生时报告回来吗。最好知道:)
Image()
应该用在
with
语句中:
with Image(blob=blob)作为pdf:
。文档中对此进行了描述:。
from wand.image import Image

diag='yourpdf.pdf'

with(Image(filename=diag,resolution=200)) as source:
    images=source.sequence
    pages=len(images)
    for i in range(pages):
        Image(images[i]).save(filename=str(i)+'.png')