如何用Python程序将几十个PDF文件合并成一个PDF?其实只要这四步
wptr33 2025-04-11 08:27 37 浏览
假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将文件合并在一起。让我们来写一个Python程序,定制需要合并到PDF中的页面。
总的来说,该程序需要完成:
- 找到当前工作目录中所有PDF文件。
 - 按文件名排序,这样就能有序地添加这些PDF。
 - 除了第一页之外,将每个PDF的所有页面写入输出的文件。
 
从实现的角度来看,代码需要完成下列任务:
- 调用os.listdir(),找到当前工作目录中的所有文件,去除掉非PDF文件。
 - 调用Python的sort()列表方法,对文件名按字母排序。
 - 为输出的PDF文件创建PdfFileWriter对象。
 - 循环遍历每个PDF文件,为它创建PdfFileReader对象。
 - 针对每个PDF文件,循环遍历每一页,第一页除外。
 - 将页面添加到输出的PDF。
 - 将输出的PDF写入一个文件,名为allminutes.pdf。
 
针对这个项目,打开一个新的文件编辑器窗口,将它保存为combinePdfs.py。
第1步:找到所有PDF文件
首先,程序需要取得当前工作目录中所有带.pdf扩展名的文件列表,并对它们排序。让你的代码看起来像这样:
#! python3
 # combinePdfs.py - Combines all the PDFs in the current working directory into
 # into a single PDF.
 import PyPDF2, os
 # Get all the PDF filenames.
 pdfFiles = []
 for filename in os.listdir('.'):
  if filename.endswith('.pdf'):
 pdfFiles.append(filename)
 pdfFiles.sort(key=str.lower)
 pdfWriter = PyPDF2.PdfFileWriter()
 # TODO: Loop through all the PDF files.
 # TODO: Loop through all the pages (except the first) and add them.
 # TODO: Save the resulting PDF to a file.在#!行和介绍程序做什么的描述性注释之后,代码导入了os和PyPDF2模块。os.listdir(‘.’)调用将返回当前工作目录中所有文件的列表。代码循环遍历这个列表,将带有.pdf扩展名的文件添加到pdfFiles中。然后,列表按照字典顺序排序,调用sort()时带有key/str.lower关键字参数。
代码创建了一个PdfFileWriter对象,保存合并后的PDF页面。最后,一些注释语句简要描述了剩下的程序。
第2步:打开每个PDF文件
现在,程序必须读取pdfFiles中的每个PDF文件。在程序中加入以下代码:
#! python3
# combinePdfs.py - Combines all the PDFs in the current working directory into
# a single PDF.
import PyPDF2, os
# Get all the PDF filenames.
pdfFiles = []
--snip--
# Loop through all the PDF files.
for filename in pdfFiles:
pdfFileObj = open(filename, 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
# TODO: Loop through all the pages (except the first) and add them.
# TODO: Save the resulting PDF to a file.针对每个PDF文件,循环内的代码调用open(),以’wb’作为第二个参数,用读二进制的模式打开文件。open()调用返回一个 File 对象,它被传递给PyPDF2.PdfFileReader(),创建针对那个PDF文件的PdfFileReader对象。
第3步:添加每一页
针对每个PDF文件,需要循环遍历每一页,第一页除外。在程序中添加以下代码:
 #! python3
 # combinePdfs.py - Combines all the PDFs in the current working directory into
 # a single PDF.
 import PyPDF2, os
 --snip--
 # Loop through all the PDF files.
 for filename in pdfFiles:
 --snip--
  # Loop through all the pages (except the first) and add them.
 for pageNum in range(1, pdfReader.numPages):
  pageObj = pdfReader.getPage(pageNum)
  pdfWriter.addPage(pageObj)
 # TODO: Save the resulting PDF to a file.for循环内的代码将每个Page对象拷贝到PdfFileWriter对象。要记住,你需要跳过第一页。因为PyPDF2认为0是第一页,所以循环应该从1开始,然后向上增长到pdfReader.numPages中的整数,但不包括它。
第4步:保存结果
在这些嵌套的for循环完成后,pdfWriter变量将包含一个PdfFileWriter对象,合并了所有PDF的页面。最后一步是将这些内容写入硬盘上的一个文件。在程序中添加以下代码:
#! python3
# combinePdfs.py - Combines all the PDFs in the current working directory into
# a single PDF.
import PyPDF2, os
--snip--
# Loop through all the PDF files.
for filename in pdfFiles:
--snip--
# Loop through all the pages (except the first) and add them.
for pageNum in range(1, pdfReader.numPages):
--snip--
# Save the resulting PDF to a file.
pdfOutput = open('allminutes.pdf', 'wb')
pdfWriter.write(pdfOutput)
pdfOutput.close()向open()传入’wb’,以写二进制的模式打开输出PDF文件allminutes.pdf。然后,将得到的File对象传给write()方法,创建实际的PDF文件。调用close()方法,结束程序。
第5步:类似程序的想法
能够利用其他PDF文件的页面创建PDF文件,这让你的程序能完成以下任务:
- 从PDF文件中截取特定的页面。
 - 重新调整PDF文件中页面的次序。
 - 创建一个PDF文件,只包含那些具有特定文本的页面。文本由extractText()来确定。
本文摘自:《Python编程快速上手 让繁琐工作自动化》 
本书是一本面向实践的Python编程实用指南。本书的目的,不仅是介绍Python语言的基础知识,而且还通过项目实践教会读者如何应用这些知识和技能。本书的第一部分介绍了基本的Python编程概念,第二部分介绍了一些不同的任务,通过编写Python程序,可以让计算机自动完成它们。第二部分的每一章都有一些项目程序,供读者学习。每章的末尾还提供了一些习题和深入的实践项目,帮助读者巩固所学的知识。附录部分提供了所有习题的解答。
本书适合任何想要通过Python学习编程的读者,尤其适合缺乏编程基础的初学者。通过阅读本书,读者将能利用最强大的编程语言和工具,并且将体会到Python编程的快乐。
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
 - 
                        
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
 
- 继续学习Python中的while true/break语句
 - 
                        
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
 
- python continue和break的区别_python中break语句和continue语句的区别
 - 
                        
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
 
- 简单学Python——关键字6——break和continue
 - 
                        
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
 
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
 - 
                        
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
 
- Python 中 break 和 continue 傻傻分不清
 - 
                        
大家好啊,我是大田。...
 
- python中的流程控制语句:continue、break 和 return使用方法
 - 
                        
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
 
- L017:continue和break - 教程文案
 - 
                        
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
 
- 作为前端开发者,你都经历过怎样的面试?
 - 
                        
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
 
- 面试被问 const 是否不可变?这样回答才显功底
 - 
                        
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
 
- 2023金九银十必看前端面试题!2w字精品!
 - 
                        
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
 
- 前端面试总结_前端面试题整理
 - 
                        
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
 
- 由浅入深,66条JavaScript面试知识点(七)
 - 
                        
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
 
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
 - 
                        
添加图片注释,不超过140字(可选)...
 
- 今年最常见的前端面试题,你会做几道?
 - 
                        
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
 
- 一周热门
 
- 最近发表
 - 
- oracle数据导入导出_oracle数据导入导出工具
 - 继续学习Python中的while true/break语句
 - python continue和break的区别_python中break语句和continue语句的区别
 - 简单学Python——关键字6——break和continue
 - 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
 - Python 中 break 和 continue 傻傻分不清
 - python中的流程控制语句:continue、break 和 return使用方法
 - L017:continue和break - 教程文案
 - 作为前端开发者,你都经历过怎样的面试?
 - 面试被问 const 是否不可变?这样回答才显功底
 
 
- 标签列表
 - 
- git pull (33)
 - git fetch (35)
 - mysql insert (35)
 - mysql distinct (37)
 - concat_ws (36)
 - java continue (36)
 - jenkins官网 (37)
 - mysql 子查询 (37)
 - python元组 (33)
 - mybatis 分页 (35)
 - vba split (37)
 - redis watch (34)
 - python list sort (37)
 - nvarchar2 (34)
 - mysql not null (36)
 - hmset (35)
 - python telnet (35)
 - python readlines() 方法 (36)
 - munmap (35)
 - docker network create (35)
 - redis 集合 (37)
 - python sftp (37)
 - setpriority (34)
 - c语言 switch (34)
 - git commit (34)
 
 
