背景
PDF(Portable Document Format)是一種廣泛用於文件交換的檔案格式,由Adobe Systems開發。它具有跨平臺性、固定佈局和易於列印等特點,因此在商業、學術和個人領域廣泛應用。然而,PDF檔案的解析一直是一個具有挑戰性的問題,因為其內部結構的複雜性和多樣性,使得提取其中的文字、圖片和表格等內容並不是一件容易的事情。
技術方案
在目前的PDF檔案解析領域中,我們可以將其大致分為以下幾類技術方案:
- LLM/視覺大模型解析:LLM(Large Language Model)大型語言模型在近年來的發展中,展現出了強大的語言理解和生成能力。透過訓練大規模的神經網路,可以實現對PDF檔案中文字內容的理解和提取,這種方法尤其適用於那些佈局複雜、內容豐富的PDF檔案。
- OCR模型:光學字元識別(OCR)模型專門設計用於將PDF檔案中的影像轉換為可編輯的文字。這種技術在處理掃描版或影像化的PDF文件時尤其有用。
- 傳統規則提取:傳統的PDF解析方式可能包括基於規則的文字提取、影像處理和表格識別等方法。雖然這些方法可能不如深度學習模型那樣靈活,但在某些情況下仍然是有效的選擇。
各個解決方案目前可能需要配合使用,因為PDF格式本身的複雜程度,一項技術方案可能是無法100%滿足業務需求的,這裡面需要考慮的是:
- 文件提取還原度:透過技術手段,能夠完整的提取PDF中的各項元素,包括文字、表格、圖片、連結、圖形、目錄等等資訊
- 高效/💰成本:在RAG知識庫問答的產品中,考慮到文字還需要Embedding的過程,因此在提取過程中如何更高效,成本更低也是需要著重考慮到事項。
- 穩定/冪等:我們知道大模型可能是出現幻覺的,如果用大模型來提取PDF中的內容,是否能足夠保證穩定性。
當我們處理解析PDF時,我們需要可以講每一項的難點都進行拆分,從需求出發,逐一進行攻破,找到解決方案。
其實我覺得技術人員如果能透過技術手段確定PDF中的Block(塊)以及閱讀順序,按Block(塊)進行輸出轉換(Markdown/Html等),這裡麵包括的Block塊元素:文字、圖片、表格等等。那麼這個提取的效果就會達到我們的最優。
而這個目標是我們接下來要重點討論的。
技術難點
在考慮解析PDF檔案時,我們需要根據當前的技術棧發展情況,並結合實際的業務訴求,綜合考量這其中的技術難點,因為每一項技術難點所涉及的技術方案都會需要一個演算法/或者技術手段去突破。
而開發者從解析的效果去考慮,可以從簡單的做起,逐步突破難點,這對於開發人員自身的自信心提升也是一種正向的導向。在整個PDF解析過程中,我覺得以下幾項是比較難處理的:
- 佈局解析困難:PDF檔案的佈局可能會因為不同的作者、工具或用途而有所不同,因此解析其佈局是一個具有挑戰性的任務。
- 格式錯綜複雜:PDF檔案中可能包含各種格式的內容,包括文字、影像、表格等,因此解析其內容需要考慮到這種多樣性和複雜性。
- 複合表格:縱向/橫向合併的複雜表格,在PDF中進行抽象還原是最難處理的問題之一
- 文字、圖片、表格順序提取:提取PDF檔案中的文字、圖片和表格,並確保它們的順序正確性,是一個需要解決的重要問題。
- 文件結構還原:還原PDF檔案的文件結構,包括標題、目錄等資訊,是實現自動化文件處理和理解的關鍵步驟之一。
- 元素重疊:從PDF100%效果還原的角度考慮,圖片/文字之間的重疊,圖片合併,合併後不失真等,也是需要考慮的事項之一
- 後設資料提取:在PDF中隱藏的後設資料資訊是RAG產品的關鍵資料,比如連結、目錄、字型等等
- 掃描件:PDF中如果是掃描件,依靠OCR模型可能是無法有效的提取,這裡麵包含了清晰度、模型的穩定性等等問題
- Latex公式提取:在一些特殊領域,PDF文字中包含了Latex等數學公式。透過完整的提取和轉換是對RAG問答的有效補充
技術可行性
我們從解析PDF的技術可行性角度,考慮哪些方面值得我們重點關注和突破:
- 文字提取能力,逐行提取:確保能夠準確地提取PDF檔案中的文字內容,並按照正確的順序進行排列和輸出,避免文字亂碼(字型)。
- 簡單/複雜表格完整提取:對PDF檔案中的表格進行完整提取,包括表格內的內容和格式。
- 圖片提取/合併:提取PDF檔案中的圖片,並保留其原始質量和格式。
- 文件佈局(Block塊的標識)識別:識別PDF檔案的佈局,包括頁面的排列方式、文字和圖片的位置等資訊。
- 文件結構識別(標題、目錄),內容順序輸出:識別PDF檔案的結構,包括標題、目錄等資訊,並確保輸出內容的順序正確。
- 轉換為Markdown格式:將解析後的PDF檔案內容轉換為Markdown格式,以便於後續的處理和分享。
開源技術方案
結合上面的技術難點/方案及可行性上去分析,我們可以看看目前開源的技術元件中,有哪些是我們可以考慮進行結合的。
因為目前TorchV系統主要以Java+Python雙語作為底層的應用開發語言,接下來我們可以看看在這兩個程式語言中,有哪些開源的方案可以使用。
Java生態
在Java生態中,對於PDF元件處理的開源方案不多見,Apache PDFBOX是當前最強的,也是最好的
名稱 | 地址 | 說明 |
---|---|---|
Apache PDFBox | https://github.com/apache/pdfbox | 提供開箱即用的文字、圖片內容提取方式,並且可以基於Stream介面重寫各項元素的解析實現,並能輸出元素的座標資訊。開發者可以根據元素的座標資訊結合演算法進行內容的高度還原。唯一的缺點是沒有表格元件提取的API供開發人員使用。 |
tabula-java | https://github.com/tabulapdf/tabula-java | 基於Apache PDFBOx元件的表格提取實現 |
Python生態
Python生態的PDF提取元件還是蠻多的,不過也是有不同的側重,比如pdfplumber、camelot等都專注在表格的提取上,提供了開箱即用的方案。
名稱 | 地址 | 說明 |
---|---|---|
pypdf | https://github.com/py-pdf/pypdf | 一個純Python PDF庫,能夠分割、合併、裁剪和轉換PDF檔案的頁面 |
PyMuPDF(AGPL) | https://github.com/pymupdf/PyMuPDF | 高效能 Python 庫,用於 PDF(和其他)文件的資料提取、分析、轉換和操作。 |
pdfplumber(MIT) | https://github.com/jsvine/pdfplumber | 檢視 PDF 以獲取有關每個字元、矩形、線條等的詳細資訊,並輕鬆提取文字和表格。 |
camelot(MIT) | https://github.com/camelot-dev/camelot | 專注於PDF中表格的提取,包括複雜的表格 |
OCR生態/大模型
在上面Python和Java生態庫的開源元件,基本都是針對文字的PDF處理為主,當我們的PDF是掃描件時,那上面的元件統統失效,都提取不出來文字資訊。
此時就需要用到OCR的模型進行提取。
考慮到如果是OCR提取,那麼最終的目的是將PDF檔案Page頁碼內容提取出完成的圖片Image,所以本質上是對圖片內容的理解
可以考慮的開源元件如下:
名稱 | 地址 | 說明 |
---|---|---|
marker(GPL) | https://github.com/VikParuchuri/marker | 基於模型將PDF檔案內容提取為Markdown格式 |
surya(GPL) | https://github.com/VikParuchuri/surya | OCR、佈局分析、閱讀順序、線條檢測(支援90 多種語言) |
tesseract(Apache 2) | https://github.com/tesseract-ocr/tesseract | 老牌OCR元件,支援100多種語言 |
RapidOCR(Apache) | https://github.com/RapidAI/RapidOCR | 基於 ONNXRuntime、OpenVION 和 PaddlePaddle 的出色 OCR 多種程式語言工具包。 |
PaddleOCR(Apache) | https://github.com/PaddlePaddle/PaddleOCR | 基於飛槳的出色多語言OCR工具包(實用的超輕量級OCR系統,支援80+語言識別) |
EasyOCR(Apache ) | https://github.com/JaidedAI/EasyOCR | Python\C++開發,支援80多種語言OCR識別 |
技術準備/細節
在解析PDF時,我們也會有一些其他方面的知識儲備,以便我們快速應對不同的業務需求及應用產品形態。
1、圖形類API:不管是Java還是Python裡面,對於處理PDF中介軟體的部分,都需要對圖形類的API/演算法熟悉和掌握,這裡麵包含圖形的轉換、縮放、矩陣座標、擷取等等,都會在PDF提取的過程中使用到。
2、PDF標準:在處理PDF中,結合開源的技術中介軟體,對於PDF的ISO標準,我們也是需要了解的,這樣更加有利於開發人員理解中介軟體的程式碼寫法及含義。
3、邊/線/矩陣演算法等:對於文字/邊框的聚類演算法等,在根據元素座標高效還原時,利用高效的演算法可以提高解析速度以及內容還原度
4、OCR/LLM模型等:瞭解學習在用OCR/LLM模型分析佈局、邊界檢測等等技術上的一些演算法及資料工程上的實踐
5、PDF頁面旋轉:有時候原PDF可能會有旋轉(0、90、180、270度),需先校正後,再次提取內容
6、字型/亂碼:系統/伺服器中缺失PDF中的字型,導致文字提取亂碼
最後
本文從大的方面簡單概括了在PDF解析處理過程中的技術方案/難點/開源技術方案等內容,後面我會從一些細節方面來逐一分享我們在構建TorchV產品時,解析PDF檔案過程中的一些問題及技術實踐,包括對錶格的提取,感興趣的可以關注我們😁。
另外,我們團隊提供了一個PDF解析的Demo地址,針對文字類的PDF(暫時不支援掃描件),可以進行試用體驗。
地址:http://tabletest.torchv.com:8010/