处理PDF文档

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理PDF文档相关的知识,希望对你有一定的参考价值。

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

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。

>>> 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()。

>>> 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对象,需要以读二进制的方式打开。

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

效果:

技术分享图片技术分享图片技术分享图片


旋转页面

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

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

效果:

技术分享图片


叠加页面

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

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

效果:

技术分享图片


加密PDF

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

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

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

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

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

效果:

技术分享图片


以上是关于处理PDF文档的主要内容,如果未能解决你的问题,请参考以下文章

Java 处理PDF图章(印章)——图片图章动态图章

Java 合并拆分PDF文档

办公自动化:轻松提取PDF页面数据,并生成Excel文件(代码实战)!

[ jquery 文档处理 insertBefore(content) before(content|fn) ] 此方法用于把所有匹配的元素插入到另一个指定的元素元素集合的前面,实现外部插入(代码片段

是否有任何 Bigdata 工具来处理 pdf 文档

PDF页面怎么删除之PDF文档页面处理技巧