使用Python将图片转pdf

使用Python将图片转pdf

今天需要把图片转pdf,发现迅捷pdf转换开始默认带水印了,收费版那算了😂😂,那就用Python吧,可单转,可批量转。

参考: https://blog.csdn.net/qq_53706090/article/details/128261862

pip install img2pdf
pip install pypdf2

这篇博客将介绍 照片转pdf,多图转多个pdf,多图转单个pdf,pdf合并。
wb覆盖,ab+是以二进制格式写入图片到文件,即使设置ab+ 追加文件生成的pdf依然有问题,只有一张图片,需要生成多个pdf再合并。
用pic_to_pdf 可以 生成单图生成单个pdf,多图生成多个pdf后在用 pypdf2 合并生成;
或者用img2pdf 传递单图生成单个pdf,传递多个图片生成单个pdf, 一次性生成一个pdf;

1. 效果图

发现可以成功转换:
在这里插入图片描述

2. 源码

# 照片转pdf,多图转多个pdf,多图转单个pdf,pdf合并
# imgToPdf.py

# coding = UTF-8


# 导入Python标准库
import os
from io import BytesIO

import img2pdf
# 导入第三方库
from PIL import Image
# 防止中文乱码
from PyPDF2 import PdfMerger

os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'

# 支持的图片文件格式
SUPPORT_SUFFIX = ["jpg", "jpeg", "png"]


def pic_to_pdf(image_bytes: bytes) -> bytes:
    """将单个图片转换为单张PDF

    :param image_bytes: 图片的bytes对象
    :return: PDF的bytes对象
    """
    # 将bytes对象转换为BytesIO对象
    image_bytes_io = BytesIO(image_bytes)
    # 从内存中读取图片
    image_object = Image.open(image_bytes_io)
    # 打开内存中的文件用于保存PDF
    with BytesIO() as result_bytes_io:
        # 将图片保存为单张PDF
        image_object.save(result_bytes_io, "PDF", resolution=100.0)
        # 获取内存中的文件
        data = result_bytes_io.getvalue()
    # 返回PDF的bytes对象
    return data


def batch_convert(image_path: str, pdf_path: str) -> None:
    """批量将图片转换为单张PDF

    :param image_path: 图片的文件夹
    :param pdf_path: PDF文件保存的文件夹
    """
    # 遍历文件夹下所有文件
    for root, dirs, files in os.walk(image_path, topdown=False):
        if (root.__contains__("ch/ch102")): break
        for name in files:
            # 提取文件的后缀名
            file_suffix = os.path.splitext(name)[-1].lstrip(".").lower()
            # 检测该文件格式是否受到支持
            if file_suffix not in SUPPORT_SUFFIX:
                continue
            # 拼接出图片文件的绝对路径
            source_file_path = os.path.join(root, name)
            # 拼接出PDF文件的绝对路径
            # target_file_path = os.path.join(pdf_path, f"{os.path.splitext(name)[0]}.pdf")
            target_file_path = pdf_path
            # 将图片文件转换为PDF文件
            with open(source_file_path, "rb") as source:
                try:
                    # r:以只读方式打开文件,从头开始读。
                    # rb:以二进制格式打开一个文件用于只读。
                    # 关于写入:
                    # w:打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件
                    # wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等
                    # a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式,不会覆盖原有的内容。如果该文件不存在,创建新文件用于读写
                    # ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。不会覆盖原有的内容。如果该文件不存在,创建新文件用于读写。
                    # 即使设置ab+生成的pdf依然有问题,只有一张图片,需要生成多个pdf再合并
                    with open(target_file_path, "ab+") as target:
                        target.write(pic_to_pdf(source.read()))
                        print(source_file_path)
                except Exception as e:
                    print(e)
                    with open('error.txt', 'a+') as f:
                        f.writelines('\'' + source_file_path + "\',")
                finally:
                    print('---------------')


# 照片转pdf
# image_path: 图片绝对路径
# pdf_path: pdf路径
def pic_convert(image_path, pdf_path):
    # 提取文件的后缀名
    file_suffix = os.path.splitext(image_path)[-1].lstrip(".").lower()
    # 检测该文件格式是否受到支持
    if file_suffix not in SUPPORT_SUFFIX:
        return
        # 将图片文件转换为PDF文件
    with open(image_path, "rb") as source:
        with open(pdf_path, "wb") as target:
            target.write(pic_to_pdf(source.read()))


def pic_convert2(image_path, pdf_path):
    imagePaths = []
    for root, dirs, files in os.walk(image_path, topdown=False):
        if (root.__contains__("ch/ch102")): break
        for name in files:
            # 提取文件的后缀名
            file_suffix = os.path.splitext(name)[-1].lstrip(".").lower()
            # 检测该文件格式是否受到支持
            if file_suffix not in SUPPORT_SUFFIX:
                continue
            # 拼接出图片文件的绝对路径
            source_file_path = os.path.join(root, name)
            with open(source_file_path, "rb") as source:
                try:
                    pic_to_pdf(source.read())
                    imagePaths.append(source_file_path)
                except Exception as e:
                    # 过滤掉坏图
                    print('error:', e)
                finally:
                    print('---------------')

    with open(pdf_path, "ab") as f:
        f.write(img2pdf.convert(imagePaths))
        f.close()


# 合并pdf
def mergePdf(i, pdf_list):
    print(str(i), pdf_list[0], pdf_list[-1])
    # 将所有 PDF 合并成一个文件
    merger = PdfMerger()
    for file_path in pdf_list:
        print(file_path)
        merger.append(str(file_path))
    merger.write("ch/output%s.pdf" % i)


image_path = 'D:/study/dataset/val/daisy/cj.jpg'
image_path = 'ch/ch1_209/167689.jpg'
pdf_path = os.path.splitext(image_path)[0].lstrip(".") + ".pdf"
pic_convert(image_path, pdf_path)

img_dir = 'D:/study/python-scripts/p20231031/ch/'

# 绝对路径,相对路径没有影响,pic_to_pdf 只能转一张  img2pdf传多个路径可以转多张图
batch_convert(img_dir, 'ch/chAll.pdf')  # 错误 无法生成全量图片的pdf,只有一张图片
pic_convert2(img_dir, 'ch/chAll2.pdf')

img_dir = 'ch/'
batch_convert(img_dir, 'ch/chAll_relativepath.pdf')  # 错误 无法生成全量图片的pdf,只有一张图片
pic_convert2(img_dir, 'ch/chAll2_relativepath.pdf')

pdf_list = []
pdf_list.append(pdf_path)
pdf_list.append('ch/chAll.pdf')
pdf_list.append('ch/chAll2.pdf')
# pdf_list.append('ch/chAll_relativepath.pdf') # 而且pdf指针有问题 合并会报错
pdf_list.append('ch/chAll2_relativepath.pdf')

mergePdf('_all', pdf_list)

参考

### 回答1: Python是一种广泛使用的编程语言,可以通过安装相关的第三方库来实现将PDF文件换为图片。 首先,您需要安装Pythonpdf2image库。该库可以将PDF文件换为PIL图像,也就是Python Imaging Library图像。 安装pdf2image库后,您可以使用以下代码来将PDF文件换为图像: ```python from pdf2image import convert_from_path, convert_from_bytes pages = convert_from_path('example.pdf', dpi=200) for page in pages: page.save('example.jpg', 'JPEG') ``` 在上述代码中,convert_from_path函数将PDF文件的路径作为参数,并将dpi设置为200。这将生成一个包含所有PDF页面的列表。然后循环列表中的每一页,并将它们保存为JPEG文件。 您也可以将convert_from_path函数更改为convert_from_bytes函数,该函数可以读取二进制数据而不是文件名,并且可以使用options参数来更改图像的大小和质量。 总之,Python是一种非常强大和灵活的编程语言,可以用来处理几乎所有的任务,包括将PDF文件换为图像。通过安装pdf2image库并调用相应的函数,您可以快速而轻松地将PDF文件换为图像。 ### 回答2: Python可以使用一个强大的库来实现将PDF换成图片的功能,这个库叫做“wand”。Wand库是用于在Python中进行ImageMagick的绑定,它可以与ImageMagick库无缝集成,提供了许多工具来处理图像,包括将PDF文件换成图像的功能。 步骤如下所示: 1. 安装Wand库和ImageMagick库。你需要确保它们都被正确安装在你的计算机上。 2. 导入Wand库并加载所需的图像。你可以使用以下代码导入Wand库。 ``` from wand.image import Image ``` 然后你可以使用以下代码加载你的PDF文件。 ``` with Image(filename='your_file.pdf', resolution=300) as img: img.format = 'png' img.save(filename='your_file.png') ``` 在这个代码示例中,我们首先打开PDF文件,设置换后的文件格式为PNG,并将换后的文件保存在磁盘上。 3. 运行你的代码。运行上面的代码来将PDF文件换成图像,并在你的磁盘上保存为PNG格式文件。你可以使用其他图像格式,比如JPEG,只需简单地使用“jpg”或“jpeg”代替“png”。 总之,使用PythonPDF文件换成图像是非常简单的。使用Wand库,你可以轻松读取PDF文件并将其换为图像,从而方便地在你的Python应用程序中使用它们。 ### 回答3: Python可以通过使用pdf2image库来将PDF文件换成图片。首先需要安装pdf2image库,可以使用以下命令: ``` pip install pdf2image ``` 接着,可以使用如下代码: ```python from pdf2image import convert_from_path # PDF文件路径 pdf_path = "example.pdf" # 将PDF换成图片 images = convert_from_path(pdf_path) # 保存图片 for i, image in enumerate(images): image.save(f"output_{i}.jpg", "JPEG") ``` 上述代码中,我们使用pdf2image库中的`convert_from_path()`函数来将PDF换成图片。该函数需要传入PDF文件路径,并返回一个图片列表。我们可以使用Python的循环语句将图片保存到指定的文件夹中。 需要注意的是,pdf2image库依赖于Poppler工具。如果在使用过程中遇到问题,可以尝试先安装Poppler工具,然后重新安装pdf2image库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值