在Python中使用PDF
我相信,你們一定對(duì)pdf非常熟悉。事實(shí)上,它也是非常重要并且應(yīng)用廣泛的一種數(shù)字媒體。PDF全稱是Portable Document Format,即可移植的文檔格式。它使用.pdf作為擴(kuò)展名。用于可靠的呈現(xiàn)和交換文檔,與軟件,硬件和操作系統(tǒng)無(wú)關(guān)。
pdf使用Adobe公司開(kāi)發(fā),現(xiàn)在由國(guó)際標(biāo)準(zhǔn)化組織ISO進(jìn)行維護(hù)。PDF合成包含鏈接和按鈕,表單字段,音頻,視頻和業(yè)務(wù)邏輯
在這篇文章中,我們將學(xué)習(xí)如何做一些pdf的操作:
從PDF中提取文字
旋轉(zhuǎn)pdf頁(yè)
合并pdf
分割pdf
向pdf頁(yè)中添加水印
使用簡(jiǎn)單的python腳本
1、安裝
我們將使用第三方的模塊 PyPDF2
PyPDF2是作為PDF工具包構(gòu)建的python庫(kù),它能夠:
- 提取文檔信息(標(biāo)題,作者,...)
- 按頁(yè)拆分文檔
- 逐頁(yè)合并文檔
- 裁剪頁(yè)面
- 合并多個(gè)頁(yè)面到一個(gè)頁(yè)
- 對(duì)pdf文檔進(jìn)行加密解密
- 等等
安裝PyPDF2,在命令行下執(zhí)行命令:
pip install PyPDF2
注意,這個(gè)模塊的名字對(duì)大小寫是敏感的,所以,確保y是小寫的,其他字母都是大寫的
2、使用模塊
- 從pdf中提取文字
import PyPDF2
pdfFile = open('example.pdf','rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
print(pdfReader.numPages)
page = pdfReader.getPage(0)
print(page.extractText())
pdfFile.close()
在我的機(jī)子上輸出如下:
241
Copyright ? 201
7
by OriginLab Corporation
All rights reserved. No part of the contents of this book may be reproduced or
transmitted in any form or by any means without the written permission of OriginLab
Corporation.
OriginLab, Origin,
and LabTalk are either registered trademarks or trademarks of
OriginLab Corporation. Other product and company names mentioned herein may be
the trademarks of their respective owners.
我們來(lái)逐步分析一下上面的代碼
pdfFile = open('example.pdf','rb')
我們以二進(jìn)制的方式打開(kāi)example.pdf,并且保存為pdfFile
pdfReader = PyPDF2.PdfFileReader(pdfFile)
我們創(chuàng)建了一個(gè)PyPDF2模塊中PdfFileReader類的對(duì)象,并將pdfFile對(duì)象傳進(jìn)去,獲取pdfReader對(duì)象
print(pdfReader.numPages)
numPages 屬性保存了pdf的頁(yè)數(shù),在我的例子中,numPages = 241
page = pdfReader.getPage(0)
現(xiàn)在,我們創(chuàng)建了一個(gè)page對(duì)象。pdfReader的getPage方法可以接受頁(yè)碼參數(shù),并返回頁(yè)面對(duì)象。
print(page.extractText())
page的extractText()方法,可以提取出頁(yè)面中的文字
pdfFile.close()
最后,關(guān)閉打開(kāi)的example.pdf
注意:雖然PDF文件非常適合以一種便于打印和閱讀的方式顯示文本,但是對(duì)于軟件來(lái)說(shuō),將其解析為純文本并不容易。因此,PyPDF2在從PDF中提取文本時(shí)可能會(huì)出錯(cuò),甚至可能根本無(wú)法打開(kāi)某些PDF。不幸的是,你對(duì)此無(wú)能為力。PyPDF2可能無(wú)法處理某些特定的PDF文件。
- 旋轉(zhuǎn)pdf頁(yè)
import PyPDF2
def PDFrotate(origFileName,newFileName,rotation):
pdfFile = open(origFileName,'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
pdfWriter = PyPDF2.PdfFileWriter()
for page in range(pdfReader.numPages):
pageObj = pdfReader.getPage(page)
pageObj.rotateClockwise(rotation)
pdfWriter.addPage(pageObj)
newFile = open(newFileName,'wb')
pdfWrite.write(newFile)
pdfFile.close()
newFile.close()
def main():
origFileName = 'example.pdf'
newFileName = 'rotated_example.pdf'
rotation = 270
PDFrotate(origFileName,newFileName,rotation)
if __name__ == "__main__":
main()
我們看一下關(guān)鍵的代碼:
pdfWriter = PyPDF2.PdfFileWriter()
因?yàn)槲覀兪菍⑿D(zhuǎn)后的頁(yè)面寫入新的pdf,所以首先創(chuàng)建一個(gè)PdfFileWriter對(duì)象:pdfWriter。
for page in range(pdfReader.numPages):
pageObj = pdfReader.getPage(page)
pageObj.rotateClockwise(rotation)
pdfWriter.addPage(pageObj)
通過(guò)pdfReader.numPages,獲取pdf的頁(yè)數(shù),然后進(jìn)行循環(huán)。
循環(huán)體中,先創(chuàng)建每一頁(yè)的對(duì)象,然后調(diào)用頁(yè)面對(duì)象的rotateClockwise方法,傳入的參數(shù)是順時(shí)針旋轉(zhuǎn)的度數(shù)。最后,旋轉(zhuǎn)后的頁(yè)面對(duì)象作為參數(shù)傳給pdfWriter的addPage方法。
newFile = open(newFileName,'wb')
pdfWrite.write(newFile)
pdfFile.close()
newFile.close()
打開(kāi)新的文件,以寫的方式,將我們新生成的pdf寫入。然后關(guān)閉兩個(gè)文件
- 合并pdf文件
import PyPDF2
def PDFmerge(pdfs,output):
#創(chuàng)建一個(gè)pdf文件合并對(duì)象
pdfMerger = PyPDF2.PdfFileMerger()
#逐個(gè)添加pdf
for pdf in pdfs:
with open(pdf,'rb') as f:
pdfMerger.append(f)
#將內(nèi)存中合并的pdf文件寫入
with open(output,'wb') as f:
pdfMerger.write(f)
def main():
#需要合并的pdf名稱
pdfs = ['example.pdf','testexample.pdf']
#合并完成的pdf名稱
output = 'combined_example.pdf'
#調(diào)用PDFmerge函數(shù),進(jìn)行合并
PDFmerge(pdfs,output)
if __name__ == '__main__':
main()
- 給pdf添加水印
import PyPDF2
def add_watermark(wmFile,pageObj):
#打開(kāi)水印pdf文件
wmFileObj = open(wmFile,'rb')
#創(chuàng)建pdfReader對(duì)象,把打開(kāi)的水印pdf傳入
pdfReader = PyPDF2.PdfFileRdader(wmFileObj)
#將水印pdf的首頁(yè)與傳入的原始pdf的頁(yè)進(jìn)行合并
pageObj.mergePage(pdfReader.getPage(0))
wmFileObj.close()
return pageObj
def main():
#水印pdf的名稱
watermark = 'watermark.pdf'
#原始pdf的名稱
origFileName = 'example.pdf'
#合并后新的pdf名稱
newFileName = 'watermark_example.pdf'
#打開(kāi)原始的pdf文件,獲取文件指針
pdfFileObj = open(origFileName,'rb')
#創(chuàng)建reader對(duì)象
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
#創(chuàng)建一個(gè)指向新的pdf文件的指針
pdfWriter = PyPDF2.PdfFileWriter()
#通過(guò)迭代將水印添加到原始pdf的每一頁(yè)
for page in range(pdfReader.numPages):
wmPageObj = add_watermark(mywatermark,pdfReader.getPage(page))
#將合并后的即添加了水印的page對(duì)象添加到pdfWriter
pdfWriter.addpage(wPageObj)
#打開(kāi)新的pdf文件
newFile = open(newFileName,'wb')
#將已經(jīng)添加完水印的pdfWriter對(duì)象寫入文件
pdfWriter.write(newFile)
#關(guān)閉原始和新的pdf
pdfFileObj.close()
newFile.close()
if __name__ == '__main__':
main()
過(guò)程大致和旋轉(zhuǎn)的例子一樣
wmPageObj = add_watermark(mywatermark,pdfReader.getPage(page))
我們通過(guò)自定義的add_watermark函數(shù)將水印與原始pdf頁(yè)進(jìn)行合并。
讓我們來(lái)觀察一下add_watermark函數(shù)
wmFileObj = open(wmFile, 'rb')
pdfReader = PyPDF2.PdfFileReader(wmFileObj)
pageObj.mergePage(pdfReader.getPage(0))
wmFileObj.close()
return pageObj
首先,我們創(chuàng)建了一個(gè)pdf reader對(duì)象。對(duì)于傳遞的頁(yè)面對(duì)象,我們使用mergePage()函數(shù)傳遞水印,這將在傳遞的頁(yè)面對(duì)象上覆蓋水印。