2014-05-17 33 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文件。