上一篇文章里我提到用 WorkBuddy 整理案卷文件、按时间排序命名。但整理过程中发现了一个新问题:有份118页的PDF文件,里面合并了10份不同的法院判决书和裁定书,全都堆在一个文件里。
这份文件叫"当事人间案诉讼资料集合.pdf",打开一看,第1页是一份撤诉裁定,第2-20页是另一份二审判决,第21页又变成了新案子的一审判决……翻起来非常痛苦,想引用某份判决还得记住"大概在第几页"。
于是我对 WorkBuddy 说:
"把甲公司案-法院判决裁定文件汇总里面的文件拆分,每一个裁定书或者判决书都是单独的一个PDF,按照案号等信息来编号。"
WorkBuddy 拆分合并PDF的核心逻辑分三步:
1. 第一步:逐页渲染——把118页全部渲染成图片,因为扫描件没有文字层
2. 第二步:视觉识别——逐页查看图片,识别每页属于哪份文书(通过案号、文书标题、法院名称等关键信息判断文书边界)
3. 第三步:按边界拆分——根据识别结果,用 PyMuPDF 的 insert_pdf 方法把指定页码范围提取为独立PDF
118页全部高分辨率渲染会生成大量图片,WorkBuddy 采取了先采样后精查的策略:
· 先每隔10页渲染一张(第1、10、20、30...页),快速了解整体结构
· 再对疑似文书边界的区域逐页渲染,精确定位
核心代码逻辑如下:
import fitz # PyMuPDF doc = fitz.open("诉讼资料集合.pdf") # 采样渲染:每隔10页 sample_pages = list(range(0, 118, 10)) + [117] for i in sample_pages: page = doc[i] pix = page.get_pixmap(matrix=fitz.Matrix(1.5, 1.5)) pix.save(f'/tmp/集合_p{i+1:03d}.png') doc.close()
【截图位置:插入WorkBuddy渲染采样页面的对话截图】
通过逐页查看渲染的图片,WorkBuddy 识别出10份独立文书的页码边界:
序号 | PDF页码 | 案号 | 文书类型 |
|---|---|---|---|
1 | 第1页 | (2022)鄂0103民初XX号 | 民事裁定书-撤诉 |
2 | 第2-20页 | (2021)鄂01民终XXXX号 | 民事判决书-房屋租赁二审 |
3 | 第21-58页 | (2021)鄂0103民初XXXX号 | 民事判决书-合同纠纷 |
4 | 第59-66页 | (2017)鄂民再XX号 | 民事裁定书-再审提审 |
5 | 第67-86页 | (2016)鄂01民终XXXX号 | 民事判决书-合同纠纷二审 |
6 | 第87-88页 | (2015)鄂武汉中立终字第XXXX号 | 民事裁定书-管辖异议二审 |
7 | 第89-94页 | (2014)鄂江汉民二初字第XXXX号 | 民事裁定书-反诉管辖异议 |
8 | 第95-112页 | (2014)鄂江汉民二初字第XXXX号 | 民事判决书-合同纠纷 |
9 | 第113-114页 | (2013)鄂江汉民二初字第XXXX号 | 民事裁定书-撤回本诉 |
10 | 第115-118页 | (2013)鄂武汉中民商初字第XXXX号 | 民事裁定书-管辖移送 |
注意第8和第7行:同一个案号XXXX号有两份不同文书(一份裁定书、一份判决书),这就是合并PDF常见的问题——不同文书混在一起,不拆分根本没法管理。
边界确定后,拆分本身很快。核心代码:
import fitz import os source = "诉讼资料集合.pdf" output_folder = "甲公司案-法院判决裁定文件汇总" # 文书边界定义:(起始页, 结束页, 文件名) documents = [ (0, 0, "(2022)鄂0103民初XX号_民事裁定书-撤诉.pdf"), (1, 19, "(2021)鄂01民终XXXX号_民事判决书-房屋租赁二审.pdf"), (20, 57, "(2021)鄂0103民初XXXX号_民事判决书-合同纠纷.pdf"), # ... 其余7份 ] doc = fitz.open(source) for start, end, filename in documents: output_path = os.path.join(output_folder, filename) if os.path.exists(output_path): continue # 跳过已存在的文件 new_doc = fitz.open() new_doc.insert_pdf(doc, from_page=start, to_page=end) new_doc.save(output_path) new_doc.close() print(f"创建: {filename} ({end-start+1}页)") doc.close()
关键是 fitz.open() 创建空文档后用 insert_pdf(doc, from_page=X, to_page=Y) 插入指定页码范围,非常简洁。
拆分完成后发现几个问题:
· 有2份文件与拆分前已存在的文件内容完全相同(通过MD5校验确认),属于重复文件,删除掉
· 原合并文件已备份到子文件夹后删除,避免混淆
· 3份鄂民抗XX号文件(完整版、扫描版、证据版)内容有细微差别(签字盖章、标注不同),全部保留
【截图位置:插入拆分后的文件夹截图,展示10个独立PDF文件】
page.get_text().strip() 返回空字符串或长度极短,基本可以判定为扫描件。这时需要渲染为图片进行视觉识别。
118页全部高分辨率渲染会生成大量图片,消耗也大。先每10页采样一张快速了解整体结构,再对关键区域逐页精查,是效率与准确性的平衡。
判断一份文书的起始页,主要看以下特征:
· 页面上出现"民事判决书""民事裁定书"等文书标题
· 出现新的案号(如"(2021)鄂01民终XXXX号")
· 页面格式、字体、排版突然变化
· 文书结尾通常有审判员签名、日期、书记员署名
拆分前一定先备份原文件。我的做法是在同一目录下创建"_备份_合并原文件"子文件夹,把原文件复制过去,确认拆分无误后再删除。
最终从1个118页的合并PDF,拆分出8个新的独立PDF(另有2个与已存在文件重复,已删除)。加上之前已有的文件,文件夹里现在每个PDF都是一份独立的判决书或裁定书,文件名包含案号、文书类型、当事人信息,一目了然。
以前要在118页里翻找某份判决,现在直接看文件名就能定位。后续做质证意见、案件分析时引用起来特别方便。
法律工作中经常会遇到合并PDF——对方律师发来的材料集、法院送达的电子卷宗、自己扫描合并的案卷,经常是好几份文书混在一个文件里。手动拆分需要逐页翻找、复制粘贴,118页至少得花1小时。
用 WorkBuddy 一句话搞定,核心就是"渲染识别 → 定位边界 → 按范围提取"三步。关键是它能把扫描件也处理得很好,不依赖文字层。
如果你也经常处理合并PDF,强烈建议试试。尤其是律师、法务、企业行政等需要大量整理扫描文档的岗位,这个功能的提效非常实在。
本文基于真实案件材料处理过程撰写,已隐去当事人敏感信息。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。