簡體   English   中英

imagemagick魔杖將pdf頁面保存為圖像

[英]imagemagick wand save pdf pages as images

我想使用imagemagick Wand包將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

現在是一個如何將這些頁面連接在一起的問題。

稍微簡化@ 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文件,它看起來更靈活。

注意:這會導致內存泄漏

我找到了一個方法。 可能有更好的方法,但它有效。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM