处理PDF文档

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

用于处理PDF的模块是PyPDF2(区分大小写),使用pip安装。

1
2
3
4
5
6
7
8
9
10
11
12
13
c:\python\Scripts>pip3.6  install  PyPDF2
Collecting PyPDF2
   Downloading PyPDF2-1.26.0. tar .gz (77kB)
     100% |████████████████████████████████| 81kB 69kB /s
Installing collected packages: PyPDF2
   Running setup.py  install  for  PyPDF2 ...  done
Successfully installed PyPDF2-1.26.0
 
c:\python>python.exe
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC  v .1900 64 bit (AMD64)] on win32
Type  "help" "copyright" "credits"  or  "license"  for  more  information.
>>>  import  PyPDF2
>>>


从PDF提取文本

PyPDF2没有办法从PDF文档中提取图像、图表或其他媒体,但它可以提取文本,并将文本返回为python字符串。

PyPDF2从PDF提取文本时可能会出错,甚至根本不能打开某些PDF。

1
2
3
4
5
6
7
8
9
10
>>>  import  PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' )           ##采用二进制模式打开
>>> pdfReader = PyPDF2.PdfFileReader(pdf1)
PdfReadWarning: Xref table  not  zero - indexed.  ID  numbers  for  objects will be corrected. [pdf.py: 1736 ]
>>> pdfReader.numPages          ##文档总页数
20
>>> page1 = pdfReader.getPage( 0 )   ##首页下标为0
>>> page1.extractText()          ##返回该页文本的字符串
'  H3C S12500 QoS\n  www.h3c.com.cn \n121NI H3C S12500 QoS \n2O......SP Strict Priority \n ToS Type of Service \n '
>>>


解密PDF

某些PDF文档有加密功能,以防止别人阅读,只有在打开文档时提供口令才能阅读。

在文件用正确的口令解密之前,尝试调用函数来读取文件,将会导致错误。

decrypt()方法只解密了PdfFileReader对象,而不是实际的PDF文件。在程序中止后,硬盘上的文件仍然是加密的。程序下次运行时,仍然需要再次调用decrypt()。

1
2
3
4
5
6
7
>>>  import  PyPDF2
>>> pdfReader = PyPDF2.PdfFileReader( open ( '125003.pdf' , 'rb' ))
>>> pdfReader.isEncrypted            ##判断是否加密
True
>>> pdfReader.decrypt( 'password' )    ##使用口令解密,返回0表示失败
1
>>>


创建PDF

PdfFileWriter可以创建一个新的PDF文件。

它的能力仅限于从其他PDF中拷贝页面、旋转页面、重叠页面和加密文件。

模块不允许直接编辑PDF。必须创建一个新的PDF,然后从已有的文档拷贝内容。

  • 操作步骤:

1、打开一个或多个已有的PDF,得到PdfFileReader对象

2、创建一个新的PdfFileReader对象

3、将页面从PdfFileReader对象拷贝到PdfFileWriter对象中

4、最后,利用PdfFileWriter对象写入输出的PDF

创建一个PdfFileWriter对象,只是在Python中创建一个代表PDF文档的值,这并没有创建实际的PDF文件,要实际生成文件,必须调用PdfFileWriter对象的write()方法。


拷贝页面

PyPDF2不能在PdfFileWriter对象中间插入页面,addPage()方法只能够在末尾添加页面。

传递给PyPDF2.PdfFileReader()的File对象,需要以读二进制的方式打开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>>  import  PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' )
>>> pdf2 = open ( '125002.pdf' , 'rb' )
>>> pdf1Reader = PyPDF2.PdfFileReader(pdf1)
>>> pdf2Reader = PyPDF2.PdfFileReader(pdf2)
>>> pdfWriter = PyPDF2.PdfFileWriter()
>>>  for  page  in  range (pdf1Reader.numPages):
...     pageObj = pdf1Reader.getPage(page)
...     pdfWriter.addPage(pageObj)
...
>>>  for  page  in  range (pdf2Reader.numPages):
...     pageObj = pdf2Reader.getPage(page)
...     pdfWriter.addPage(pageObj)
...
>>> pdfFile = open ( 'new.pdf' , 'wb' )   ##生成新PDF文件,包含前面几个文档的内容
>>> pdfWriter.write(pdfFile)
>>> pdfFile.close()
>>> pdf1.close()
>>> pdf2.close()

效果:

blob.pngblob.pngblob.png


旋转页面

利用rotateClockwise()和rotateCounterClockwise()方法,PDF文档的页面也可以旋转90度的整数倍。

1
2
3
4
5
6
7
8
9
10
11
12
>>>  import  PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' )
>>> pdf1Reader = PyPDF2.PdfFileReader(pdf1)
>>> page = pdf1Reader.getPage( 0 )
>>> page.rotateClockwise( 90 )
{ '/CropBox' : [ 0 0 595.22 842 ],  '/Parent' : IndirectObject( 476 0 ),  '/Conten......0' : IndirectObject( 491 0 )}},  '/Type' '/Page' }
>>> pdfWriter = PyPDF2.PdfFileWriter()
>>> pdfWriter.addPage(page)
>>> newFile = open ( 'newfile.pdf' , 'wb' )
>>> pdfWriter.write(newFile)
>>> newFile.close()
>>> pdf1.close()

效果:

blob.png


叠加页面

通过叠加页面的方式,很容易为多个文件添加水印,并且只针对程序指定的页面添加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>>  import  PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' )
>>> pdf1Reader = PyPDF2.PdfFileReader(pdf1)
>>> pdf1Page1 = pdf1Reader.getPage( 0 )
>>> pdfMarkReader = PyPDF2.PdfFileReader( open ( '125002.pdf' , 'rb' ))
>>> pdf1Page1.mergePage(pdfMarkReader.getPage( 0 ))
>>> pdfWriter = PyPDF2.PdfFileWriter()
>>> pdfWriter.addPage(pdf1Page1)
>>>  for  page  in  range ( 1 ,pdf1Reader.numPages):
...     pageObj = pdf1Reader.getPage(page)
...     pdfWriter.addPage(pageObj)
...
>>> resultFile = open ( 'result.pdf' , 'wb' )
>>> pdfWriter.write(resultFile)
>>> pdf1.close()
>>> resultFile.close()

效果:

blob.png


加密PDF

PdfFileWriter对象也可以为PDF文档进行加密。

PDF可以有一个用户口令(允许查看这个PDF)和一个拥有者口令(允许设置打印、注释、提取文本和其他功能的许可)。

用户口令和拥有者口令分别是encrypt()的第一个和第二个参数。

如果只传入一个字符串给encrypt(),它将作为两个口令。

1
2
3
4
5
6
7
8
9
10
11
12
>>>  import  PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' )
>>> pdf1Reader = PyPDF2.PdfFileReader(pdf1)
>>> pdfWriter = PyPDF2.PdfFileWriter()
>>>  for  page  in  range (pdf1Reader.numPages):
...     pdfWriter.addPage(pdf1Reader.getPage(page))
...
>>> pdfWriter.encrypt( '123456' )
>>> encryptFile = open ( 'encrypt.pdf' , 'wb' )
>>> pdfWriter.write(encryptFile)
>>> encryptFile.close()
>>> pdf1.close()

效果:

QQ图片20171215232355.png








本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/2051209,如需转载请自行联系原作者
相关文章
|
7月前
|
Ubuntu Java Linux
在Spring Boot中使用iTextPDF创建动态PDF文档
iTextPDF 是一个用于创建和操作 PDF(Portable Document Format)文档的流行的 Java 库。它提供了一套全面的功能,用于处理 PDF 文件,包括创建新文档、修改现有文档以及提取信息。
429 1
|
1月前
|
API C#
在.NET中使用QuestPDF高效地生成PDF文档
在.NET中使用QuestPDF高效地生成PDF文档
|
7月前
|
数据挖掘 程序员 数据安全/隐私保护
解锁PDF潜力:9个Python库让你的文档处理更高效
程序员晚枫分享了Python处理PDF的9个第三方库,包括PyPDF2、pdfrw、ReportLab、pikepdf、pdfplumber、pdfminer.six、PyMuPDF、popdf和borb,各具优缺点。选择时需考虑应用场景、功能需求、库的维护状态和开源协议。例如,pdfplumber擅长内容提取,而ReportLab和PyMuPDF适用于创建和修改内容。
839 7
|
4月前
|
C# 开发者 Windows
WPF与PDF文档:解锁创建和编辑PDF文件的新技能——从环境配置到代码实践,手把手教你如何在WPF应用中高效处理PDF,提升文档管理效率
【8月更文挑战第31天】随着数字文档的普及,PDF因跨平台兼容性和高保真度成为重要格式。WPF虽不直接支持PDF处理,但借助第三方库(如iTextSharp)可在WPF应用中实现PDF的创建与编辑。本文通过具体案例和示例代码,详细介绍了如何在WPF中集成PDF库,并展示了从设计用户界面到实现PDF创建与编辑的完整流程。不仅包括创建新文档的基本步骤,还涉及在现有PDF中添加页眉页脚等高级功能。通过这些示例,WPF开发者可以更好地掌握PDF处理技术,提升应用程序的功能性和实用性。
173 0
|
4月前
|
开发框架 前端开发 JavaScript
在Winform分页控件中集成导出PDF文档的功能
在Winform分页控件中集成导出PDF文档的功能
|
4月前
[PDF提取重命名]提取识别文字并对PDF文件批量重命名,提取PDF指定可复制的内容并批量重命名PDF,批量PDF文档指定识别提取区域
本文介绍一款实用工具,能快速从可复制内容的PDF中提取指定区域信息并据此重命名文件。设置提取坐标及导入PDF文档、设定新文件名后启动提取流程,即可高效批量处理。保存坐标设置以便重复使用,适用于需频繁修改大量PDF文件名的场景。
442 0
[PDF提取重命名]提取识别文字并对PDF文件批量重命名,提取PDF指定可复制的内容并批量重命名PDF,批量PDF文档指定识别提取区域
|
5月前
|
JavaScript Java
Java 将Markdown文件转换为Word和PDF文档
【7月更文挑战第5天】Java中使用`Spire.Doc for Java`库可方便地将Markdown转换为Word或PDF。基本步骤包括导入模块,创建`Document`对象,加载Markdown文件,然后保存为目标格式(`.docx`或`.pdf`)。若遇到`Invalid UTF-8 stream`错误,需确保Markdown文件是UTF-8无BOM编码。页面设置可通过`PageSetup`类调整。注意,实际应用会依据具体需求和环境有所调整。
324 6
|
5月前
|
JavaScript 数据库
文本,在线浏览PDF,一个最简单的文档标准样式,文档预览非常简单的样式,文档管理样式设计,标准,好的设计
文本,在线浏览PDF,一个最简单的文档标准样式,文档预览非常简单的样式,文档管理样式设计,标准,好的设计
|
5月前
|
Unix Linux Shell
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
|
6月前
|
Java 数据安全/隐私保护
Java使用PDFBox开发包实现对PDF文档内容编辑与保存
Java使用PDFBox开发包实现对PDF文档内容编辑与保存
261 7