Не удалось преобразовать изображение в pdf из-за неизвестного расширения файла

У меня есть следующий код, который перебирает все изображения с любым расширением в нескольких папках, а затем конвертирует эти изображения в 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.

Это снимок сообщения об ошибке, связанного с изображениями с альфа-каналом. Не удалось преобразовать изображение в pdf из-за неизвестного расширения файла

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сделать это, используя функцию 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'))

Большое тебе спасибо. Я попробовал оба кода, и они очень хороши, но иногда у меня возникали ошибки с изображениями альфа-канала. Как я могу исправить такую ​​проблему?

YasserKhalil 21.03.2022 17:59

Что касается этого кода, имя pdf имеет расширение изображения. Как я могу получить только имя стебля? Я мог бы решить это, заменив path_object.name на path_object.stem

YasserKhalil 21.03.2022 18:02
path_object.stem кажется, работает правильно — см. обновленный ответ. Преобразование изображений в RGB должно избавиться от любого альфа-канала, который у них мог быть, но, не видя точного сообщения об ошибке, которое вы получаете, я не могу помочь по этой несвязанной проблеме.
martineau 21.03.2022 19:49

Я обновил вопрос, чтобы показать вам проблему использования другого пакета img2pdf.

YasserKhalil 21.03.2022 20:06

Не берите в голову. Я мог бы решить эту проблему, преобразовав объект в строку f.write(img2pdf.convert(str(path_object)))

YasserKhalil 21.03.2022 20:08

Хотя некоторые, если не все, стандартные библиотеки Python были изменены, чтобы принимать в качестве аргументов либо строки, либо объекты пути pathlib, многие сторонние модули по-прежнему этого не делают. Вы должны сообщить о проблеме автору img2pdf (добавление поддержки тривиально).

martineau 21.03.2022 21:12

Большое спасибо. Вы видели снимок проблемы с альфа-каналом?

YasserKhalil 21.03.2022 21:17

Да. Судя по тому, что на скриншоте, не похоже, что изображение .tif было преобразовано в RGB перед тем, как передать его в img2pdf.convert() (что избавило бы его от любых данных альфа-канала).

martineau 21.03.2022 21:21

Как я могу это исправить? Я пытался в течение нескольких часов, но безуспешно.

YasserKhalil 21.03.2022 21:25

Я не знаю. Проблема связана с img2pdf и в любом случае не имеет прямого отношения к этому вопросу (или, по крайней мере, к коду, который у вас есть — независимо от его названия). Тем не менее, смотрит на меня как img2pdf поддерживает только монохромные файлы tiff.

martineau 21.03.2022 23:03

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