设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 101|回复: 19

Python使用PyPDF2库实现向PDF文件中插入内容

[复制链接]

4

主题

54

回帖

196

积分

注册会员

积分
196
发表于 2024-4-20 09:41:59 | 显示全部楼层 |阅读模式
目录


一、引言

PDF(Portable Document Format)文件因其跨平台、不易被篡改的特性,广泛应用于日常办公和文档交流中。在实际应用中,我们经常需要将一个PDF文件的内容插入到另一个PDF文件的指定位置。这通常需要使用专门的PDF处理工具或库来完成。Python的PyPDF2库就是这样一个强大的工具,它允许我们方便地操作PDF文件,包括合并、拆分、旋转页面等操作。

二、PyPDF2库的安装

首先,我们需要安装PyPDF2库。可以使用pip命令进行安装:
  1. pip install PyPDF2
复制代码
三、PyPDF2库的基本使用

PyPDF2库提供了多个类和方法,用于处理PDF文件。其中,PdfFileReader类用于读取PDF文件的内容,而PdfFileWriter类则用于创建和写入PDF文件。
下面是一个简单的示例,演示如何使用PyPDF2库合并两个PDF文件:
  1. from PyPDF2 import PdfFileReader, PdfFileWriter  
  2.   
  3. # 创建PDF写入对象  
  4. output = PdfFileWriter()  
  5.   
  6. # 读取第一个PDF文件  
  7. input1 = PdfFileReader(open("file1.pdf", "rb"))  
  8.   
  9. # 读取第二个PDF文件  
  10. input2 = PdfFileReader(open("file2.pdf", "rb"))  
  11.   
  12. # 将第一个PDF文件的所有页面添加到输出文件中  
  13. for i in range(input1.getNumPages()):  
  14.     output.addPage(input1.getPage(i))  
  15.   
  16. # 将第二个PDF文件的所有页面添加到输出文件中  
  17. for i in range(input2.getNumPages()):  
  18.     output.addPage(input2.getPage(i))  
  19.   
  20. # 将合并后的PDF文件写入到新的文件中  
  21. with open("output.pdf", "wb") as outputStream:  
  22.     output.write(outputStream)
复制代码
四、在PDF文件中插入内容

要在第一个PDF文件的中间插入第二个PDF文件的内容,我们需要对上面的代码进行一些修改。具体步骤如下:
读取第一个和第二个PDF文件。
将第一个PDF文件的部分页面添加到输出文件中。
将第二个PDF文件的所有页面添加到输出文件中。
将第一个PDF文件的剩余页面添加到输出文件中。
将合并后的PDF文件写入到新的文件中。
下面是一个完整的示例代码:
  1. from PyPDF2 import PdfFileReader, PdfFileWriter  
  2.   
  3. # 定义要插入的起始页码  
  4. insert_start_page = 3  # 假设要在第一个PDF文件的第3页后插入第二个PDF文件的内容  
  5.   
  6. # 创建PDF写入对象  
  7. output = PdfFileWriter()  
  8.   
  9. # 读取第一个PDF文件  
  10. input1 = PdfFileReader(open("file1.pdf", "rb"))  
  11.   
  12. # 读取第二个PDF文件  
  13. input2 = PdfFileReader(open("file2.pdf", "rb"))  
  14.   
  15. # 将第一个PDF文件的前insert_start_page-1页添加到输出文件中  
  16. for i in range(insert_start_page - 1):  
  17.     output.addPage(input1.getPage(i))  
  18.   
  19. # 将第二个PDF文件的所有页面添加到输出文件中  
  20. for i in range(input2.getNumPages()):  
  21.     output.addPage(input2.getPage(i))  
  22.   
  23. # 将第一个PDF文件的剩余页面添加到输出文件中  
  24. for i in range(insert_start_page - 1, input1.getNumPages()):  
  25.     output.addPage(input1.getPage(i))  
  26.   
  27. # 将合并后的PDF文件写入到新的文件中  
  28. with open("output.pdf", "wb") as outputStream:  
  29.     output.write(outputStream)
复制代码
在上面的代码中,我们定义了一个变量insert_start_page,表示要在第一个PDF文件的哪一页后插入第二个PDF文件的内容。然后,我们通过循环将第一个PDF文件的前insert_start_page-1页和剩余页面分别添加到输出文件中,并在中间插入了第二个PDF文件的所有页面。

五、注意事项和扩展

在处理大文件或需要高性能的场景时,可以考虑使用其他更高效的PDF处理库,如PyMuPDF(fitz)或pdfplumber。
PyPDF2库在处理复杂的PDF文件(如包含加密、数字签名或特殊字体)时可能会遇到一些问题。在实际应用中,需要根据具体情况选择合适的库和工具。
如果需要更精细地控制PDF文件的布局和格式,可以考虑使用专业的PDF编辑软件或库进行手动编辑或编程处理。

六、知识补充

除了向PDF中插入内容,小编还为大家整理了一些其他PyPDF2库操作PDF的方法,感兴趣的可以了解下
读取PDF中的内容
  1. # author:mlnt
  2. # createdate:2022/8/16
  3. import PyPDF2    # 导入PyPDF2模块

  4. # 官方文档:https://pypi.org/project/PyPDF2/
  5. # 1.打开PDF文件
  6. pdf = open(file='test.pdf', mode='rb')  # 以二进制方式打开

  7. # 2.获取PDF文件的页数
  8. # 打开PDF文件成功后,可使用PdfFileReader()方法读取PDF内容
  9. pdf_reader = PyPDF2.PdfFileReader(pdf)  # 读取PDF内容
  10. print(f'PDF页数为:{pdf_reader.numPages}')
  11. print(f'PDF页数为:{len(pdf_reader.pages)}')

  12. # 3.读取PDF页面内容
  13. """
  14. - 使用PdfFileReader()方法读取PDF文件后,可使用getPage(n)(或pages[n])获取第n页的PDF内容
  15. - PDF页面从第0页开始计算
  16. - 页面内容被读入后,可使用extractText()取得该页的字符串内容
  17. """
  18. for i in range(pdf_reader.numPages):
  19.     pageObj = pdf_reader.getPage(i)  # 读取第i页内容
  20.     # pageObj = pdf_reader.pages[i]  # 读取第i页内容
  21.     page_content = pageObj.extractText()  # 提取页面内容
  22.     print(page_content)
复制代码
PDF简单加密与解密
  1. # author:mlnt
  2. # createdate:2022/8/16

  3. import PyPDF2
  4. from PyPDF2 import PdfReader, PdfWriter


  5. def checkEncrypted(filename):
  6.     """检查文件是否加密"""
  7.     pdfObj = open(file=filename, mode='rb')  # 以二进制方式打开
  8.     pdfRd = PyPDF2.PdfFileReader(pdfObj)  # 读取PDF内容
  9.     # 判断文件是否加密
  10.     if pdfRd.isEncrypted:
  11.         print(f'{filename}属于加密文件')
  12.     else:
  13.         print(f'{filename}未加密')


  14. def pdfEncrypt(filename):
  15.     """pdf加密"""
  16.     reader = PdfReader(filename)  # 创建RdfReader对象
  17.     writer = PdfWriter()  # 创建PdfWriter对象

  18.     # 将所有页面添加到writer
  19.     for page in reader.pages:
  20.         # PDF页面旋转
  21.         page.rotate_clockwise(90)  # 旋转90度
  22.         page.rotate_clockwise(-180)  # 逆时针旋转180度
  23.         writer.add_page(page)

  24.     # 添加密码
  25.     writer.encrypt('123456')

  26.     new_name = filename[:filename.rfind('.pdf')] + '-encrypted.pdf'
  27.     # 保存pdf
  28.     with open(new_name, 'wb') as f:
  29.         writer.write(f)


  30. def pdfDecrypt(filename):
  31.     """pdf解密"""
  32.     reader = PdfReader(filename)
  33.     writer = PdfWriter()

  34.     # 判断是否加密
  35.     if reader.isEncrypted:
  36.         reader.decrypt('123456')

  37.     for page in reader.pages:
  38.         writer.add_page(page)

  39.     new_name = filename[:filename.rfind('.pdf')] + '-decrypted.pdf'
  40.     # 保存pdf
  41.     with open(new_name, 'wb') as f:
  42.         writer.write(f)


  43. checkEncrypted('test.pdf')
  44. pdfEncrypt('test.pdf')
  45. pdfDecrypt('test-encrypted.pdf')
复制代码
合并PDF文件
  1. # author:mlnt
  2. # createdate:2022/8/16
  3. from PyPDF2 import PdfMerger

  4. merger = PdfMerger()  # 创建PdfMerger对象

  5. pdf1 = open('test.pdf', 'rb')

  6. pdf2 = open('watermark.pdf', 'rb')

  7. # 将整个文档添加到merger
  8. merger.append(fileobj=pdf1)

  9. # 将pdf2插入到merger,从第0页开始
  10. merger.merge(position=0, fileobj=pdf2)

  11. with open('merger-test.pdf', 'wb') as f:
  12.     merger.write(f)

  13. merger.close()
复制代码
七、总结

通过本文的介绍,我们了解了如何使用Python的PyPDF2库将一个PDF文件的内容插入到另一个PDF文件的指定位置。通过合理的代码组织和注释,新手朋友可以更容易地理解并掌握这一技术。当然,PyPDF2库只是众多PDF处理工具之一,根据实际需求,我们还可以选择其他更适合的库或工具来完成PDF文件的处理工作。
到此这篇关于Python使用PyPDF2库实现向PDF文件中插入内容的文章就介绍到这了,更多相关Python PyPDF2向PDF插入内容内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

5

主题

70

回帖

252

积分

中级会员

积分
252
发表于 2024-4-25 15:45:51 | 显示全部楼层
太棒了!感谢分享这个信息!

2

主题

53

回帖

151

积分

注册会员

积分
151
发表于 2024-5-20 18:40:28 | 显示全部楼层
感谢分享,受益匪浅!
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 打卡月天数:0
  • 打卡总奖励:92
  • 最近打卡:2024-07-21 14:48:32

26

主题

43

回帖

816

积分

高级会员

积分
816

热心会员付费会员

发表于 2024-5-26 18:01:10 | 显示全部楼层
感谢分享,受益匪浅!

3

主题

62

回帖

192

积分

注册会员

积分
192
发表于 2024-6-26 23:22:56 | 显示全部楼层
太棒了!感谢分享这个信息!

4

主题

78

回帖

224

积分

中级会员

积分
224
发表于 2024-7-15 08:43:08 | 显示全部楼层
我想了解更多

0

主题

27

回帖

55

积分

注册会员

积分
55
发表于 2024-7-21 09:52:33 | 显示全部楼层
顶一个,观点非常中肯!

0

主题

13

回帖

27

积分

新手上路

积分
27
发表于 2024-7-21 16:39:41 | 显示全部楼层
这个话题很有趣,我想多了解一些

0

主题

40

回帖

83

积分

等待验证会员

积分
83

热心会员付费会员

发表于 2024-8-9 13:58:03 | 显示全部楼层
我完全同意你的观点

1

主题

41

回帖

105

积分

注册会员

积分
105
发表于 2024-8-29 15:27:31 | 显示全部楼层
这个话题很有趣,我想多了解一些
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-15 05:13 , Processed in 0.088868 second(s), 27 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表