Wand конвертировать PDF в JPEG и хранить страницы в файловых объектах

Я пытаюсь преобразовать PDF в JPEG с помощью палочки, но когда я перебираю SingleImages в image.sequence и сохраняю каждое изображение отдельно. Я сохраняю каждое изображение в AWS со ссылками на базу данных, используя Django.

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 ответа

Решение

Кажется, вы не можете получить файловые блобы, не связавшись с c_types. Так что это мое решение

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)

Не так чисто, как делать все это в памяти, но это делается.

На самом деле, вы можете получить блоб для каждого файла:

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

Затем вы можете работать с каждой переменной img_page как с полноценным изображением: изменить формат, изменить размер, сохранить и т. Д.

Другие вопросы по тегам