如何用python处理pdf_用Python处理PDF
本文1146字,预计阅读需8分钟;
PDF作为可移植文档格式(Portable Document Format),在日常生活中经常接触到,最近处理一些数据更是频繁接触一些需要批量处理pdf文件的需求,因此便想整理一下自己实践的用Python处理PDF格式数据的笔记。本文会保持更新。PDF处理的高频需求有:读取、写入、格式转换(pdf提取文本写入txt、根据url写入pdf等) 、批处理(多个pdf合并为1个、切分pdf)等等。查了下相关资料,Python操作PDF的库有(只是应用的话肯定不至于造轮子从二进制数据开始读):pdfminer、pdfminer3k、PyPDF、PyPDF2、pdf2htmlex、pdf2image、pdf2xlsx等。
可用的pdf库
用pdf2合并和切分PDF
比较几个库之后打算先从PyPDF2快速实现一些功能。其官方文档为PyPDF2 Documentation[1],根据文档,PDF2库包含了 PdfFileReader PdfFileMerger PageObject PdfFileWriter 四个常用的主要的调用类,意思也很明确。先用pip install PyPDF2安装库。
批量合并pdf
import osfrom PyPDF2 import PdfFileReader, PdfFileWriter #导入需要的类(库)wp='D:/doc_of_pdf/' #work_path#合并同一个文件夹下的pdf文件flst=[] #获得pdf文件路径for root, dirs, files in os.walk(wp):flst=filesflst=[wp+f for f in flst]out_pdf=PdfFileWriter()for pf in flst:in_pdf=PdfFileReader(open(pf, 'rb')) #二进制打开page_count=in_pdf.getNumPages() #输入pdf的页数for pc in range(page_count):out_pdf.addPage(in_pdf.getPage(pc)) #逐页循环with open(wp+'合并笔记_1-3章.pdf','wb') as wf:out_pdf.write(wf)#out_pdf.getNumPages()
执行前后对比
切分pdf为多个pdf
#将一个pdf文件根据一定规则切分为多个sc_pdf=PdfFileReader(open(flst[0], 'rb')) #对第一章笔记进行处理count_sc=sc_pdf.getNumPages()#每7页切分为1个PDF文件out_pdf=PdfFileWriter() #用以输出pdffor c in range(count_sc):if c%7==0 and c>0:with open(wp+'切分_{0}.pdf'.format(c),'wb') as wf:out_pdf.write(wf)out_pdf=PdfFileWriter() #重建一个空对象else:out_pdf.addPage(sc_pdf.getPage(c))
切分测试结果截图
通过上面的实践,可以看到实现这几个需求高频使用到的方法就是新建一个Reader或Writer对象,通过.getNumPages()获取一共的页码,通过.getPage(page)获取特定页,.addPage()写入页码。
图片转PDF
需要用到额外的PIL库:处理图片的神器。
#单张图片转pdffrom PIL import Imagefrom PyPDF2 import PdfFileReader, PdfFileWriterimg = Image.open('D:/docOfStu/pypdf2-mindmap-01.JPG')img.save('D:/docOfStu/pypdf2-mindmap-01.pdf', 'PDF') #通过PIL库保存为pdf格式#多张图片转pdfilst=['D:/docOfStu/pypdf2-mindmap-01.jpg','D:/docOfStu/pypdf2-mindmap-02.jpg'] #图片列表# for root, dirs, files in os.walk(wpt): ilst=files #也可以通过os.walk(wpt) 读取文件夹wpt下所有图片out_pdf=PdfFileWriter()for f in ilst:img = Image.open(f)fw=f.replace('.jpg','.pdf')img.save(fw)out_pdf.appendPagesFromReader(PdfFileReader(open(fw,'rb'))) #也可拆这句为 sc_pdf=PdfFileReader(open(fw,'rb')); out_pdf.addPage(sc_pdf.getPage(0))out_pdf.write(open('D:/docOfStu/pypdf2-mindmap-04.pdf','wb'))
图片转pdf对比效果
页面处理
过滤pdf中的的特定页面,只保留特定页面;另一方面,给pdf文件添加特定页面;
#过滤pdf的特定页面,只保留特定页面;from PyPDF2 import PdfFileReader, PdfFileWriterwith open('zz-pdf.pdf', 'rb') as rf: #需去除特定页面的pdfin_pdf=PdfFileReader(rf)out_pdf=PdfFileWriter()add_pages=[1] #从0开始计数for i in range(in_pdf.getNumPages()):if i in add_pages:with open('pdf-marker.pdf','rb') as mf:out_pdf.addPage(PdfFileReader(mf).getPage(0)) #取特定的一页out_pdf.addPage(in_pdf.getPage(i))out_pdf.write(open('zz-pdf-marker.pdf','wb'))#将特定页面添加到pdf文件里m_pdf=PdfFileMerger()m_pdf.merge(0,'zz-pdf.pdf',pages=(0,2)) #提前确定初始化的时候有多少页m_pdf.merge(1,'ipynb2pdf.pdf',pages=(0,1)) #可以省略用open打开的操作m_pdf.write(open('zz-pdf-marker-7.pdf','wb'))with open('zz-pdf.pdf', 'rb') as rf: #另一种写法#in_pdf=PdfFileReader(rf)m_pdf=PdfFileMerger()m_pdf.merge(0,rf,pages=(0,2))with open('ipynb2pdf.pdf','rb') as f:m_pdf.merge(1,f,pages=(0,1))m_pdf.write(open('zz-pdf-marker-6.pdf','wb'))
代码同步更新于:https://github.com/QLWeilcf/ Stack_lcf/blob/master/pdfProccWithpy.ipynb。
References
[1] PyPDF2 Documentation: https://pythonhosted.org/PyPDF2/[2] QLWeilcf_pdfProccWithpy.ipynb: https://github.com/QLWeilcf/Stack_lcf/blob/master/pdfProccWithpy.ipynb[3] PyPDF2 Documentation: https://pythonhosted.org/PyPDF2/[4] pdfminer: https://pypi.org/project/pdfminer/
如何用python处理pdf_用Python处理PDF相关推荐
- python设计模式pdf_精通Python设计模式 高清晰PDF+源码
精通Python设计模式讲述了16种基本设计模式,轻松解决软件设计常见问题:借力高效的Python语言,用现实例子展示各模式关键特性. 本书用实际生活中的例子带你了解常用的设计模式,介绍了诸多有关编写 ...
- python 原理 pdf_利用Python处理PDF——裁剪和生成新的PDF
安装 在cmd中输入这一句: pip install -U pdfminer3k -i https://pypi.tuna.tsinghua.edu.cn/simple --user 注意:这里安装的 ...
- python自动翻译pdf_在Python中自动执行PDF
python自动翻译pdf Modules used: 使用的模块: In this script, we will use PyPDF2 module which will provide us v ...
- 用python写pdf_用 Python 写了一个 PDF 转换器,以后再也不用花钱转了
class PDF2Word(): def __init__(self): self.machineid = 'ccc052ee5200088b92342303c4ea9399' self.token ...
- python压缩pdf_【转】PDF 用python 压缩
原文链接:https://blog.csdn.net/jylonger/article/details/81109629 目前只针对纯PDF图片压缩 实现原理: 主要通过PYMUPDF进行图片提取,图 ...
- 教你如何用python制作黑板模拟器 python 项目小发明 【安安教具】-【工具】-【黑板】模拟器
黑板模拟器是一个多线程控制尝试,需要做到通过tkinter实现对鼠标的控制和监督.鼠标在移动时会有一个线程来检测鼠标的位置,计算窗口的位置,计算出鼠标在窗口中的位置,结合canvas画布实现对黑板的涂 ...
- 如何用python制作温度计模拟器 python项目小发明 【安安教具】-【物理】-【温度计】模拟器
温度计测量水温的过程要满足如下条件: 1.不能碰烧杯底. 2.不能碰烧杯壁. 设计一款动手实践上面过程的软件,就是接下来要完成的~ 我们先看一下效果: 如何用python制作温度计模拟器 python ...
- 如何用python赚钱_利用python能怎么挣钱
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 6年python,期间写了各种奇葩爬虫,挣各种奇葩的钱,写这篇文章总结下几种爬虫 ...
- Apple M1上如何用pip安装x86的Python Wheel包
最近可能很多人在犹豫要不要买Apple M1的苹果电脑,担心兼容性问题.其实完全不用担心.Apple M1绝对是强大的生产力工具.这里分享下如何用pip安装x86的Python wheel包. 安装p ...
最新文章
- 十三、冒泡排序算法及其优化
- Java从零开始学四十六(Junit)
- UA SIE545 优化理论基础1 例题2 Farkas定理与相关结论
- jQuery选择器整理
- QT的QReadLocker类的使用
- 网站开发与客户之间的流程
- 查找unity工程代码中中文字符
- layui分页limit不显示_【图片】新手 分页显示不了呀【layui吧】_百度贴吧
- mysql order by按照汉字拼音进行排序
- ar - 创建静态库.a文件
- Scale计算公式 - 关于电压值与二进制数值间的转换
- Python出现‘ascii‘ codec can‘t encode characters...的解决方法
- SQLserver如何创建一个表
- oracle 监听报错,Oracle启动监听报错:The listener supports no services解决
- QT5.14.2+VS2017环境安装
- springboot宠物医院管理系统、
- Anaconda2020安装与使用
- 在线考试系统微信小程序的实现(一)
- Entry name ‘res/drawable-xhdpi-v4/ic_launcher.png‘ collided
- matlab寻峰算法,求助我这个寻峰算法该怎么提高灵敏度
热门文章
- 推荐一款广告过滤软件
- 又一巨头从Java迁移到Kotlin:关键应用全部开始切换、安卓代码库超过千万行Kotlin代码
- Java笔试总结(选择题)
- 建模simulink - xpc自定义模块库
- c标准时间与时间戳转换
- torch.diag() 取矩阵对角线元素,torch.diag_embed() 指定值变成对角矩阵
- MySql数据库入门
- 国内智能视频分析监控技术的出路
- 什么从什么写短句_什么是什么,能什么写句子补充完整
- 俄罗斯套娃信封问题 转https://www.jianshu.com/p/9d9495ef4372