无独有偶,最近和PDF结缘了,有两个客户虽然行业不同,但都需要对PDF进行处理。
一个客户需要将某电商渠道的订单用PDF的方式导入到ERP里面,其重点是将PDF内容转换为可识别的结构化数据;
一个客户需要将HIS生成的PDF手术文件在小程序展示患者,需要对已经存在的PDF文件进行加密处理,并支持在线浏览。
PDF订单这个,最开始我想着使用pdfparser
这个PHP三方库,但是他只能按行读取,或按坐标读取,无法按表格读取,同一页多个表格的时候,处理起来就非常困难,并且他这个处理效率也比较低,可扩展性不高。
后面经过对比,决定使用Python的pdfplumber
这个库,其优点就是即可以按行读取,也可以按表格读取,同一页多个表格的时候,它提取的数据可以是不同结构的列表(List
),并且在处理多页的时候也很方便。
import pdfplumber
import json
# 打开PDF文件
with pdfplumber.open("./test.pdf") as pdf:
# 获取PDF文件的页数
page_count = len(pdf.pages)
# 遍历每一页
for page_num in range(page_count):
# 获取当前页
_table = pdf.pages[page_num].extract_tables()
print(_table)
按行读取的话,可以使用extract_text()
方法。
使用Python这个库的话,安装也比较简单。
wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.t
./configure --prefix=/usr/local/python3
make && make install
export PATH=/usr/local/python3/bin:$PATH
python3 -V
ln -s /usr/local/python3/bin/python3 /usr/sbin/py
pip3 install pdfplumber
PDF报告这个,尝试了tcpdf
和fpdi
这两个PHP三方库,fpdi
基于tcpdf
的,这两个都是生成PDF并添加密码,无法对已经存在的PDF进行加密处理,并且还依赖一些扩展。
后面经过对比,决定使用Python的spire.pdf
这个库,其优化点就很明显了,就是简单,安装和使用非常简单。
from spire.pdf.common import *
from spire.pdf import *
# 加载PDF文件
pdf = PdfDocument()
pdf.LoadFromFile("待加密PDF文档.pdf")
# 用指定密码加密 PDF 文件, 并设置操作权限和密钥大小
pdf.Security.Encrypt("123", "abc", PdfPermissionsFlags.Print, PdfEncryptionKeySize.Key128Bit)
# 保存加密的PDF文件
pdf.SaveToFile("已加密PDF文档.pdf", FileFormat.PDF)
# 密码是123
安装就更简单了,直接pip install Spire.PDF
就可以了,如图:
这里重点要注意的是python的版本,一般服务器自带的python版本是2.4或2.7,而这两个库可能要求3.几以上的版本。
当然,使用Python处理PDF,并不代表PHP处理不好,而是在使用成本上Python更合适。而且PHP业务代码里面要使用Python处理PDF,要么需要使用函数exec
, 要么需要用Ptyhon起一个WEB服务,像使用fastapi
这种WEB框架,使用起来也很简单,但是部署和维护成本就增加了。