Python X律师工作效率④:如何“编辑”PDF文件

liftword3周前 (12-09)技术文章16

前言

大家在日常工作中遇到大量的文件材料是如何处理的?有人会将材料打印下来,在纸质材料上圈圈画画、标注重点后再进行整理汇总;有人可能习惯在大的显示器上分屏操作,直接阅读pdf的同时做摘录。两者之间,对信息化手段略有研究的笔者显然会更倾向于后者。但是,说到提升效率,笔者向来是非常“贪心”的,获得了PDF文件后,虽然在电脑上阅读起来清晰直观,但若PDF内的信息可以数据化,将大量的文字、数字、表格等,转化为可以操作、计算、分析的形式就更好了。

恰好,近期笔者碰到一个案件,证据材料中有大量的谈话笔录、银行流水,如果可以整篇转为word/txt、excel,根据一定的规律重新排序、对比分析,便能快速发现问题、摘录重点部分作为法律意见。

受限于PDF的格式,各种天马行空的想法都绕不开下文所述的几座大山,笔者在此分享研究过程中遇到的困难和一些心得,希望对苦于PDF难以编辑的各位有所帮助。

01文档密码

很多时候我们会碰到加密了的PDF文件,密码一般为英文、数字混搭的8位字符。先不说要将密码记下来,每次打开文件时都需要输入密码,也是十分繁琐的。

利用Python批量处理的话可以导入PyPDF2库,其中有decrypt方法,用于输入密码后对PDF文件进行正常读取。接下来就是“读取页面-写入新文件”的循环操作,通过这样的方法消除密码,把PDF恢复到“无安全设置性”状态,允许打印、组合、提取、复制等等。笔者亲测成功,但是处理速度较慢。

网上也有很多解密PDF软件,比如Wonderfulshare PDF Protect,在“User Password”、“Owner Password”中均输入密码,点击“Unlock”,等待一段时间即可。新生成的PDF,其文件名为原文件名+“_unlocked.pdf”的形式。

如果不小心遗失了密码,还可以用John the Ripper+Hashcat来进行字典/掩码/暴力...破解,当然这对于电脑硬件配置、PDF版本等有一定要求,本文不作特别展开。

02水印

除了加密,有些PDF文件中还会附加水印。这些水印并不是通过“工具-页面-水印-添加水印”来的,所以不能直接删除。我们以上周汪银平律师所做分享的课件为例,那“上海星瀚律师事务所”的水印到底是什么呢?点击Acrobat左边的“内容”,发现水印并非“图片”,而是“文本”。在PDF页面上Ctrl-F进行文字查询,就能够搜索到相应的水印字样。这里可以一页页手动删除,但是如果碰到好几百页的PDF文件,手工删除的工作量还是挺大的。

笔者尝试用Python完成删除文本的任务,但用了PyPDF2、PyMuPDF等第三方库,并没有找到好方法。Stack Overflow网友也称“it's extremely hard or not worth it”。

网络上也有一些在线删除PDF中文字的工具,比如:http://www.pdfdo.com/pdf-delete-text.aspx,具备一键删除PDF中的所有文字、删除指定文字、删除包含指定文字的文字块等等功能。当然,使用外部工具总有一些风险,尤其一些重要文件上传至网络服务器也并不恰当,更推荐购买/下载软件到本地执行的方式。

前面说的是文字类型的水印,而如果要删除的是图片类型的的水印,则容易处理很多。以使用PyMUPDF库为例,基本思路就是遍历PDF页面中所有的图片,找到水印图片及其对应的xref(参照表),通过delete_object方法来删除水印。如果水印太多,则可以反向思维,把页面中需要的部分提取出来成为图片或者PDF,再合并起来。

03提取文本

有人会说,既然“水印”是文本类型,那又有什么删除的必要呢?我把PDF页面上的所有文字都提取下来存入word/txt等,只摘录自己想要的内容就好了。当然这也是一种思路,因为很多扫描设备自带文字识别功能,因此PDF中的内容等都是可选中、可复制、可编辑的“文本”。推荐用Python直接读取,相比于用鼠标选中文字然后复制粘贴要迅速很多。

如果想导出为txt/html文件,可以用Pdfminer.six库中的命令行工具pdf2txt.py;而如果想在Python中读取为str字符并处理,用PyMUPDF库的get_text()方法较为方便。

对于图片形式的文字,只有先OCR处理一遍才能转化为被计算机识别的字符。Adobe Acrobat虽然有自带的“扫描和OCR”工具,不过为了批量处理,还是寻求利用Python的解决方案,比如使用pytesseract库。首先要安装Tesseeract-OCR引擎和pillow/opencv等转化图片的库,才能正常使用pytesseract。教程可见https://pypi.org/project/pytesseract/。

具体语句实现还是挺方便的,我们以笔者手头经常能接触到的《犯罪嫌疑人诉讼权利义务告知书》来实验一下。可以看到,大多数文字都能正确识别。


除了图片转文字外,律师经常还会有提取表格文字的需求,比如将银行流水记录转为excel形式。一般可以用Python结合百度、阿里等AI开放平台的表格识别产品完成任务,参照相关技术文档操作即可。

总体而言,运用Python处理PDF文件的应用场景比较复杂,因为PDF文件本身是多媒体信息的集成。为了保证兼容性以及在各类设备中排版一致,造成了PDF文件难以编辑或篡改的特点。虽然在数字化上给律师带来一些难度,但还是可以用Python避免一部分重复劳动,也希望在未来能有更多成熟的工具能够协助我们更快地梳理事实和证据,投入更多精力为客户提供富有价值的法律服务。

文:邵洋

本文为星瀚原创,如需转载请先联系。