Python Подушка изображения в PDF, а затем проблемы с памятью - PullRequest
0 голосов
/ 16 января 2020

Цель: преобразовать конечное число файлов в формат .jpg и объединить их в один файл PDF.

Ожидаемый результат: файлы из папки успешно преобразованы и объединены в один файл PDF в указанном месте.

Проблема: когда размер файлов превышает определенное число, в моих тестах оно составляло около 400 МБ, программа вылетает со следующим сообщением:



Traceback (most recent call last):
  File "C:\Users\kaczk\AppData\Local\Programs\Python\Python38-32\lib\site-packages\PIL\ImageFile.py", line 498, in _save
    fh = fp.fileno()
io.UnsupportedOperation: fileno

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "MakePDF.py", line 10, in <module>
    im1.save(pdf1_filename, "PDF" ,resolution=1000.0, save_all=True, append_images=imageList)
  File "C:\Users\kaczk\AppData\Local\Programs\Python\Python38-32\lib\site-packages\PIL\Image.py", line 2084, in save
    save_handler(self, fp, filename)
  File "C:\Users\kaczk\AppData\Local\Programs\Python\Python38-32\lib\site-packages\PIL\PdfImagePlugin.py", line 46, in _save_all
    _save(im, fp, filename, save_all=True)
  File "C:\Users\kaczk\AppData\Local\Programs\Python\Python38-32\lib\site-packages\PIL\PdfImagePlugin.py", line 175, in _save
    Image.SAVE["JPEG"](im, op, filename)
  File "C:\Users\kaczk\AppData\Local\Programs\Python\Python38-32\lib\site-packages\PIL\JpegImagePlugin.py", line 770, in _save
    ImageFile._save(im, fp, [("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize)
  File "C:\Users\kaczk\AppData\Local\Programs\Python\Python38-32\lib\site-packages\PIL\ImageFile.py", line 513, in _save
    fp.write(d)
MemoryError

После запуска программы с диспетчером задач я заметил, что на самом деле компьютер не хватает оперативной памяти при выполнении этой программы. Ниже приведен код, используемый.

import os
from PIL import Image
fileList = os.listdir(r'C:\location\of\photos\folder')
imageList = []
im1 = Image.open(os.path.join(r'C:\location\of\photos\folder',fileList[0]))
for file in fileList[1:]:
   imageList.append(Image.open(os.path.join(r'C:\location\of\photos\folder',file)))
pdf1_filename =  r'C:\location\of\pdf\destination.pdf'
im1.save(pdf1_filename, "PDF" ,resolution=500.0, save_all=True, append_images=imageList)

Есть ли легкая ошибка, которую я здесь делаю в отношении использования памяти? Есть ли другой модуль, который облегчит задачу при работе с большими и большими файлами? Буду очень признателен за любую помощь.

...