我想使用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
现在问题是如何将这些页面连接在一起。
答案 0 :(得分:8)
通过计算序列的长度,@ 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页。
答案 1 :(得分:8)
我的解决方案:
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文件,它看起来更灵活。
答案 2 :(得分: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)