python:reportlab 将多个图片合并成一个PDF文件

承上一篇:java:pdfbox 3.0 去除扫描版PDF中文本水印

# 导出扫描版PDF文件中每页的图片文件

java -jar pdfbox-app-3.0.3.jar export:images -prefix=test -i your_book.pdf
导出
Writing image: test-1.jpg
Writing image: test-2.jpg
Writing image: test-3.png
……

在日常工作中,我们经常需要将多张图片合并成一个PDF文件,以便于分享或打印。Python作为一种强大的编程语言,提供了丰富的库和工具,使得这一任务变得非常简单。在本文中,我们将介绍如何使用Python合并多张图片并生成一个PDF文件的方法。我们需要安装两个库:Pillow 和ReportLab。Pillow 用于处理图片,ReportLab 用于生成PDF文件。
pip install Pillow
pip install reportlab
  reportlab-4.2.2-py3-none-any.whl (1.9 MB)

编写 merge_pdf1.py  如下

# -*- coding: utf-8 -*-
""" PyMuPDF 将多个图片合并成一个PDF文件 """
import os
from PIL import Image
from reportlab.pdfgen import canvas

images_dir = "." # imgs
tmpdir = r"\tmp" # Win 10

def revise(s):
    """ 修正图片文件名中的数字,假设0<页数<=999 """
    prefix = s[0:5]
    d = s.split('-')[1].split('.')[0]
    ext = s.split('.')[1]
    # 数字前补零
    if len(d) ==1:
        d = '00'+d
    elif len(d) ==2:
        d = '0' +d
    else:
        pass
    filename = prefix + d +'.'+ext
    os.rename(s, filename)
    return filename

def merge_images_to_pdf(image_list, output_pdf):
    """ 使用画布 """
    c = canvas.Canvas(output_pdf)
    for image in image_list:
        print(image)
        img = Image.open(image)
        c.setPageSize((img.width, img.height))
        c.drawInlineImage(image, 0, 0)
        c.showPage()
    c.save()

# main()
# 图片路径列表
img_list = [f for f in os.listdir(images_dir) if f.endswith(".jpg") or f.endswith(".png")]
imgs_list = []
for img in img_list:
    imgs_list.append(revise(img))
# 修正img文件名后排序
imgs_list = sorted(imgs_list)
# 输出PDF文件路径
output_path = os.path.join(tmpdir, 'result.pdf')
merge_images_to_pdf(imgs_list, output_path)

运行 python merge_pdf1.py 
生成 \tmp\result.pdf 

在这段代码中,我们首先导入了必要的库。然后定义了一个名为 merge_images_to_pdf 的函数,该函数将接受一个图片列表和输出PDF文件的路径作为参数。在函数中,我们使用 Pillow库打开每张图片,并将其逐一添加到PDF中。最后,我们保存生成的PDF文件。

可以使用 ReportLab 库来生 PDF 文件,下面是一个示例代码,可以生一个包含图片和标题的 PDF 文件。首先需要安装 ReportLab 库,可以使用以下命令来安装: ``` pip install reportlab ``` 然后可以使用以下代码来生 PDF 文件: ```python from reportlab.lib.pagesizes import letter from reportlab.pdfgen import canvas from reportlab.lib.units import inch from reportlab.lib import colors from reportlab.platypus import SimpleDocTemplate, Paragraph, Image from reportlab.lib.styles import getSampleStyleSheet # 创建一个 PDF 文档对象 pdf = SimpleDocTemplate("example.pdf", pagesize=letter) # 定义样式 styles = getSampleStyleSheet() title_style = styles["Title"] paragraph_style = styles["Normal"] # 创建一个包含图片和标题的列表 elements = [] # 添加标题 title = Paragraph("这是一个标题", title_style) elements.append(title) # 添加图片 im = Image("example.jpg", 6*inch, 4*inch) elements.append(im) # 将列表添加到 PDF 文档中 pdf.build(elements) ``` 在上面的代码中,我们首先创建了一个 `SimpleDocTemplate` 对象,指定了 PDF 文件名和页面大小。然后定义了标题和段落的样式。接着创建一个包含标题和图片的列表,最后将列表添加到 PDF 文档中并保存。在添加图片时,我们使用了 `Image` 类,并指定了图片文件名和大小。 需要注意的是,上面的示例代码中的图片文件名为 `example.jpg`,需要将其替换为你自己的图片文件名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值