PyPDF2的使用

pdf使用Adobe公司開發,現在由國際標準化組織ISO進行維護。PDF合成包含鏈接和按鈕,表單字段,音頻,視頻和業務邏輯

在這篇文章中,我們將學習如何做一些pdf的操作:

從PDF中提取文字

旋轉pdf頁

合併pdf

分割pdf

向pdf頁中添加水印

使用簡單的python腳本

1、安裝

我們將使用第三方的模塊 PyPDF2


PyPDF2是作爲PDF工具包構建的python庫,它能夠:
  • 提取文檔信息(標題,作者,...)
  • 按頁拆分文檔
  • 逐頁合併文檔
  • 裁剪頁面
  • 合併多個頁面到一個頁
  • 對pdf文檔進行加密解密
  • 等等

安裝PyPDF2,在命令行下執行命令:

pip install PyPDF2

注意,這個模塊的名字對大小寫是敏感的,所以,確保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()

在我的機子上輸出如下:

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.

我們來逐步分析一下上面的代碼

pdfFile = open('example.pdf','rb')

我們以二進制的方式打開example.pdf,並且保存爲pdfFile

pdfReader = PyPDF2.PdfFileReader(pdfFile)

我們創建了一個PyPDF2模塊中PdfFileReader類的對象,並將pdfFile對象傳進去,獲取pdfReader對象

print(pdfReader.numPages)

numPages 屬性保存了pdf的頁數,在我的例子中,numPages = 241

page = pdfReader.getPage(0)

現在,我們創建了一個page對象。pdfReader的getPage方法可以接受頁碼參數,並返回頁面對象。

print(page.extractText())

page的extractText()方法,可以提取出頁面中的文字

pdfFile.close()

最後,關閉打開的example.pdf

注意:雖然PDF文件非常適合以一種便於打印和閱讀的方式顯示文本,但是對於軟件來說,將其解析爲純文本並不容易。因此,PyPDF2在從PDF中提取文本時可能會出錯,甚至可能根本無法打開某些PDF。不幸的是,你對此無能爲力。PyPDF2可能無法處理某些特定的PDF文件。

- 旋轉pdf頁


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

我們看一下關鍵的代碼:

pdfWriter = PyPDF2.PdfFileWriter()

因爲我們是將旋轉後的頁面寫入新的pdf,所以首先創建一個PdfFileWriter對象:pdfWriter。

for page in range(pdfReader.numPages):
        pageObj = pdfReader.getPage(page)
        pageObj.rotateClockwise(rotation)

        pdfWriter.addPage(pageObj)

通過pdfReader.numPages,獲取pdf的頁數,然後進行循環。
循環體中,先創建每一頁的對象,然後調用頁面對象的rotateClockwise方法,傳入的參數是順時針旋轉的度數。最後,旋轉後的頁面對象作爲參數傳給pdfWriter的addPage方法。

newFile = open(newFileName,'wb')
    pdfWrite.write(newFile)

    pdfFile.close()
    newFile.close()

打開新的文件,以寫的方式,將我們新生成的pdf寫入。然後關閉兩個文件

- 合併pdf文件

import PyPDF2

def PDFmerge(pdfs,output):
    
    #創建一個pdf文件合併對象
    pdfMerger = PyPDF2.PdfFileMerger()
    
    #逐個添加pdf
    for pdf in pdfs:
        with open(pdf,'rb') as f:
            pdfMerger.append(f)

    #將內存中合併的pdf文件寫入
    with open(output,'wb') as f:
        pdfMerger.write(f)

def main():
    #需要合併的pdf名稱
    pdfs = ['example.pdf','testexample.pdf']
    
    #合併完成的pdf名稱
    output = 'combined_example.pdf'

    #調用PDFmerge函數,進行合併
    PDFmerge(pdfs,output)
if __name__ == '__main__':
    main()

- 給pdf添加水印

import PyPDF2

def add_watermark(wmFile,pageObj):
    #打開水印pdf文件
    wmFileObj = open(wmFile,'rb')
    
    #創建pdfReader對象,把打開的水印pdf傳入
    pdfReader = PyPDF2.PdfFileRdader(wmFileObj)
    
    #將水印pdf的首頁與傳入的原始pdf的頁進行合併
    pageObj.mergePage(pdfReader.getPage(0))

    wmFileObj.close()
    return pageObj

def main():
    
    #水印pdf的名稱
    watermark = 'watermark.pdf'

    #原始pdf的名稱
    origFileName = 'example.pdf'

    #合併後新的pdf名稱
    newFileName = 'watermark_example.pdf'

    #打開原始的pdf文件,獲取文件指針
    pdfFileObj = open(origFileName,'rb')

    #創建reader對象
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

    #創建一個指向新的pdf文件的指針
    pdfWriter = PyPDF2.PdfFileWriter()

    #通過迭代將水印添加到原始pdf的每一頁
    for page in range(pdfReader.numPages):
        wmPageObj = add_watermark(mywatermark,pdfReader.getPage(page))
        
        #將合併後的即添加了水印的page對象添加到pdfWriter
        pdfWriter.addpage(wPageObj)

    #打開新的pdf文件
    newFile = open(newFileName,'wb')
    #將已經添加完水印的pdfWriter對象寫入文件
    pdfWriter.write(newFile)

    #關閉原始和新的pdf
    pdfFileObj.close()
    newFile.close()

if __name__ == '__main__':
    main()

過程大致和旋轉的例子一樣

wmPageObj = add_watermark(mywatermark,pdfReader.getPage(page))

我們通過自定義的add_watermark函數將水印與原始pdf頁進行合併。
讓我們來觀察一下add_watermark函數

wmFileObj = open(wmFile, 'rb')
pdfReader = PyPDF2.PdfFileReader(wmFileObj) 
pageObj.mergePage(pdfReader.getPage(0))
wmFileObj.close()
return pageObj

首先,我們創建了一個pdf reader對象。對於傳遞的頁面對象,我們使用mergePage()函數傳遞水印,這將在傳遞的頁面對象上覆蓋水印。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章