首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python: 基于指定单号批量合并PDF文件

Python: 基于指定单号批量合并PDF文件

作者头像
Exploring
发布于 2024-11-23 01:13:11
发布于 2024-11-23 01:13:11
17200
代码可运行
举报
运行总次数:0
代码可运行

文章背景: 在工作中,有时需要合并指定单号的PDF文件。比如需要将指定单号的测试数据合并为一份文件。

解决思路: 合并PDF文件,可以使用第三方模块,PyMuPDF模块。如果电脑上一开始没安装的话,可以通过pip install pymupdf手动安装。

一开始笔者用的是PyPDF4模块,但是如果需要合并一百页以上的PDF文档,PyPDF4模块的性能明显不如PyMuPDF模块,所以后来改用了PyMuPDF模块。

完整的Python代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding=utf-8

import os
import re
import time
import fitz   # PyMuPDF
from datetime import datetime


def delete_file(f):
    os.remove(f)


def find_files_with_string(directory, search_string):

    # 创建一个空列表用于存储结果
    found_files = []

    # 遍历指定文件夹中的所有文件(不包括子文件夹)
    for file in os.listdir(directory):
        # 获取文件的完整路径
        full_path = os.path.join(directory, file)
        # 检查是否是文件(排除文件夹)
        if os.path.isfile(full_path):
            # 检查文件名中是否包含指定的字符串(不区分大小写)
            if search_string.upper() in file.upper():
                # 将文件路径保存在列表中
                found_files.append(full_path)

    return found_files


def ask_yes_no(prompt):
    while True:
        response = input(f"{prompt} (yes/no): ").strip().lower()
        if response in ["yes", "y"]:
            return True
        elif response in ["no", "n"]:
            return False
        else:
            print("Please answer 'yes' or 'no'.")


def extract_info(s):
    # 定义正则表达式来提取7位数字后的字母和数字;字母个数,字母,数字
    match = re.search(r'\d{7}-([A-Za-z]+)(\d+)', s)
    if match:
        letters = match.group(1)
        numbers = match.group(2)
        return len(letters), letters, int(numbers)
    else:
        return 0, '', 0  # 如果未找到匹配项,返回默认值


def custom_sort(lst):
    # 按字母个数、字母顺序和数字顺序排序
    return sorted(lst, key=lambda x: extract_info(x))


def merge_pdf(input_path, ss, output_path):
    """ 合并PDF文件到指定路径,删除子PDF文件(可选)
    """

    # 开始计时
    start_time = time.time()

    # 1 判断输入路径
    if not os.path.isdir(input_path):
        print("输入路径不存在,请确认!")
        return

    # 2 判断单号是否存在
    last_seven = ss[-7:]
    if len(ss) < 7:
        print("样品单号少于7位,请确认!")
        return
    elif not last_seven.isdigit():
        print("样品单号最后7位不全是数字,请确认!")
        return

    # 3 判断输出路径是否存在
    if not os.path.isdir(output_path):
        print("输出路径不存在,请确认!")
        return

    # 4 查找PDF文件
    result = find_files_with_string(input_path, ss)
    num_result = len(result)
    if num_result == 0:
        print("指定单号的PDF数据文件不存在,请确认!")
        return
    else:
        # 列表自定义排序
        result_sorted = custom_sort(result)

        # 2) 合并PDF文件
        msg = f"总共要合并 {num_result} 份文件?"
        user_response = ask_yes_no(msg)
        if user_response:
            # 获取临时文件名
            filename = ss + ".pdf"
            file_path_output = os.path.join(output_path, filename)

            # 判断文件是否已存在
            if os.path.isfile(file_path_output):
                print("提示", "文件已存在,请确认!\n" + file_path_output)
                return

            # 合并pdf文件

            # 将文件分成每50个一组
            file_groups = [result_sorted[i:i + 50] for i in range(0, len(result_sorted), 50)]

            merged_files = []

            for i, file_group in enumerate(file_groups):
                file_merger = fitz.Document()

                for file in file_group:
                    if file.endswith("pdf"):
                        pdf_document = fitz.Document(file)
                        file_merger.insert_pdf(pdf_document)
                        pdf_document.close()  # Close the document after inserting it

                # 获取当前的时间戳
                timestamp = datetime.now().strftime("%Y%m%d%H%M%S")

                # 在文件名中添加时间戳
                merged_file_path = f"merged_{i}_{timestamp}.pdf"
                file_merger.save(merged_file_path)
                file_merger.close()

                merged_files.append(merged_file_path)

            # 创建一个新的合并器,将所有合并后的文件再次合并
            final_merger = fitz.Document()

            for file in merged_files:
                pdf_documents = fitz.Document(file)
                final_merger.insert_pdf(pdf_documents)
                pdf_documents.close()  # Close the document after inserting it

            # 保存最终的合并文件
            final_merger.save(file_path_output)
            final_merger.close()

            # 删除中间生成的合并文件
            for file in merged_files:
                os.remove(file)

            # 使用默认的PDF阅读器打开PDF文件
            os.startfile(file_path_output)

            # 删除单份的PDF文件(可选的步骤)
            # for file in result_sorted:
            #    if file.endswith("pdf"):
            #        delete_file(file)

            # 结束计时
            end_time = time.time()

            # 计算总耗时
            elapsed_time = round(end_time - start_time)

            print(f"Done!\n共合并了 {num_result} 份PDF文档!\n总耗时:{elapsed_time} 秒")

        else:
            print("提示", "未执行合并任务!")


if __name__ == '__main__':
    # 示例
    input_path_1 = "C:\\Local\\origin"
    sample_no = "BYD24-0010001"
    output_path_1 = "C:\\Local\\target"

    merge_pdf(input_path_1, sample_no, output_path_1)

效果演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
总共要合并 3 份文件?(yes/no): yes
Done!
共合并了 3PDF文档!
总耗时:5

(1)为了提高运行效率,如果需要合并50份以上的PDF文件,代码中进行了优化,每50份文件合并成一份,最后再汇总到一起。

参考资料:

[1] ChatGPT AI生成

[2] Python: 基于正则表达式自定义排序规则

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据处理与编程实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【随笔】用 Python 轻松提取、合并和压缩 PDF 文件
在我们的示例中,首先读取指定的 PDF 文件并提取每一页的第二行内容。根据第二行的内容(以空格分隔的第一个词),我们将相同内容的页面合并为一个新的 PDF 文件。最后,生成的 PDF 文件会被压缩,以减少文件的大小。
框架师
2024/11/14
6260
零代码编程:用ChatGPT来批量合并多个PDF文件
一个文件夹里面有38个PDF文件,现在想合并成一个PDF文件。用ChatGPT可以非常简单的实现。
AIGC部落
2024/06/24
1790
零代码编程:用ChatGPT来批量合并多个PDF文件
Python办公自动化:"破解WPS会员"之文档拆分合并
看到标题是不是有点惊讶,博主怎么走上了很刑的路线?看完此篇文章,教你自己做一个无限使用永久免费的文档拆分合并小工具
小宇-xiaoyu
2025/01/14
3230
Python办公自动化:"破解WPS会员"之文档拆分合并
PDF转图片
经过测试,fitz是目前PDF转图片相对较简单快捷且无bug的一个方法,不会出现转换图片时白屏的情况。弊端是转换较慢。 fitz——高质量转PDF 安装 pip install traits pip install fitz pip install PyMuPDF 示例 import os import fitz import traceback from concurrent.futures import ThreadPoolExecutor, wait from loguru import logger
GhostCN_Z
2021/08/04
3.9K0
Python将图片批量转为PDF
在日常办公和处理图片时,我们常常需要将多张图片合并成一个PDF文件,以便于存档、分享或打印。Python提供了强大的图像处理库,可以轻松实现这一任务。本文将详细介绍如何使用Python将图片批量转换为PDF,并包含对应的示例代码,帮助全面掌握这一技巧。
sergiojune
2024/07/11
9810
Python将图片批量转为PDF
【实用原创】20个Python自动化脚本,解放双手、事半功倍
在当今的快节奏工作环境中,自动化不再是一种奢侈,而是提高效率和精确性的必需手段。Python,以其易于学习和强大的功能而闻名,成为实现各种自动化任务的理想选择。无论是数据处理、报告生成,还是日常的文件管理,一个简单但有效的Python脚本就能大幅减轻您的工作负担。在本文中,我们将探索如何使用Python来创建多个自动化脚本,它不仅能够节省您的时间,还可以提高工作的准确率和效率。我们先来看第一个自动化脚本
用户6888863
2023/12/13
3K0
【实用原创】20个Python自动化脚本,解放双手、事半功倍
Python——批量将PDF文件转为图片
思索
2024/08/15
2820
Python——将PPT和Word转为PDF文件
思索
2024/08/15
3290
Python将PDF转成图片PNG和JPG
前言:在最近的测试中遇到一个与PDF相关的测试需求,其中有一个过程是将PDF转换成图片,然后对图片进行测试。
软测小生
2019/08/06
15.8K0
Python将PDF转成图片PNG和JPG
PDF 的各种操作,我用 Python 来实现(附网站和操作指导)
PDF 处理是日常工作中的常见需求,包括 PDF 合并、删除、提取等。更复杂的任务如:将 PDF 转换成 图像。
机器视觉CV
2020/07/23
2.1K0
PDF 的各种操作,我用 Python 来实现(附网站和操作指导)
Python将PDF转成图片—PyMuPDF和pdf2image
前言:在最近的测试中遇到一个与PDF相关的测试需求,其中有一个过程是将PDF转换成图片,然后对图片进行测试。
软测小生
2019/08/06
3.1K0
Python将PDF转成图片—PyMuPDF和pdf2image
Python脚本工具,PyMuPDF批量提取PDF文件中的图片
如何批量快速提取出PDF中的图片文件,你是否遇到这样的一个问题,尤其是PPT文件转换为PDF文件,需要快速提取其中的图片文件,如果你恰好会那么一点py,同时复制粘贴没问题的话,那么相信你也能够很轻松的解决这个问题。
二爷
2021/08/23
3.5K0
Python脚本工具,PyMuPDF批量提取PDF文件中的图片
对双栏 | 单双栏混合 | 图表文字混合的复杂布局的图片OCR识别(对布局复杂的整个pdf进行OCR识别)
  先上一个表,分享一下我最近接触到的三个OCR引擎,其实各有各的特点,说不上最好和最坏,按需使用。
watermelo37
2025/01/22
7850
对双栏 | 单双栏混合 | 图表文字混合的复杂布局的图片OCR识别(对布局复杂的整个pdf进行OCR识别)
Python提取PDF第一页为封面图片【批量提取】
近期要处理一批PDF文件,大约在20G,具体数量不详,需求是把每个文件的页数和第一页转换成图片,在网上查阅各种类库,最终选择的是PyMuPDF模块。最后核心代码量较少,功能实现效果也比较好。
申霖
2020/02/17
3.5K0
智能文件内容合并:用Python实现多源问答内容高效整合
在团队协作和知识管理场景中,我们经常面临这样的困境:同一个问题被多位专家回答,这些回答分散在不同文件中,内容各有侧重却又相互补充。传统的手动复制粘贴不仅效率低下,还容易遗漏重要信息。本文将介绍如何用Python开发一款智能文件合并工具,解决多源知识整合的痛点。
熊猫钓鱼
2025/08/01
810
智能文件内容合并:用Python实现多源问答内容高效整合
GPM逐日降水数据文件合并
GPM(Global Precipitation Measurement)降水数据是由全球降水测量任务提供的高分辨率全球降水数据集。GPM任务由NASA和JAXA(日本宇宙航空研究开发机构)主导,旨在提供全球范围内的降水观测数据,以改进天气预测、气候研究和自然灾害监测。
阿巴阿巴-
2025/02/07
2870
用 Python 批量提取 PDF 的图片,并存储到指定文件夹
上篇《用 Python 批量提取 PDF 的表格数据,保存为 Excel》文章中,我们利用 Python 的第三方工具库 pdfplumber 批量提取 PDF 的表格数据后,有不少小伙伴们提出,大多数 PDF 都为图片,如何批量提取出图片。
杰哥的IT之旅
2022/05/17
2.1K0
用 Python 批量提取 PDF 的图片,并存储到指定文件夹
Marker 源码解析(一)
ApacheCN_飞龙
2024/03/09
4780
Docker部署文件脱敏助手
happywei
2025/07/28
590
关于PDF文件转图片、转文本
前几天在做应标方案,少不了从各种合同、验收文档中截取一下案例图片,试了半天也没找到合适的工具,从网上找python相关方案,最后选中了PyMuPDF,主要是好用,而且功能也听过,目前只实现了pdf转图片,pdf抽取文本两种功能,后续的有待再学习。
python与大数据分析
2022/03/11
1.8K0
关于PDF文件转图片、转文本
推荐阅读
相关推荐
【随笔】用 Python 轻松提取、合并和压缩 PDF 文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验