Python實現PyPDF2處理PDF檔案的方法示例
實際應用中,可能會涉及處理 pdf 檔案,PyPDF2 就是這樣一個庫,使用它可以輕鬆的處理 pdf 檔案,它提供了讀,割,合併,檔案轉換等多種操作。
文件地址:http://pythonhosted.org/PyPDF2/
PyPDF2 安裝
PyCharm 安裝:File -> Default Settings -> Project Interpreter
PdfFileReader
構造方法:
PyPDF2.PdfFileReader(stream,strict = True,warndest = None,overwriteWarnings = True)
初始化一個 PdfFileReader 物件,此操作可能需要一些時間,因為 PDF 流的交叉引用表被讀入記憶體。
引數:
- stream:*File 物件或支援與 File 物件類似的標準讀取和查詢方法的物件,也可以是表示 PDF 檔案路徑的字串。
- *strict(bool): 確定是否應該警告使用者所用的問題,也導致一些可糾正的問題是致命的,預設是 True
- warndest : 記錄警告的目標(預設是 sys.stderr)
- overwriteWarnings(bool):確定是否 warnings.py 用自定義實現覆蓋 Python 模組(預設為 True)
PdfFileReader 物件的屬性和方法
屬性和方法 | 描述 |
---|---|
getDestinationPageNumber(destination) | 檢索給定目標物件的頁碼 |
getDocumentInfo() | 檢索 PDF 檔案的文件資訊字典 |
getFields(tree = None,retval = None,fileObj= None) | 如果此 PDF 包含互動式表單欄位,則提取欄位資料, |
getFormTextFields() | 從文件中檢索帶有文字資料(輸入,下拉列表)的表單域 |
getNameDestinations(tree = None,retval= None) | 檢索文件中的指定目標 |
getNumPages() | 計算此 PDF 檔案中的頁數 |
getOutlines(node = None,outline = None,) | 檢索文件中出現的文件大綱 |
getPage(pageNumber) | 從這個 PDF 檔案中檢索指定編號的頁面 |
getPageLayout() | 獲取頁面佈局 |
getPageMode() | 獲取頁面模式 |
getPageNumber(pageObject) | 檢索給定 pageObject 處於的頁碼 |
getXmpMetadata() | 從 PDF 文件根目錄中檢索 XMP 資料 |
isEncrypted | 顯示 PDF 檔案是否加密的只讀布林屬性 |
namedDestinations | 訪問該getNamedDestinations() 函式的只讀屬性 |
PDF 讀取操作:
# encoding:utf-8 from PyPDF2 import PdfFileReader,PdfFileWriter readFile = 'C:/Users/Administrator/Desktop/RxJava 完全解析.pdf' # 獲取 PdfFileReader 物件 pdfFileReader = PdfFileReader(readFile) # 或者這個方式:pdfFileReader = PdfFileReader(open(readFile,'rb')) # 獲取 PDF 檔案的文件資訊 documentInfo = pdfFileReader.getDocumentInfo() print('documentInfo = %s' % documentInfo) # 獲取頁面佈局 pageLayout = pdfFileReader.getPageLayout() print('pageLayout = %s ' % pageLayout) # 獲取頁模式 pageMode = pdfFileReader.getPageMode() print('pageMode = %s' % pageMode) xmpMetadata = pdfFileReader.getXmpMetadata() print('xmpMetadata = %s ' % xmpMetadata) # 獲取 pdf 檔案頁數 pageCount = pdfFileReader.getNumPages() print('pageCount = %s' % pageCount) for index in range(0,pageCount): # 返回指定頁編號的 pageObject pageObj = pdfFileReader.getPage(index) print('index = %d,pageObj = %s' % (index,type(pageObj))) # <class 'PyPDF2.pdf.PageObject'> # 獲取 pageObject 在 PDF 文件中處於的頁碼 pageNumber = pdfFileReader.getPageNumber(pageObj) print('pageNumber = %s ' % pageNumber)
輸出結果:
documentInfo = {'/Title': IndirectObject(157,0),'/Producer': IndirectObject(158,'/Creator': IndirectObject(159,'/CreationDate': IndirectObject(160,'/ModDate': IndirectObject(160,'/Keywords': IndirectObject(161,'/AAPL:Keywords': IndirectObject(162,0)}
pageLayout = None
pageMode = None
xmpMetadata = None
pageCount = 3
index = 0,pageObj = <class 'PyPDF2.pdf.PageObject'>
pageNumber = 0
index = 1,pageObj = <class 'PyPDF2.pdf.PageObject'>
pageNumber = 1
index = 2,pageObj = <class 'PyPDF2.pdf.PageObject'>
pageNumber = 2
PdfFileWriter
這個類支援 PDF 檔案,給出其他類生成的頁面。
屬性和方法 | 描述 |
---|---|
addAttachment(fname,fdata) | 在 PDF 中嵌入檔案 |
addBlankPage(width= None,height=None) | 追加一個空白頁面到這個 PDF 檔案並返回它 |
addBookmark(title,pagenum,parent=None, color=None,bold=False,italic=False,fit='/fit,*args') |
|
addJS(javascript) | 新增將在開啟此 PDF 是啟動的 javascript |
addLink(pagenum,pagedest,rect,border=None,fit='/fit',*args) | 從一個矩形區域新增一個內部連結到指定的頁面 |
addPage(page) | 新增一個頁面到這個PDF 檔案,該頁面通常從 PdfFileReader 例項獲取 |
getNumpages() | 頁數 |
getPage(pageNumber) | 從這個 PDF 檔案中檢索一個編號的頁面 |
insertBlankPage(width=None,height=None,index=0) | 插入一個空白頁面到這個 PDF 檔案並返回它,如果沒有指定頁面大小,就使用最後一頁的大小 |
insertPage(page,index=0) | 在這個 PDF 檔案中插入一個頁面,該頁面通常從 PdfFileReader 例項獲取 |
removeLinks() | 從次數出中刪除連線盒註釋 |
removeText(ignoreByteStringObject = False) | 從這個輸出中刪除影象 |
write(stream) | 將新增到此物件的頁面集合寫入 PDF 檔案 |
PDF 寫入操作:
def addBlankpage(): readFile = 'C:/Users/Administrator/Desktop/RxJava 完全解析.pdf' outFile = 'C:/Users/Administrator/Desktop/copy.pdf' pdfFileWriter = PdfFileWriter() # 獲取 PdfFileReader 物件 pdfFileReader = PdfFileReader(readFile) # 或者這個方式:pdfFileReader = PdfFileReader(open(readFile,'rb')) numPages = pdfFileReader.getNumPages() for index in range(0,numPages): pageObj = pdfFileReader.getPage(index) pdfFileWriter.addPage(pageObj) # 根據每頁返回的 PageObject,寫入到檔案 pdfFileWriter.write(open(outFile,'wb')) pdfFileWriter.addBlankPage() # 在檔案的最後一頁寫入一個空白頁,儲存至檔案中 pdfFileWriter.write(open(outFile,'wb'))
結果是:在寫入的 copy.pdf 文件的最後最後一頁寫入了一個空白頁。
分割文件(取第五頁之後的頁面)
def splitPdf(): readFile = 'C:/Users/Administrator/Desktop/RxJava 完全解析.pdf' outFile = 'C:/Users/Administrator/Desktop/copy.pdf' pdfFileWriter = PdfFileWriter() # 獲取 PdfFileReader 物件 pdfFileReader = PdfFileReader(readFile) # 或者這個方式:pdfFileReader = PdfFileReader(open(readFile,'rb')) # 文件總頁數 numPages = pdfFileReader.getNumPages() if numPages > 5: # 從第五頁之後的頁面,輸出到一個新的檔案中,即分割文件 for index in range(5,numPages): pageObj = pdfFileReader.getPage(index) pdfFileWriter.addPage(pageObj) # 新增完每頁,再一起儲存至檔案中 pdfFileWriter.write(open(outFile,'wb'))
合併文件
def mergePdf(inFileList,outFile): ''' 合併文件 :param inFileList: 要合併的文件的 list :param outFile: 合併後的輸出檔案 :return: ''' pdfFileWriter = PdfFileWriter() for inFile in inFileList: # 依次迴圈開啟要合併檔案 pdfReader = PdfFileReader(open(inFile,'rb')) numPages = pdfReader.getNumPages() for index in range(0,numPages): pageObj = pdfReader.getPage(index) pdfFileWriter.addPage(pageObj) # 最後,統一寫入到輸出檔案中 pdfFileWriter.write(open(outFile,'wb'))
PageObject
PageObject(pdf=None,indirectRef=None)
此類表示 PDF 檔案中的單個頁面,通常這個物件是通過訪問 PdfFileReader 物件的 getPage() 方法來得到的,也可以使用 createBlankPage() 靜態方法建立一個空的頁面。
引數:
- pdf : 頁面所屬的 PDF 檔案。
- indirectRef:將源物件的原始間接引用儲存在其源 PDF 中。
PageObject 物件的屬性和方法
屬性或方法 | 描述 |
---|---|
static createBlankPage(pdf=None,width=None,height=None) | 返回一個新的空白頁面 |
extractText() | 找到所有文字繪圖命令,按照他們在內容流中提供的順序,並提取文字 |
getContents() | 訪問頁面內容,返回 Contents 物件或 None |
rotateClockwise(angle) | 順時針旋轉 90 度 |
scale(sx,sy) | 通過向其內容應用轉換矩陣並更新頁面大小 |
粗略讀取 PDF 文字內容
def getPdfContent(filename): pdf = PdfFileReader(open(filename,"rb")) content = "" for i in range(0,pdf.getNumPages()): pageObj = pdf.getPage(i) extractedText = pageObj.extractText() content += extractedText + "\n" # return content.encode("ascii","ignore") return content
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。