Wand将pdf转换为jpg并将页面存储在类文件对象中

时间:2013-09-16 05:48:24

标签: python django pdf imagemagick wand

我正在尝试使用wand将pdf转换为jpegs,但是当我在image.sequence中迭代SingleImages并分别保存每个图像时。我使用Django在AWS上保存每个图像,包括数据库引用。

image_pdf = Image(blob=pdf_blob)
image_jpeg = image_pdf.convert('jpeg')
for img in image_jpeg.sequence:
    memory_file = SimpleUploadedFile(
        "{}.jpeg".format(img.page_number),
        page.container.make_blob())
    spam = Spam.objects.create(
        page_image=memory_file,
        caption="Spam")

这不起作用,page.container正在调用父Image类,并且第一页被反复写入。如何获取第二帧/页面进行保存?

2 个答案:

答案 0 :(得分:5)

实际上,你可以获得每个文件的blob:

for img in image_jpeg.sequence:
    img_page = Image(image=img)

然后你可以使用每个img_page变量,就像一个完整的图像:更改格式,调整大小,保存等。

答案 1 :(得分:1)

似乎你不能在不弄乱c_types的情况下获得每个文件blob。所以这是我的解决方案

from path import path  # wrapper for os.path
import re
import tempfile

image_pdf = Image(blob=pdf_blob)
image_jpeg = image_pdf.convert('jpeg')
temp_dir = path(tempfile.mkdtemp())
# set base file name (join)
image_jpeg.save(temp_dir / 'pdf_title.jpeg')
images = temp_dir.files()

sorted_images = sorted(
    images,
    key=lambda img_path: int(re.search(r'\d+', img_path.name).group())
)
for img in sorted_images:
    with open(img, 'rb') as img_fd:
        memory_file = SimpleUploadedFile(
            img.name,
            img_fd.read()
        )
        spam = Spam.objects.create(
            page_image=memory_file,
            caption="Spam Spam",
        )
tempfile.rmtree(tempdir)

不像在内存中那样干净,但它完成了它。