公司船务部一个重要任务就是需要准备每单货物的发票,从系统导出发票时是默认存为一个PDF文档,在打印的时候,有多少个文件,就需要点多少次“打印”。如果能够将当天的发票PDF档合并在一个PDF里面,只需要点一次“打印”即可完成。

在网上我们可以搜到很多PDF合并软件,但在真实工作环境下并不是非常实用,比如有些PDF有封面页,我们在合并的时候只需要第一个文件的封面即可,后续的只要封面后的内容。而PDF合并软件是简单粗暴的直接将所有内容合并,那合并后的文件就会多出很多我们不需要的“封面”。

Python有一个库PyPDF2可轻松解决这个小问题,可以实现任意选定页面的合并。通过文件夹遍历,可以将不同文件夹下的PDF按选定的页面合并在一起,方便实用,毫不含糊。

%%time

import PyPDF2 #可从PDF文档提取信息

import os #用于获取需要合并的PDF文件所在路径

path="data/" # 文件夹路径

#1.获取需要用于合并的文件名及路径

files=[]

for file in os.listdir(path):

if file.endswith(".pdf"): #排除文件夹内的其它干扰文件,只获取PDF文件

files.append(path+file)

#2.获取每个PDF文件里面需要的信息并添加到写入文件

pdf_writer=PyPDF2.PdfFileWriter()

for file in files:

pdf_obj=open(file,'rb')# 以二进制读取,将保留PDF中的所有信息

pdf_reader=PyPDF2.PdfFileReader(pdf_obj)

for page_num in range(1,pdf_reader.numPages): #不要第一页的封面,从第2页开始获取

page_obj=pdf_reader.getPage(page_num)

pdf_writer.addPage(page_obj)

#3.写入并保存汇总PDF文件

pdf_output_file=open("data\combined_inv.pdf",'wb') #以二进制写入,将保留源PDF中的所有信息

pdf_writer.write(pdf_output_file)

pdf_output_file.close()

我们先导入PyPDF2和os库。若未安装PyPDF2,可运行"cmd.exe",输入"pip install PyPDF2",请注意PyPDF2有大小写要求,不然无法安装。

然后定义pyth为我们需要操作的文件夹的路径。随后就需要获取我们待合并的所有PDF文件的文件名和路径,并存入我们定义的列表files。如果文件夹内有非pdf文件,也会被获取。比如如下,我们可以看到这个路径下有一个txt文件,那可不是我们想要的。因此需要加入一个筛选,file.endswith(".pdf")我们只要以".pdf"结尾的文件。这样得到的files列表就是我们需要合并的文件及其路径了。files.append(path+file)里面"path+file"是用于将路径和文件名连接起来,这样才能得到文件的完整路径,程序才可以找得到这个文件。

os.listdir(path)

>['combined_inv.pdf',

'INV1.pdf',

'INV2.pdf',

'INV3.pdf',

'INV4.pdf',

'INV5.pdf',

'test.txt']

files

>['data/INV1.pdf',

'data/INV2.pdf',

'data/INV3.pdf',

'data/INV4.pdf',

'data/INV5.pdf']

待合并的PDF文件路径搜集完后,就可以开始逐个读取其中想要的页面了。按照PyPDF2的操作要求,我们需要按如下步骤来进行读取和写入:

1. 打开PDF文件,得到一个“读取”对象。读取对象相当于是盛装这个PDF文件内容的容器。

2.创建一个 “写入” 对象,相当于另一个容器,用于向其中转移上一个步骤读取出来的内容。

3.将页面从 “读取” 容器倒入 “写入” 容器之中。

4.待“写入”容器装完所有需要的内容后,写入并输出新的 PDF。

pdf_writer=PyPDF2.PdfFileWriter()就是用于装待写入文件的容器, PyPDF2.PdfFileWriter()是固定写法,其原理就无需深究了。然后我们读取每个PDF文件,先将打开PDF文件,并存到pdf_obj,然后使用PyPDF2.PdfFileReader(pdf_obj)读取其中的信息,存到pdf_reader,然后再获取其中的页面,此处我们将其中第2页及以后的页(如果有的话)面提取出来。因此range(1,pdf_reader.numPages)是从1开始,因为range是从0索引开始,因此1代表第二页。“pdf_reader.numPages”是该PDF文件的总页数。pdf_reader.getPage(page_num)可获得其中每页的信息,我们将它存入page_obj容器。随后我们使用addPage方法pdf_writer.addPage(page_obj)将page_obj中的信息放入最开始的pdf_writer容器中。

就这样逐个打开相关PDF文件,读取文件,获取页面信息,然后存入pdf_writer容器。如同吃火锅时,从不同的佐料中取我们想要的佐料和量,加入到自己的油碟中一样。

待所有想要合并的页面都加入pdf_writer容器之后,就可以写入新的PDF文件并保存了。先新建一个名为“combined_inv.pdf”的文件,并以二进制打开 open("data\combined_inv.pdf",'wb')。然后将pdf_writer容器中的所有信息用write方法写入到新的文件pdf_writer.write(pdf_output_file)。最后关闭该文件pdf_output_file.close(),操作完成。合并后的PDF文件combined_inv.pdf如下:

所有源代码和说明都在Jupyter notebook上完成,所用到的Excel 资料已上传GitHub, 欢迎Fork或下载到本地随意玩。。。转载请注明出处,谢谢。

GitHub链接:https://github.com/weidylan/Office_Automation_by_Using_Python

微信公众号:Python操作EXCEL高效率工作

python 知乎 合并 pdf_实例4:用Python提取不同PDF文件中的页面合并进新的PDF文件...相关推荐

  1. python现有两个磁盘文件a和b_有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中Python实例...

    有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中Python实例 题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并( ...

  2. python现有两个磁盘文件a和b_有两个磁盘文件a和b,各存放一行字母,今要求把这两个文件中的信息合并...

    有两个磁盘文件"A"和"B",各存放一行字母,今要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件"C"中去. [c源程序] ...

  3. python入门经典图灵pdf_[图灵程序设计丛书].Python数据分析基础[PDF][26.55MB]

    内容简介 本书展示如何用Python程序将不同格式的数据处理和分析任务规模化和自动化.主要内容包括:Python基础知识介绍.CSV文件和Excel文件读写.数据库的操作.示例程序演示.图表的创建,等 ...

  4. php 多个文件,PHP实现将多个文件中的内容合并为新文件的方法示例

    本文实例讲述了PHP实现将多个文件中的内容合并为新文件的方法.分享给大家供大家参考,具体如下: function test() { $hostdir= iconv("utf-8", ...

  5. 使用Python批量实现某一Excel文件中每3行数据存一个Excel文件

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 远芳侵古道,晴翠接荒城. 大家好, ...

  6. python从文件中删除某个字符,后保存该文件

    从文件中删除某个字符,后保存该文件 原本是用vs全部替换,结果发现文件太多了,将近12000个文件,非常费时间,然后就给他写了个脚本哈哈,比较快4秒就搞定了.代码拿走直接就可以用途. #!/usr/b ...

  7. 怎么学python知乎_你是怎么学习Python的 ?

    大家不要看到这个文章的题目,就认为这是一篇广告软文.然而并不是,因为我看到了很多同行都被大数据.人工智能的热潮吸引了,开始纷纷学习python.这是好事,但看到了好多人都走了不少弯路,浪费了时间.于是 ...

  8. python动态显示进度条_实例详解python如何轻松实现动态进度条

    本次的这篇文章主要是和大家分享了关于实例详解python如何轻松实现动态进度条,有需要的小伙伴可以看一下 思路及讲解 假设有一个1000000数据的列表(为了让进度条可以显示出来,很大的数据),我们每 ...

  9. 零基础学python知乎-零基础人员可以学习python吗?|Python培训基础教程

    python是目前市场上比较流行的一种语言,个人认为也是比较有发展前途的编程语言,如果你既然决定想要好好去学习python,那么一定要做好准备,下定决心,制定合适的计算. 相信对于很多基础的小白来说, ...

最新文章

  1. python装饰器作用-什么是Python装饰器,有什么作用?
  2. C# Winform小程序:局域网设置NTP服务器、实现时间同步
  3. python取前三位_python3 获取前几个高频列表元素
  4. Android 第三方有用的库收集
  5. Kali Linux 秘籍 第二章 定制 Kali Linux
  6. Blend_技巧篇_淡入淡出
  7. Python学习资源收集
  8. 在IDEA中玩转DEBUG模式,有BUG不会调试?不存在的。
  9. 作战管理系统:现代化作战体系核心
  10. Python 实现大文件全文翻译
  11. 【组队学习】【38期】组队学习内容详情!
  12. 看雪CTF.TSRC 2018 团队赛 第一题 初世纪 writeup
  13. WIN 10 又出诡异Bug,访问特定本地设备导致系统崩溃
  14. android qq红点,手机QQ的拖动红点消除红点功能是怎么想出来的?
  15. [玩转UE4动画系统]教程的大纲及设计思路
  16. mysql之连接查询
  17. idea设置打开多个窗口
  18. JAVA 定时器的Cron表达式详解
  19. 机器学习——EM和GMM(基于李航老师的推导)
  20. Altera DDR3调试记录

热门文章

  1. 【SystemVerilog基础】SV常用的运算操作符总结
  2. TypeScript 代码整洁之道
  3. jetty服务器使用jersey作为Restful框架
  4. SVM 中的数学和算法
  5. K序列--埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛
  6. Hive - ORC 文件存储格式详细解析
  7. Lua判断一个对象是否为空,包含userdata
  8. 搞了一个论坛玩玩!http://lupeiqing.3322.org/bbs
  9. 深度学习系列11:ReID概述和资源
  10. 百万册热销书《考试脑科学》续作!每个家长都应该买的一本书