当然,PyPDF2并不是什么样的 PDF 文档都能提取出文字来,这个问题就我所知并没有什么特别好的解决方法,尤其是在提取中文的时候。网上也有很多讲解从 PDF 中提取文字的文章,推荐大家自行阅读《三大神器助力Python提取pdf文档信息》一文进行了解。
要从 PDF 文件中提取文本也可以直接使用三方的命令行工具,具体的做法如下所示。
pip install pdfminer.six
pdf2text.py test.pdf
旋转和叠加页面
上面的代码中通过创建PdfFileReader对象的方式来读取 PDF 文档,该对象的getPage方法可以获得PDF文档的指定页并得到一个PageObject对象,通过PageObject对象的rotateClockwise和rotateCounterClockwise方法可以实现页面的顺时针和逆时针方向旋转,通过PageObject对象的addBlankPage方法可以添加一个新的空白页,代码如下所示。
reader = PyPDF2.PdfReader('XGBoost.pdf')
writer = PyPDF2.PdfWriter()
for no, page in enumerate(reader.pages):
if no % 2 == 0:
new_page = page.rotate(-90)
else:
new_page = page.rotate(90)
writer.add_page(new_page)
with open('temp.pdf', 'wb') as file_obj:
writer.write(file_obj)
import PyPDF2
reader = PyPDF2.PdfReader('XGBoost.pdf')
writer = PyPDF2.PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.encrypt('foobared')
with open('temp.pdf', 'wb') as file_obj:
writer.write(file_obj)
批量添加水印
上面提到的PageObject对象还有一个名为mergePage的方法,可以两个 PDF 页面进行叠加,通过这个操作,我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印,我们可以先准备好一个提供水印页面的 PDF 文件,然后将包含水印的PageObject读取出来,然后再循环遍历“XGBoost.pdf”文件的每个页,获取到PageObject对象,然后通过mergePage方法实现水印页和原始页的合并,代码如下所示。
reader1 = PyPDF2.PdfReader('XGBoost.pdf')
reader2 = PyPDF2.PdfReader('watermark.pdf')
writer = PyPDF2.PdfWriter()
watermark_page = reader2.pages[0]
for page in reader1.pages:
page.merge_page(watermark_page)
writer.add_page(page)
with open('temp.pdf', 'wb') as file_obj:
writer.write(file_obj)