如何使用Python玩轉PDF各種騷操作?
Portable Document Format(可移植文檔格式),或者PDF是一種文件格式,可以用於跨操作系統的呈現和文檔交換。儘管PDF最初是由Adobe發明的,但它現在是由國際標準化組織(ISO)維護的開放標準。你可以通過使用PyPDF2包在Python中處理已先存在的PDF。
PyPDF2是一個純Python包,可用於許多不同類型的PDF操作。本文將帶你了解如何執行以下操作:
從Python中提取PDF中的文檔信息
- 旋轉頁面
- 合併PDF
- 拆分PDF
- 添加水印
- 加密PDF
pyPdf,PyPDF2和PyPDF4的歷史
最初的pyPdf軟體包於2005年發布。pyPdf的最後一個正式版本是在2010年。大約一年後,一家名為Phasit的公司贊助了一個名為PyPDF2的pyPdf分支。該代碼編寫為向後與原始代碼兼容,並且用了好多年,效果一直很好,其最後一個版本是在2016年。
有一個名為PyPDF3的軟體包簡短系列版本,然後該項目被重命名為PyPDF4。所有這些項目都完全相同,但pyPdf和PyPDF2 +之間的最大區別在於後者版本增加了Python 3支持。Python 3的原始pyPdf有一個不同的Python 3分支,但是這個分支已經多年沒有維護了。
雖然最近放棄了PyPDF2,但新的PyPDF4與PyPDF2沒有完全的向後兼容性。本文中的大多數示例都可以與PyPDF4完美配合,但也有一些不能,這就是為什麼PyPDF4在本文中沒有更多的特色。隨意用PyPDF4替換PyPDF2的導入,看看它是如何工作的。
pdfrw:一個替代的PDF操作包
Patrick Maupin創建了一個名為pdfrw的軟體包,它可以完成許多與PyPDF2相同的工作。除了加密的特殊情況外,本文後面提到PyPDF2的所有操作,pdfrw均可以實現。
pdfrw的最大區別在於它與ReportLab軟體包集成,因此你可以使用一些或所有預先存在的PDF構建一個新的PDF。
PyPDF2的安裝
如果使用Anaconda而不是常規Python,可以使用pip或conda安裝PyPDF2。以下是使用pip安裝PyPDF2的方法:
$pip install pypdf2
由於PyPDF2沒有任何依賴,因此安裝非常快。
如何從Python中提取PDF文檔信息
我們可以使用PyPDF2從PDF中提取元數據和一些文本,尤其是當在預先存在的PDF文件上執行某些類型的自動化時是非常有用的。
以下是當前可以提取的數據類型:
- Author
- Creator
- Producer
- Subject
- Title
- Number of page
可以在自己的電腦上隨便找一個PDF文件進行嘗試操作。下面是使用該PDF編寫一些代碼,並了解如何訪問這些屬性:

information這個變數具有多個實例屬性,可以使用這些屬性從文檔中獲取所需的其餘元數據。我們可以列印出該信息並將其返回以備將來使用。
雖然PyPDF2具有.extractText(),可以在其頁面對象上使用提取文本(本例中未顯示),但它的效果不是很好。有些PDF會返迴文本,有些會返回空字元串。如果要從PDF中提取文本,建議應該看一下PDFMiner項目。PDFMiner更加強大,專門用於從PDF中提取文本。
如何旋轉頁面?
有時候PDF是橫向模式而不是縱向模式,甚至是顛倒的。當有人掃描文檔為PDF或電子郵件時,很可能會發生這種情況。我們可以列印出文檔並閱讀紙質版本,也可以使用Python的強大功能來旋轉有問題的頁面。
下面看一下如何使用PyPDF2旋轉文章的一些頁面:

上面除了pdfileReader之外,還導入了pdfileWriter,因為我們需要編寫一個新的pdf。rotate_pages()獲取要修改的PDF的路徑。在這個函數中,需要創建一個可以命名為pdf-writer的writer對象和一個名為pdf-reader的reader對象。
接下來,可以使用.get page()獲取所需的頁面。上面開始輸入了第0頁,也就是第一頁,調用page對象的.rotateClockwise()順時針旋轉方法並輸入90。然後同樣地,對於第二頁,調用.rotateCounterLockwise()逆時針旋轉並輸入90。
每次調用Rotation旋轉方法後,都會調用.addPage(),這將向writer對象添加頁面的旋轉版本。最後一頁是第3頁,沒有對其進行任何旋轉。最後,使用.write()把所有新頁寫入新的PDF。
如何合併PDF?
在許多情況下,我們希望將兩個或多個PDF合併到一個PDF中。例如,現在可能有一個標準的封面,需要轉到許多類型的報告中。這時候就可以使用python來幫助完成這類工作。
下面是實現的代碼,完成PDF合併的操作:

假如有一個要合併到一起的pdf列表時,可以直接使用merge_pdf函數完成。此函數採用了輸入路徑和輸出路徑作為參數。
首先遍歷輸入的paths,並為每個輸入創建一個PDF閱讀對象。然後遍歷PDF文件中的所有頁面,並使用.addpage()將這些頁面寫入writer對象。當完成對列表中所有PDF的所有頁面的寫入後,將在末尾寫入新的結果中。
如果不想合併每個PDF的所有頁面,可以通過添加一系列要添加的頁面來稍微增強這個腳本。挑戰一點的話,也可以使用Python的argparse模塊為這個函數創建一個命令行介面。
如何拆分PDF?
有時可能需要將PDF拆分為多個PDF,對於包含大量掃描內容的PDF來說尤其重要。以下是如何使用PyPDF2將PDF拆分為多個文件:

如何添加水印?
水印是紙質或者電子文檔上的圖像或圖案,一些水印只能在特殊照明條件下才能看到。水印的重要性在於它可以保護你的知識產權,例如圖像或PDF。
我們可以使用Python和PyPDF2為文檔添加水印,而且是擁有僅包含水印圖像或文本的PDF。下面是向PDF添加水印方法:

上面create_watermark有三個參數:
- input_pdf:要加水印的PDF文件路徑
- output:要保存PDF的水印版本的路徑
- watermark:包含水印圖像或文本的PDF
在代碼中,打開水印PDF並從文檔中抓取第一頁,因為這是水印應該駐留的位置。然後使用input_pdf和通用pdf_writer對象創建PDF的writer對象,以寫出帶水印的PDF。
下一步是遍歷input_pdf中的頁面,然後調用.mergePage()並以用上面讀取的水印對象watermark_page為參數,這樣會將watermark_page覆蓋在當前頁面的頂部,然後再將新合併的頁面添加到pdf_writer對象中。遍歷完成後,最後將新加水印的PDF寫入磁碟。
如何加密PDF?
PyPDF2目前僅支持將用戶密碼和所有者密碼添加到預先存在的PDF。在PDF版本中,所有者密碼會提供PDF的管理員許可權,並允許設置文檔的許可權,而用戶密碼只允許打開文檔。
實際上,PyPDF2是不允許設置文檔的任何許可權的,即使它允許設置所有者密碼的情況下。但無論如何,這是可以加密的方式,也將固有地加密PDF:

結論
PyPDF2包非常有用,可以使用PyPDF2自動執行腳本完成PDF文檔的批量操作。本文介紹了如何從PDF中提取元數據,旋轉頁面,合併和拆分PDF,添加水印,以及添加加密的操作。
同時,還要關注較新的PyPDF4包,因為它很快就會取代PyPDF2。也可以看看pdfrw包,它也可以執行許多與PyPDF2相同的操作。
轉自:
https://mp.weixin.qq.com/s?timestamp=1558615181&src=3&ver=1&signature=UhPkw3*LotSg-0-oHEqyo74VfsoLVqIgZyooyHn*Y7XujIuk4*l8-oxweccoz9k1lCKpkpa*5RIfrgK*B42Vk0volRePwxdxG-sLnD*wdEB2L3nLjfQWCfGuYsQ7dR8tQpo0miSniZOj3li*LhNlFzxCO9-MkaoV0ZlOhP7aNFI=推薦閱讀:
※Python學習教程:第六天—函數和模塊的使用!
※Python編程有話說:這10個對Web開發者最有用的Python包
※如何高效學python?這篇文章就是為想學的你寫的
※輕量級辦公平台開發實錄(10):日程管理模型設計
※如何能夠短時間高效踏實學習Python?你應該掌握這幾點!