RAG工程實踐攔路虎之一:PDF格式解析雜談

Knife4j發表於2024-07-08

背景

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/

相關文章