PyPDF2的使用

在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ì)象上覆蓋水印。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,196評(píng)論 3 119
  • 高輪感覺(jué)事情變得越來(lái)越恐怖起來(lái),無(wú)論是在喝水還是上廁所,照鏡子還是吃飯,總感覺(jué)有雙眼睛在盯著自己,時(shí)刻都不離。 ...
    柳下鬼閱讀 1,246評(píng)論 1 4
  • 今天,做了個(gè)夢(mèng),夢(mèng)到我們回到了童年,那時(shí)的我們正如現(xiàn)在這般,卻擁有著自己獨(dú)立的思考。由于表哥的一次不著心,發(fā)現(xiàn)侄...
    淺淺微笑的時(shí)光閱讀 242評(píng)論 0 1
  • 愛(ài)是一場(chǎng)催眠,醒來(lái)之后你被誰(shuí)吸了靈。這就是為什么愛(ài)過(guò)之后,總覺(jué)得不僅失去他,也失去了一部分自己。被愛(ài)的人總是掌靈者...
    五木先生努力閱讀 690評(píng)論 1 3
  • 上海是璀璨的!上海的昨日是一部耀眼奪目的書!上海的石庫(kù)門與女性,是這部“書”中瑰麗壯觀的一頁(yè)?!? 上...
    小徑晨輝_859d閱讀 2,232評(píng)論 10 23

友情鏈接更多精彩內(nèi)容