未知文件扩展名将图像转换为 pdf 失败

Convert image to pdf fail by unknow file extension

我有以下代码循环遍历多个文件夹中具有任何扩展名的所有图像,然后将这些图像转换为 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 至于你提供的很棒的解决方案,我试图改变我使用 img2pdf 将图像转换为 pdf 的方式 这是我的尝试

import img2pdf
with open(path_object.parent / (path_object.stem + '.pdf'), 'wb') as f:
    f.write(img2pdf.convert(str(path_object)))

对于带有 alpha 通道的图像,我收到了这条消息 Image contains an alpha channel which will be stored as a separate soft mask (/SMask) image in PDF.

这是与 alpha 通道图像相关的错误消息的快照

您可以使用 os.path.splitext() 函数获取图像文件名的基本部分,然后使用 os.path.join() 将其与您想要的 .pdf 扩展名组合起来。 (请注意,将其转换为 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 module which allows file and folder paths to be tried as objects and manipulated via an object-oriented programming paradigm 或模型做事的方法——这通常会产生非常简洁的代码:

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'))