天天看點

【python技巧】python利用pypdf子產品處理 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)

1

初始化一個 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)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

輸出結果:

documentInfo = {'/Title': IndirectObject(157, 0), '/Producer': IndirectObject(158, 0), '/Creator': IndirectObject(159, 0), '/CreationDate': IndirectObject(160, 0), '/ModDate': IndirectObject(160, 0), '/Keywords': IndirectObject(161, 0), '/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

1

2

3

4

5

6

7

8

9

10

11

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

結果是:在寫入的 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'))

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

合并文檔

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

PageObject

PageObject(pdf=None,indirectRef=None)

1

此類表示 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"