你不懂得安排自己的人生,会有很多人帮你安排,他们需要你做的事。
PDF文件我们经常用,尤其是这两个场景:
下载参考资料,如各类报告、文档
分享只读资料,方便传播同时保留源文件
场景和模块
所以,对于PDF文件,常见的需求也就是两类:
处理文件本身,属于文件页面级操作,如合并/分拆PDF页面、加/解密、加/去水印;
处理文件内容,属于内容级操作,如提取文字、表格数据、图表等。
目前Python用于处理PDF的模块,主要有3个:
PyPDF2
:模块成熟,最后一次更新在2年前,适合页面级操作,文字提取效果较差。PDFMiner
:擅长文字抽取,目前主分支已停止维护,取而代之的是pdfminer.six
pdfplumber
:基于pdfminer.six
的文本内容抽取工具,使用门槛更低,如支持表格提取。
实战中,可以根据需求的类型选择模块。如果是页面级的操作,就用PyPDF2
,如果需要内容抽取,优先使用pdfplumber
。
对应的模块安装:
pip install pypdf2
pip install pdfminer.six
pip install pdfplumber
下面按使用场景演示3个模块的使用。
PyPDF2
PyPDF2
的主要能力在页面级操作,比如:
获取PDF文档基本信息
PDF分割及合并
PDF的旋转及排序
PDF加水印及去水印
PDF加密及解密
PyPDF2
的核心两个类是PdfFileReader
和PdfFileWriter
,完成PDF文件的读写操作。
获取PDF文档基本信息
import pathlibfrom PyPDF2 import PdfFileReaderpath = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/002pdf')f_path = path.joinpath('2020-新冠肺炎疫情对中国连锁餐饮行业的影响调研报告-中国连锁经营协会.pdf')with open(f_path, 'rb') as f: pdf = PdfFileReader(f) info = pdf.getDocumentInfo() cnt_page = pdf.getNumPages() is_encrypt = pdf.getIsEncrypted()print(f'''作者: {info.author}创建者: {info.creator}制作者: {info.producer}主题: {info.subject}标题: {info.title}总页数: {cnt_page}是否加密: {is_encrypt}''')
PDF分割及合并
import pathlibfrom PyPDF2 import PdfFileReader, PdfFileWriterpath = list(pathlib.Path.cwd().parents)[1].joinpath('data/automate/002pdf')f_path = path.joinpath('2020-新冠肺炎疫情对中国连锁餐饮行业的影响调研报告-中国连锁经营协会.pdf')out_path = path.joinpath('002pdf_split_merge.pdf')out_path_1 = path.joinpath('002pdf_split_half_front.pdf')out_path_2 = path.joinpath('002pdf_split_half_back.pdf'