用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, PdfFileWriter
with open('zz-pdf.pdf', 'rb') as rf: #需去除特定页面的pdf    in_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/

本文分享自微信公众号 - 蛰虫始航(lyns_sailing)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开源优测

Selenium Webdriver 3.X源码分析之核心代码common

本文主要对Selenium3.X Python3端源码的webdriver核心的通用部分代码common目录进行分析说明,先看下common目录下的目录文件结构...

10240
来自专栏AI研习社

即学即用的30段Python实用代码

原标题 | 30 Helpful Python Snippets That You Can Learn in 30 Seconds or Less

12320
来自专栏伪君子的梦呓

Python 爬取飞猪上全国景点的数据

前段时间有人找我写代码爬点东西,就是爬飞猪上全国景点的当月销量、优惠价、城市这些数据,等我写好了之后,他说不要了…

18830
来自专栏不仅仅是python

机器学习相关的python库介绍

顾名思义,机器学习是计算机编程的科学,通过它可以从不同类型的数据中学习。Arthur Samuel给出的更一般的定义是 - “机器学习是一个研究领域,它使计算机...

11020
来自专栏授客的专栏

selenium win7+selenium2.0+python环境搭建

担心最新版的支持不太好,这里我下载的是python 2.7(selenium之前不支持python3.x)

8420
来自专栏机器学习算法与Python学习

【技巧】11 个 Python Pandas 小技巧让你更高效

Pandas是一个在Python中广泛应用的数据分析包。市面上有很多关于Pandas的经典教程,但本文介绍几个隐藏的炫酷小技巧,我相信这些会对你有所帮助。

12440
来自专栏武培轩的专栏

《Ansible自动化运维:技术与最佳实践》第二章读书笔记

当更新 Ansible 版本时,要更新 git 源码树以及 git 中指向 Ansible 自身的模块(称为 submodules)

11340
来自专栏开源优测

Selenium Webdriver 3.X源码分析之核心目录结构

在看Selenium 3.X核心目录结构前,我们先看一个基础的Selenium使用实例

12420
来自专栏崔庆才的专栏

爬虫智能解析库 Readability 和 Newspaper 的用法

舆情爬虫是网络爬虫一个比较重要的分支,舆情爬虫往往需要爬虫工程师爬取几百几千个新闻站点。比如一个新闻页面我们需要爬取其标题、正文、时间、作者等信息,如果用传统的...

22150
来自专栏开源优测

软件测试人员必备 Python 知识图

的确,我发现身边学 Python 的人越来越多了,因为它简单、高效、优雅而且应用广泛。作为测试工程师,我们会专注于快速的实现功能,用更多的时间去进行探索性的测试...

16320

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励