У меня есть следующий код, который перебирает все изображения с любым расширением в нескольких папках, а затем конвертирует эти изображения в pdf. Я застрял на последней строке сохранения файла pdf
from PIL import Image
import os
path = 'MAIN'
ext = ['.jpg', '.jpeg', '.png', '.bmp', '.tif', '.tiff']
for root, dirs, files in os.walk(path):
for file in files:
if (file.endswith(tuple(ext))):
sFilePath = os.path.join(root,file)
print(sFilePath.split('.')[0])
img = Image.open(sFilePath)
img = img.convert('RGB')
img.save(os.path.join(sFilePath.split('.')[0], '.pdf'))
Еще один момент, который мне нужно добавить, это удаление файла изображения после его преобразования в pdf.
@martineau, что касается вашего замечательного решения, которое вы предоставили, я попытался изменить способ преобразования изображения в pdf с помощью img2pdf. вот моя попытка
import img2pdf
with open(path_object.parent / (path_object.stem + '.pdf'), 'wb') as f:
f.write(img2pdf.convert(str(path_object)))
с изображениями с альфа-каналом я получил это сообщение
Image contains an alpha channel which will be stored as a separate soft mask (/SMask) image in PDF.
Это снимок сообщения об ошибке, связанного с изображениями с альфа-каналом.
Вы можете сделать это, используя функцию os.path.splitext()
, чтобы получить базовую часть имени файла изображения, а затем объединить это и расширение .pdf
, которое вы хотите использовать, используя os.path.join()
. (Обратите внимание, что преобразование его в RGB
равно нет, как и преобразование в формат PDF.)
from PIL import Image
import os
path = './'
ext = ['.jpg', '.jpeg', '.png', '.bmp', '.tif', '.tiff']
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(tuple(ext)):
src_image_path = os.path.join(root, file)
base_name = os.path.splitext(file)[0]
img = Image.open(src_image_path)
img = img.convert('RGB')
img.save(os.path.join(root, base_name+'.pdf'))
Еще один способ сделать что-то, использующий модуль pathlib
, который позволяет рассматривать пути к файлам и папкам как объекты и управлять ими с помощью парадигма объектно-ориентированного программирования или модели, что часто приводит к очень лаконичному коду:
from pathlib import Path
from PIL import Image
path = Path('./images')
exts = {'.jpg', '.jpeg', '.png', '.bmp', '.tif', '.tiff'}
for path_object in path.glob('**/*'):
if path_object.is_file() and path_object.suffix in exts:
img = Image.open(path_object)
img = img.convert('RGB')
img.save(path_object.parent / (path_object.stem+'.pdf'))
Что касается этого кода, имя pdf имеет расширение изображения. Как я могу получить только имя стебля? Я мог бы решить это, заменив path_object.name
на path_object.stem
path_object.stem
кажется, работает правильно — см. обновленный ответ. Преобразование изображений в RGB
должно избавиться от любого альфа-канала, который у них мог быть, но, не видя точного сообщения об ошибке, которое вы получаете, я не могу помочь по этой несвязанной проблеме.
Я обновил вопрос, чтобы показать вам проблему использования другого пакета img2pdf.
Не берите в голову. Я мог бы решить эту проблему, преобразовав объект в строку f.write(img2pdf.convert(str(path_object)))
Хотя некоторые, если не все, стандартные библиотеки Python были изменены, чтобы принимать в качестве аргументов либо строки, либо объекты пути pathlib
, многие сторонние модули по-прежнему этого не делают. Вы должны сообщить о проблеме автору img2pdf
(добавление поддержки тривиально).
Большое спасибо. Вы видели снимок проблемы с альфа-каналом?
Да. Судя по тому, что на скриншоте, не похоже, что изображение .tif было преобразовано в RGB перед тем, как передать его в img2pdf.convert()
(что избавило бы его от любых данных альфа-канала).
Как я могу это исправить? Я пытался в течение нескольких часов, но безуспешно.
Я не знаю. Проблема связана с img2pdf
и в любом случае не имеет прямого отношения к этому вопросу (или, по крайней мере, к коду, который у вас есть — независимо от его названия). Тем не менее, смотрит на меня как img2pdf
поддерживает только монохромные файлы tiff.
Большое тебе спасибо. Я попробовал оба кода, и они очень хороши, но иногда у меня возникали ошибки с изображениями альфа-канала. Как я могу исправить такую проблему?