xinmeng_wit 发表于 2024-6-1 22:15

书籍《Python编程快速上手(第2版)》阅读心得8、处理PDF文件

本帖最后由 xinmeng_wit 于 2024-6-2 11:19 编辑

<p>PDF文件是二进制文件,比纯文本文件要复杂得多。除了文本,它还保持了许多字体、颜色和布局信息。</p>

<p>如果希望程序能读取或写入PDF文档,那么需要做的就不只是将它们的文件名传递给open()了。</p>

<p>好在有些Python模块使得处理PDF文档变得容易。</p>

<p>本篇将学习PDF处理模块PyPDF2。</p>

<p>正式使用这个PyPDF2模块之前,需要先安装该模块,因为该模块并不是python自带的模块。</p>

<p>安装过程不再赘述,请参考之前的系列文章。</p>

<p>&nbsp;</p>

<p>PyPDF2没有办法从PDF文档中提取图像、图标或者其它媒体,但它可以提取文本,并将文本返回为Python字符串。</p>

<p>如下例子用于打开pdf文件,并打印该pdf的总页数,另外还提取pdf文件中第一页的文本内容,并打印出来。</p>

<pre>
<code class="language-python">import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdfFileObj = open('D:\\Machine Learning\\TinyML_ Machine Learning with TensorFlow Lite on Arduino.pdf', 'rb')
# 获取pdfFileReader对象
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
# 打印pdf文件的总页数
print(pdfReader.numPages)
# 获取某一页的page对象
pageObj = pdfReader.getPage(0)
# 打印获取到的page内容
print(pageObj.extractText())
# 关闭pdf文件
pdfFileObj.close()
</code></pre>

<p>程序中首先使用了open函数打开了这个pdf文件,然后使用PyPDF2的函数PdfFileReader函数创建了Reader对象。</p>

<p>接下来利用pdfReader.numPages获取总的页码数。</p>

<p>再使用pdfReader.getPage(0)获取pdf第一页的怕个对象,再用pageObj.extractText()提取文本。</p>

<p>运行结果:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>上面学习了pdf文件的读取,下面将使用PdfFileWriter进行pdf的写入处理。</p>

<p>PdfFileWriter对象可以创建一个新的PDF文档。</p>

<p>但是PyPDF2不能将任意文本写入PDF,不像Python可以写入纯文本文件。</p>

<p>PyPDF2写入PDF的能力,仅限于从其它PDF中复制页面、旋转页面、重叠页面和加密文件。</p>

<p>PyPDF2不允许直接编辑PDF。必须创建一个新的PDF,然后从已有的文档复制内容。</p>

<p>&nbsp;</p>

<p>下面的例子将两个pdf文件合并为一个pdf文件。</p>

<pre>
<code class="language-python">import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdf1FileObj = open('D:\\Python\\pdf1.pdf', 'rb')
pdf2FileObj = open('D:\\Python\\pdf2.pdf', 'rb')
# 获取pdfFileReader对象
pdf1Reader = PyPDF2.PdfFileReader(pdf1FileObj)
pdf2Reader = PyPDF2.PdfFileReader(pdf2FileObj)
# 创建pdfFileWriter对象
pdfWriterObj = PyPDF2.PdfFileWriter()

# 将pdf1的所有page写入到pdfWriterObj对象中
for pageNum in range(pdf1Reader.numPages):
    pageObj = pdf1Reader.getPage(pageNum)
    pdfWriterObj.addPage(pageObj)
# 将pdf2的所有page写入到pdfWriterObj对象中
for pageNum in range(pdf2Reader.numPages):
    pageObj = pdf2Reader.getPage(pageNum)
    pdfWriterObj.addPage(pageObj)

# 定义新的pdf文件对象
pdfOutputFile = open('D:\\Python\\pdf_write.pdf', 'wb')
# 写入到新的pdf
pdfWriterObj.write(pdfOutputFile)

# 关闭所有pdf文件
pdfOutputFile.close()
pdf1FileObj.close()
pdf2FileObj.close()

</code></pre>

<p>运行后,确实将pdf1.pdf和pdf2.pdf合并为了一个pdf_write.pdf。</p>

<p>其实这个就是pdf的创建和复制的功能。</p>

<p>&nbsp;</p>

<p>接下来,再来看一下PDF的旋转的例子。</p>

<pre>
<code class="language-python">import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdf2FileObj = open('D:\\Python\\pdf2.pdf', 'rb')
# 获取pdfFileReader对象
pdf2Reader = PyPDF2.PdfFileReader(pdf2FileObj)
# 获取第一页的内容
page = pdf2Reader.getPage(0)
# 顺时针旋转90度
page.rotateClockwise(90)

# 创建pdfFileWriter对象
pdfWriterObj = PyPDF2.PdfFileWriter()
# page内容写入到pdfWriterObj
pdfWriterObj.addPage(page)

# 定义新的pdf文件对象
pdfOutputFile = open('D:\\Python\\pdf_rotate.pdf', 'wb')
# 写入到新的pdf
pdfWriterObj.write(pdfOutputFile)

# 关闭所有pdf文件
pdfOutputFile.close()
pdf2FileObj.close()

</code></pre>

<p>运行完成后确实生成了一个旋转了90度的新的pdf。</p>

<p>前面已经说明过了,PyPDF2不能对原始的pdf进行编辑,只能将改变过内容另存为新的pdf。</p>

<p> &nbsp;</p>

<p>再来看一个页面叠加的例子,该例子中会将两个pdf的页面叠加在一起形成一个新的pdf,这个的作用是能够很方便的为pdf加上水印,公司标签等等,实际使用中还是相对有用的。</p>

<p>为了演示方便,我这里就不单独制作水印了,直接将前面的pdf1和pdf2进行叠加看一看效果。</p>

<pre>
<code class="language-python">import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdf1FileObj = open('D:\\Python\\pdf1.pdf', 'rb')
# 获取pdfFileReader对象
pdf1Reader = PyPDF2.PdfFileReader(pdf1FileObj)
# 获取第一页的内容
page = pdf1Reader.getPage(0)

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中,并获取pdfFileReader对象
pdfWaterMarkReader = PyPDF2.PdfFileReader(open('D:\\Python\\pdf2.pdf', 'rb'))
# 合并2个page
page.mergePage(pdfWaterMarkReader.getPage(0))

# 创建pdfFileWriter对象
pdfWriterObj = PyPDF2.PdfFileWriter()
# page内容写入到pdfWriterObj
pdfWriterObj.addPage(page)

# 定义新的pdf文件对象
pdfOutputFile = open('D:\\Python\\pdf_water_mark.pdf', 'wb')
# 写入到新的pdf
pdfWriterObj.write(pdfOutputFile)

# 关闭所有pdf文件
pdfOutputFile.close()
pdf1FileObj.close()

</code></pre>

<p>&nbsp;</p>

<p>运行完成后,就会看到生成了pdf_water_mark.pdf,打开该pdf就能看到已经将pdf1和pdf2的内容进行了一个合并。</p>

<p>下面的pdf看上去比较乱,是因为合并了pdf1和pdf2的内容,在实际应用中是将水印或者公司图标与具体内容合并。</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>再来看看pdf的另外一个功能,就是pdf文件的加密。</p>

<p>比如,我们想对前面pdf2文件进行加密,需要先将pdf2的文件的内容提取出来,然后写将密码和内容写到一个新的pdf中,这样就完成了对pdf2的加密,最后将原始的pdf1删除。</p>

<pre>
<code class="language-python">import PyPDF2

# 以读二进制模式打开pdf文件,并将它保存在pdfFileObj中
pdf2FileObj = open('D:\\Python\\pdf2.pdf', 'rb')
# 获取pdfFileReader对象
pdf2Reader = PyPDF2.PdfFileReader(pdf2FileObj)

# 创建pdfFileWriter对象
pdfWriterObj = PyPDF2.PdfFileWriter()

# 写入全部的内容
for pageNum in range(pdf2Reader.numPages):
    pdfWriterObj.addPage(pdf2Reader.getPage(pageNum))

# 写入pdf的密码
pdfWriterObj.encrypt('pdf2_password')

# 定义新的pdf文件对象
pdfOutputFile = open('D:\\Python\\pdf_encrypt.pdf', 'wb')
# 写入到新的pdf
pdfWriterObj.write(pdfOutputFile)

# 关闭所有pdf文件
pdfOutputFile.close()
pdf2FileObj.close()

</code></pre>

<p>程序运行后,就会生成加密的pdf文件pdf_encrypt.pdf,打开该pdf的时候就会提示输入密码,输入字符串pdf2_password后就能成功打开该pdf了。</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>以上就是关于pdf文档处理的全部内容,虽然不能编辑原pdf,但是能够改变一些内容后生成一个新的pdf,在一定程度上也类似与编辑了原来的pdf,在实际项目中用处还是有的,可以实现pdf文档处理的自动化操作了,比如快速提取pdf的指定页的文本内容,给pdf加上水印,给pdf加密,合并、旋转pdf等等。</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

Jacktang 发表于 2024-6-4 07:23

<p>原来Python模块是这样处理PDF文档的</p>

xinmeng_wit 发表于 2024-6-4 19:25

Jacktang 发表于 2024-6-4 07:23
原来Python模块是这样处理PDF文档的

<p>实际上,不能直接在原来的pdf上进行编辑,只能提取文字等,然后创建新的pdf,在新建的pdf上进行操作</p>

ljg2np 发表于 2024-11-19 16:14

<p>通过PyPDF2模块的加载就可以简单的对pdf文件进行处理,也很不错,学习了。</p>
页: [1]
查看完整版本: 书籍《Python编程快速上手(第2版)》阅读心得8、处理PDF文件