Использование Pillow и img2pdf для конвертации изображений в pdf - PullRequest
1 голос
/ 19 октября 2019

У меня есть задача, которая требует от меня получения данных из загрузки изображений (jpg или png), изменения их размера в соответствии с требованиями, а затем преобразования их в pdf и последующего сохранения в s3.

  1. Файл приходит как ByteIO
  2. У меня есть Pillow, поэтому я могу изменить размер изображения с ним
  3. Теперь тип файла class 'PIL.Image.Image', и я не знаю, как продолжить.
  4. Я нашел библиотеку img2pdf в https://gitlab.mister -muffin.de / josch / img2pdf , но я не знаю, как использовать ее, когда у меня есть формат PIL (используйте tobytes()?)
  5. Загрузка s3 также выглядит как файлоподобный объект, поэтому я не хочу сохранять его во временном файле перед его повторной загрузкой. Мне даже тогда нужен img2pdf в этом случае?

Как мне достичь этой цели?

РЕДАКТИРОВАТЬ: я пытался использовать tobytes() и напрямую загружать в s3. Загрузка прошла успешно. Тем не менее, при загрузке, чтобы увидеть содержимое, он показывает пустую страницу. Кажется, что данные файла не записываются в файл PDF

РЕДАКТИРОВАТЬ 2: На самом деле пошел на s3 и проверить сохраненный файл. Когда я загружаю его и открываю, он показывает cannot be opened

РЕДАКТИРОВАТЬ 3: у меня действительно нет рабочего кода, поскольку я все еще экспериментирую, что может работать, но вот суть

data = request.FILES['file'].file  # where the data is
im = Image.open(data)
(width, height) = (im.width // 2, im.height // 2)  # example action I wanna take with Pillow
data = im_resized.tobytes()
# potential step for using img2pdf here but I don't know how
# img2pdf.convert(data)  # this fails because "ImageOpenError: cannot read input image (not jpeg2000). PIL: error reading image: cannot identify image file <_io.BytesIO..."
# img2pdf.convert(im_resized)  # this also fails because "TypeError: Neither implements read() nor is str or bytes"
upload_to_s3(data)  # some function that utilizes boto3 to upload to s3
...