用Python处理PDF_读写批量合并等

浏览: 1957

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库](https://upload-images.jianshu.io/upload_images/2473543-1cba26c8d410aa37.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

### 用pdf2合并和切分PDF

比较几个库之后打算先从PyPDF2快速实现一些功能。其官方文档为[PyPDF2 Documentation](https://pythonhosted.org/PyPDF2/),根据文档,PDF2库包含了 PdfFileReader PdfFileMerger PageObject PdfFileWriter 四个常用的主要的调用类,意思也很明确。

先用`pip install PyPDF2`安装库。

#### 批量合并pdf

```python

import os

from PyPDF2 import PdfFileReader, PdfFileWriter #导入需要的类(库)

wp='D:/doc_of_pdf/' #work_path

#合并同一个文件夹下的pdf文件

flst=[] #获得pdf文件路径

for root, dirs, files in os.walk(wp):

    flst=files

flst=[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()

```

![执行前后对比](https://upload-images.jianshu.io/upload_images/2473543-572df5717e5638f5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

#### 切分pdf为多个pdf

```python

#将一个pdf文件根据一定规则切分为多个

sc_pdf=PdfFileReader(open(flst[0], 'rb')) #对第一章笔记进行处理

count_sc=sc_pdf.getNumPages()

#每7页切分为1个PDF文件

out_pdf=PdfFileWriter() #用以输出pdf

for 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))

```

![切分测试结果截图](https://upload-images.jianshu.io/upload_images/2473543-086fb2e6b96fd5a6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

通过上面的实践,可以看到实现这几个需求高频使用到的方法就是新建一个Reader或Writer对象,通过`.getNumPages()`获取一共的页码,通过`.getPage(page)`获取特定页,`.addPage()`写入页码。

代码同步更新于:[QLWeilcf_pdfProccWithpy.ipynb](https://github.com/QLWeilcf/Stack_lcf/blob/master/pdfProccWithpy.ipynb)。

to be continue…


ps:文章同步于jianshu

## 参考资料

- [PyPDF2 Documentation](https://pythonhosted.org/PyPDF2/)

- [pdfminer](https://pypi.org/project/pdfminer/)

推荐 0
本文由 lyndonlcf 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册