照片转pdf,多图转多个pdf,多图转单个pdf,pdf合并

使用python语言,利用python的第三方库,实现多照片(.png,.jpeg,.jpg等格式),转成pdf格式,再将多个pdf合并为一个pdf文件。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/07/08 18:39
# @Author  : 
# @Site    : 
# @File    : test05.py
# @Project : PythonCode
# @Software: vscode
# 照片转pdf,多图转多个pdf,多图转单个pdf,pdf合并
#
# coding = UTF-8


# 导入Python标准库
import os
from decimal import Decimal
from PIL import Image
from io import BytesIO
from PyPDF2 import PdfMerger,PdfReader, PdfWriter
# 导入第三方库



# 防止中文乱码
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 validate_directory(directory: str) -> bool:
    """验证目录是否存在且安全"""
    if not os.path.isdir(directory):
        return False
    return True


def batch_convert(image_path: str, pdf_path: str) -> None:
    """批量将图片转换为单张PDF"""
    if not validate_directory(image_path) or not validate_directory(pdf_path):
        raise ValueError("提供的路径不合法或不存在")
    
    try:
        # 遍历文件夹下所有文件
        for root, dirs, files in os.walk(image_path, topdown=False):
            for name in files:
                if 'pdf' in name:
                    continue
                # 提取文件的后缀名
                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")
                
                # 将图片文件转换为PDF文件
                with open(source_file_path, "rb") as source:
                    with open(target_file_path, "wb") as target:
                        target.write(pic_to_pdf(source.read()))
    except IOError as e:
        print(f"文件操作失败: {e}")
    except PermissionError as e:
        print(f"权限不足: {e}")
    except Exception as e:
        print(f"转换过程中发生未知错误: {e}")
 
 


def mergePdf(i, pdf_list):
    # 将所有 PDF 合并成一个文件
    merger = PdfMerger()
    writer = PdfWriter()
     # 获取标准A4纸张尺寸
    a4_width_mm = 210.0
    a4_height_mm = 297.0
    mm_to_points = 72 / 25.4  # 每毫米等于多少点
    
    a4_width_points =a4_width_mm * mm_to_points
    a4_height_points = a4_height_mm * mm_to_points

    # for file_path in pdf_list:
    #     merger.append(str(file_path))
    for file_path in pdf_list:
        reader = PdfReader(file_path)
        for page in reader.pages:
            # 获取当前页面尺寸
            current_width = page.mediabox.width
            current_height = page.mediabox.height
            
            # 计算缩放比例
            scale_x =a4_width_points / float(current_width)
            scale_y = a4_height_points/ float(current_height)
            
            # 使用较小的缩放比例以确保页面适合A4纸张
            scale = min(scale_x, scale_y)
            
            # 应用缩放
            page.scale(scale, scale)
            
            # 将调整后的页面添加到输出文档
            writer.add_page(page)


    writer.write(f"{Output_path}/output.pdf")
 
 


if __name__ == '__main__':
    Output_path = "E:/output"  # 输出路径

    pics_path = "D:/image"  # 图片路径
    batch_convert(pics_path, pics_path)  # 批量转换
    pdf_list = []
    for i in os.listdir(pics_path):
        if "pdf" in i:
            pdf_list.append(os.path.join(pics_path, i ))
    mergePdf('_all', pdf_list)


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java提供了多种方式来实现图片PDF的功能其中一种常用的方式是使用i库。iText是一个开源的Java PDF库,可以用于创建、操作和处理PDF文件。 以下实现图片PDF的基本步骤: 1. 导入iText库的依赖。你可以在项目的构建文件(如om.xml)中添加以下依赖项: ``` <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> ``` 2. 创建一个空的文档对象。 java Document document = new Document(); ``` 3. 创建一个PdfWriter对象,将文档对象与输出文件关起来。 ``` PdfWriter.getInstance(document, new FileOutputStream("output.pdf")); ``` 4. 打开文档。 ```java document.open(); ``` 5. 读取图片文件,并将其添加到PDF文档中。 ```java Image image = Image.getInstance("image.jpg"); document.add(image); ``` 6. 关闭文档。 ```java document.close(); ``` 完整的示例代码如下: ```java import com.itextpdf.text.Document; import com.itextpdf.text.Image; import com.itextpdf.text.pdf.PdfWriter; import java.io.FileOutputStream; public class ImageToPdfConverter { public static void main(String[] args) { try { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream("output.pdf")); document.open(); Image image = Image.getInstance("image.jpg"); document.add(image); document.close(); System.out.println("PDF created successfully."); } catch (Exception e) { e.printStackTrace(); } } } ``` 请注意,上述示例代码仅适用于将单个图片换为PDF。如果你需要将多个图片合并为一个PDF文件,可以使用iText库提供的其他功能,如创建多个页面并在每个页面上添加不同的图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值