PDF 文檔格式
今天,可移植文檔格式(PDF)屬于最常用的數據格式。 1990年,Adobe定義了PDF文檔格式。 PDF格式背後的想法是傳輸的數據/文檔對于通信過程中涉及的雙方——創建者,作者或發送者和接收者來說看起來完全相同。 PDF是PostScript格式的後續版本,标準化為ISO 32000-2:2017。
處理PDF文檔
對于Linux,有很多可用的命令行工具,如pdftk和pdfgrep來操作pdf。 作為開發人員,您可以構建自己的基于Python的軟件,并使用免費提供的PDF庫。
本文是一個小系列的開頭,将介紹這些有用的Python庫。 在第一部分中,我們将重點介紹現有PDF的操作。 您将學習如何閱讀和提取内容(文本和圖像),旋轉單個頁面以及将文檔拆分為單獨的頁面。 第二部分将介紹如何根據疊加層添加水印。 第三部分将專注于編寫/創建PDF,還将包括删除和重新組合單個頁面到新文檔。
工具和庫
Python相關的PDF工具,模塊和庫的可用解決方案範圍有點令人困惑,需要花一點時間來弄清楚什麼是什麼,以及哪些項目是持續維護的。 根據我們的研究,這些是目前最新的方案:
下面我們将重點介紹PyPDF2和PyMuPDF,并解釋如何以最簡單的方式提取文本和圖像。 為了理解PyPDF2的用法,官方文檔和其他資源提供的大量示例的組合。 相比之下,官方的PyMuPDF文檔更清晰,使用庫的速度要快得多。
用PyPDF2提取文檔
PyPDF2可以作為常規軟件包安裝,也可以使用pip3(适用于Python3)安裝。 這裡的測試基于即将推出的Debian GNU / Linux版本10“Buster”的軟件包。 Debian軟件包的名稱是python3-pypdf2。
下面的代碼首先導入PdfFilereader 類,然後适用這個類打開文件,用getDocumentInfo() 方法來提取文檔信息,包括頁數和首頁内容。
請注意PyPDF2頁碼計數從0開始,這也是為什麼pdf.getPage(0) 函數可以獲取文件的第一頁。最終,提取到的信息被打印到了stdout。
使用PyMuPDF提取文本
PyMuPDF可從PyPi網站獲得,您可以在終端中使用以下命令安裝包:
顯示文檔信息,打印頁數和提取PDF文檔的文本的方式與PyPDF2類似(參見清單2)。 要導入的模塊名為fitz,并返回到PyMuPDF的先前名稱。
PyMuPDF的優點在于它保持原始文檔結構的完整性 - 帶有換行符的整個段落保留在PDF文檔中。
使用PyMuPDF從PDF中提取圖像
PyMuPDF使用getPageImageList()方法簡化了從PDF文檔中提取圖像的過程。下面的代碼來源于PyMuPDF wiki頁面的示例,并逐頁提取并保存PDF中的所有圖像作為PNG文件。 如果圖像具有CMYK顔色空間,則首先将其轉換為RGB。
在400頁PDF上運行這個Python腳本,它在不到3秒的時間内提取了117個圖像,這是驚人的。 各個圖像以PNG格式存儲。 為了保持原始圖像格式和大小,而不是轉換為PNG,請查看PyMuPDF wiki中腳本的擴展版本。
使用PyPDF2将PDF拆分為頁面
對于此示例,首先需要導入PdfFileReader和PdfFileWriter類。 然後我們打開PDF文件,創建一個reader對象,并使用reader對象的getNumPages方法遍曆所有頁面。
在for循環中,我們創建了一個新的PdfFileWriter實例,它不包含任何頁面。 然後,我們使用pdfWriter.addPage()方法将當前頁面添加到writer對象。 此方法接受頁面對象,我們使用PdfFileReader.getPage()方法獲取該頁面對象。
下一步是創建一個唯一的文件名,我們使用原始文件名加上“page”一詞加上頁碼。 我們在當前頁碼中加1,因為PyPDF2計算從零開始的頁碼。
最後,我們以“write binary”模式(模式wb)打開新文件名,并使用pdfWriter類的write()方法将提取的頁面保存到磁盤。
查找包含文本的所有頁面
這個功能非常實用,與pdfgrep類似。 使用PyMuPDF,腳本将返回包含給定搜索字符串的所有頁碼。 頁面一個接一個地加載,并且在searchFor()方法的幫助下,檢測到搜索字符串的所有出現。 如果匹配,則在stdout上打印相應的消息。
結論:
這裡講解的方法非常強大。 使用相對較少數量的代碼行,可以輕松獲得結果。 更多功能在第二部分(即将推出!)中進行了研究,其中包括為PDF添加水印.
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!