超级安全!Python 合成多张图片到PDF格式

在日常生活中,经常会遇到需要提交身份证正反面证明资料的情况,而且这些网站大部分只接受pdf格式,这时候我们就需要把身份证正反面两张图片合成为一个pdf文件。

在macOS系统下,预览软件可以轻松做到这一点,同时打开图片到一个预览窗口下,点击导出PDF就能成功导出。但是Windows系统就没有这么方便的软件可以实现这一点,网上有很多合成PDF的网站,但是这些网站无一例外需要上传PDF进行合成,个人认为非常地不安全。

因此,最安全的方法,还是我们自己写一个Python脚本实现合成功能。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

请选择以下任一种方式输入命令安装依赖
1. Windows 环境 打开 Cmd (开始-运行-CMD)。
2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

pip install pillow

2.合成原理

Pillow模块,即PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。通过它,我们能很轻松地操作图像,并导出为不同格式。

首先来一个简单的示例,我们将打开一张图片,并将其保存为pdf格式:

from PIL import Image
import os


def convert_img_pdf(filepath, output_path):
    """
    转换图片为pdf格式

    Args:
        filepath (str): 文件路径
        output_path (str): 输出路径
    """
    output = Image.open(filepath)
    output.save(output_path, "pdf", save_all=True)
    
    
if __name__ == "__main__":
    convert_img_pdf("1.jpeg", "./test.pdf")

随便使用一张图片测试一下:

0c8f999effb16646e3fdf5f717814eb3.png

在运行代码后,它便成功地转化为了PDF文件:

ce7f1a8d7c76ff4bd98076110ebcfdca.png

几行代码便完成了这个转换,这个可比那些把照片上传到云端的网站安全多了。

3.多张照片合成PDF

有了前面照片转化PDF的基础知识,想要理解下面的多图合成PDF的代码就非常简单了。

其实就是使用了.save的一个特殊参数 append_images:

output.save(pdfFilePath, "pdf", save_all=True, append_images=sources)

通过把图片都存入到一个"sources"数组中,我们就能很轻易地合成这些图像到PDF中。

from PIL import Image
import os

def combine_imgs_pdf(folder_path, pdf_file_path):
    """
    合成文件夹下的所有图片为pdf

    Args:
        folder_path (str): 源文件夹
        pdf_file_path (str): 输出路径
    """
    files = os.listdir(folder_path)
    png_files = []
    sources = []
    for file in files:
        if 'png' in file or 'jpg' in file:
            png_files.append(folder_path + file)
    png_files.sort()

    output = Image.open(png_files[0])
    png_files.pop(0)
    for file in png_files:
        png_file = Image.open(file)
        if png_file.mode == "RGB":
            png_file = png_file.convert("RGB")
        sources.append(png_file)
    output.save(pdf_file_path, "pdf", save_all=True, append_images=sources)

if __name__ == "__main__":
    folder = r"G:\证件\\"
    pdfFile = r"G:\证件\身份证.pdf"
    combine_imgs_pdf(folder, pdfFile)

这样,只要将你的证件照都放在一个文件夹中,运行这个Python代码,它就能自动将这些证件合成到一个PDF中,并输出到你指定的路径。非常简单方便。

29bac9c68672fd5461e406be8135ed48.png

有需要的小伙伴,刚开那这份代码去试一下吧!在Python实用宝典后台回复 合成pdf 就能下载啦!

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

点击下方阅读原文可获得更好的阅读体验

Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

a3bd51a11b81bdce96211f212ad4ec37.png

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用Python的`reportlab`库和`Pillow`库来实现将多张图片插入到PDF中并设置每2张图片一页PDF的需求。 下面是示例代码: ```python from reportlab.lib.pagesizes import letter from reportlab.pdfgen import canvas from PIL import Image # 设置每2张图片一页PDF images_per_page = 2 # 读取图片 image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg'] images = [Image.open(path) for path in image_paths] # 计算PDF页数 num_pages = (len(images) + images_per_page - 1) // images_per_page # 创建PDF pdf_canvas = canvas.Canvas('output.pdf', pagesize=letter) # 插入图片 for i in range(num_pages): # 计算当前页的图片范围 start_index = i * images_per_page end_index = min(start_index + images_per_page, len(images)) # 插入图片 for j in range(start_index, end_index): image = images[j] x = 50 + (j % 2) * 250 y = 650 - (j // 2) * 300 pdf_canvas.drawImage(image, x, y, width=200, height=250) # 添加新页面 if i < num_pages - 1: pdf_canvas.showPage() # 保存PDF pdf_canvas.save() ``` 这段代码将读取4张图片,将它们插入到一个名为`output.pdf`的PDF文件中,每2张图片一页。你需要将`image1.jpg`、`image2.jpg`、`image3.jpg`和`image4.jpg`替换为你自己的图片路径。 ### 回答2: 要将4张图片插入到PDF中,每2张图片一页的话,我们可以使用Python中的PyPDF2库来实现。 首先,我们需要安装PyPDF2库。可以使用以下命令在命令行中安装: ``` pip install PyPDF2 ``` 然后,我们可以使用下面的代码将图片插入到PDF中: ```python import PyPDF2 from PIL import Image image_files = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg"] output_pdf = "output.pdf" # 创建一个新的PDF文件对象 pdf_writer = PyPDF2.PdfWriter() # 遍历每两张图片为一页 for i in range(0, len(image_files), 2): # 创建一个新的页面对象 page = pdf_writer.add_page() # 设置页面的大小为图片的大小 img1 = Image.open(image_files[i]) img2 = Image.open(image_files[i+1]) page_width, page_height = img1.size page.mediaBox.upperRight = [page_width, page_height] # 将图片1添加到页面中 img1.drawOn(page, 0, page_height//2, page_width//2, page_height) # 将图片2添加到页面中 img2.drawOn(page, page_width//2, page_height//2, page_width, page_height) # 将PDF写入到文件中 with open(output_pdf, "wb") as file: pdf_writer.write(file) ``` 上述代码首先导入了必要的模块,然后定义了要插入的图片文件列表和输出的PDF文件名。然后创建了一个新的PDF文件对象。接下来,我们使用for循环来遍历每两张图片,然后创建一个新的页面对象,将图片添加到页面中,并将页面添加到PDF文件对象中。最后,将PDF文件对象写入到文件中。 请确保在代码中使用正确的图片文件名和输出PDF文件名,并将它们与代码放在同一目录下。运行代码后,将会生成一个名为output.pdf的文件,其中包含了4张图片,每页显示两张图片。 希望这个回答对你有帮助! ### 回答3: 首先,需要使用Python的第三方库PyPDF2来处理PDF文件,以及PIL库来处理图像。 要将4张图片插入到PDF文件中,每2张图片占据一页PDF,可以按照以下步骤进行: 1. 导入所需的库 ```python import PyPDF2 from PIL import Image ``` 2. 创建一个新的PDF文件 ```python # 创建一个PDF的实例 pdf = PyPDF2.PdfFileWriter() ``` 3. 加载图片并将它们合并到PDF中 ```python # 加载并处理每一张图片 for i in range(4): # 加载图片 image = Image.open(f"image{i+1}.jpg") # 将图片调整为合适的大小(根据实际需求) image = image.resize((500, 500)) # 创建一个新的PDF页面 page = pdf.addBlankPage(width=image.width, height=image.height) # 在PDF页面上插入图片 page.mergeScaledPage(image) ``` 4. 按照每两张图片保存为一页PDF的要求,调整PDF的页面布局 ```python # 调整PDF页面布局 for i in range(0, len(pdf.pages), 2): # 创建一个新的PDF页面,宽度为两张图片的宽度之和,高度为最高一张图片的高度 new_page = pdf.addBlankPage(width=pdf.pages[i].width*2, height=pdf.pages[i].height) # 将前两张图片放置在新页面的左右两侧 new_page.mergeScaledTranslatedPage(pdf.pages[i], 0.5, 0) new_page.mergeScaledTranslatedPage(pdf.pages[i+1], 0.5, pdf.pages[i].width) # 删除被合并的页面 del pdf.pages[i] del pdf.pages[i] ``` 至此,我们已经将4张图片按照每2张图片一页的方式插入到了PDF文件中,并调整了页面布局。最后,我们可以保存PDF文件: ```python # 保存并关闭PDF文件 with open("output.pdf", "wb") as file: pdf.write(file) ``` 以上就是使用Python将4张图片插入到PDF文件中、每2张图片一页的简单实现办法。根据具体的需求和图片尺寸,你可能需要调整代码中的部分参数以及使用其他的库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值