2014-05-17 35 views
0

我想使用imagemagick魔杖包将PDF文件的所有页面转换为单个图像文件。我虽然具有下列麻烦(见下面的注释其中的突出问题)imagemagick魔杖保存pdf页面作为图像

import tempfile 
from wand.image import Image 


with file('my_pdf_with_5_pages.png') as f: 
    image = Image(file=f, format='png') 
    save_using_filename(image) 
    save_using_file(image) 

def save_using_filename(image): 
    with tempfile.NamedTemporaryFile() as temp: 
     # this saves all pages, but a file for each page (so 3 files) 
     image.save(filename=temp.name) 

def save_using_file(image): 
    with tempfile.NamedTemporaryFile() as temp: 
     # this only saves the first page as an image 
     image.save(file=temp) 

我的最终目标是要能够指定哪些网页将被转换成一个连续的图像。这是从命令行有点可能

convert -append input.pdf[0-4] 

但我想与python一起工作。

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

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

现在它的如何将这些网页连接起来的问题。

回答

4

@ 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页。

+0

谢谢@Steve。运行代码一个小时左右后,我注意到内存泄漏。你可以把你的代码放在一个循环中,并在发生内存泄漏时回报。会很高兴知道:) – rikAtee

1

注:这会导致内存泄露

我找到了一种方法。有可能是更好的方法,但它的工作原理。

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) 
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文件。