本文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相关推荐

  1. python设计模式pdf_精通Python设计模式 高清晰PDF+源码

    精通Python设计模式讲述了16种基本设计模式,轻松解决软件设计常见问题:借力高效的Python语言,用现实例子展示各模式关键特性. 本书用实际生活中的例子带你了解常用的设计模式,介绍了诸多有关编写 ...

  2. python 原理 pdf_利用Python处理PDF——裁剪和生成新的PDF

    安装 在cmd中输入这一句: pip install -U pdfminer3k -i https://pypi.tuna.tsinghua.edu.cn/simple --user 注意:这里安装的 ...

  3. python自动翻译pdf_在Python中自动执行PDF

    python自动翻译pdf Modules used: 使用的模块: In this script, we will use PyPDF2 module which will provide us v ...

  4. 用python写pdf_用 Python 写了一个 PDF 转换器,以后再也不用花钱转了

    class PDF2Word(): def __init__(self): self.machineid = 'ccc052ee5200088b92342303c4ea9399' self.token ...

  5. python压缩pdf_【转】PDF 用python 压缩

    原文链接:https://blog.csdn.net/jylonger/article/details/81109629 目前只针对纯PDF图片压缩 实现原理: 主要通过PYMUPDF进行图片提取,图 ...

  6. 教你如何用python制作黑板模拟器 python 项目小发明 【安安教具】-【工具】-【黑板】模拟器

    黑板模拟器是一个多线程控制尝试,需要做到通过tkinter实现对鼠标的控制和监督.鼠标在移动时会有一个线程来检测鼠标的位置,计算窗口的位置,计算出鼠标在窗口中的位置,结合canvas画布实现对黑板的涂 ...

  7. 如何用python制作温度计模拟器 python项目小发明 【安安教具】-【物理】-【温度计】模拟器

    温度计测量水温的过程要满足如下条件: 1.不能碰烧杯底. 2.不能碰烧杯壁. 设计一款动手实践上面过程的软件,就是接下来要完成的~ 我们先看一下效果: 如何用python制作温度计模拟器 python ...

  8. 如何用python赚钱_利用python能怎么挣钱

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 6年python,期间写了各种奇葩爬虫,挣各种奇葩的钱,写这篇文章总结下几种爬虫 ...

  9. Apple M1上如何用pip安装x86的Python Wheel包

    最近可能很多人在犹豫要不要买Apple M1的苹果电脑,担心兼容性问题.其实完全不用担心.Apple M1绝对是强大的生产力工具.这里分享下如何用pip安装x86的Python wheel包. 安装p ...

最新文章

  1. 十三、冒泡排序算法及其优化
  2. Java从零开始学四十六(Junit)
  3. UA SIE545 优化理论基础1 例题2 Farkas定理与相关结论
  4. jQuery选择器整理
  5. QT的QReadLocker类的使用
  6. 网站开发与客户之间的流程
  7. 查找unity工程代码中中文字符
  8. layui分页limit不显示_【图片】新手 分页显示不了呀【layui吧】_百度贴吧
  9. mysql order by按照汉字拼音进行排序
  10. ar - 创建静态库.a文件
  11. Scale计算公式 - 关于电压值与二进制数值间的转换
  12. Python出现‘ascii‘ codec can‘t encode characters...的解决方法
  13. SQLserver如何创建一个表
  14. oracle 监听报错,Oracle启动监听报错:The listener supports no services解决
  15. QT5.14.2+VS2017环境安装
  16. springboot宠物医院管理系统、
  17. Anaconda2020安装与使用
  18. 在线考试系统微信小程序的实现(一)
  19. Entry name ‘res/drawable-xhdpi-v4/ic_launcher.png‘ collided
  20. matlab寻峰算法,求助我这个寻峰算法该怎么提高灵敏度

热门文章

  1. 推荐一款广告过滤软件
  2. 又一巨头从Java迁移到Kotlin:关键应用全部开始切换、安卓代码库超过千万行Kotlin代码
  3. Java笔试总结(选择题)
  4. 建模simulink - xpc自定义模块库
  5. c标准时间与时间戳转换
  6. torch.diag() 取矩阵对角线元素,torch.diag_embed() 指定值变成对角矩阵
  7. MySql数据库入门
  8. 国内智能视频分析监控技术的出路
  9. 什么从什么写短句_什么是什么,能什么写句子补充完整
  10. 俄罗斯套娃信封问题 转https://www.jianshu.com/p/9d9495ef4372