2023年5月2日 星期二

將文件檔案轉換成為文字內容系列 - PDF

將文件檔案轉換成為文字內容系列 - PDF

最近因為工作上的關係,需要提供一系列的轉檔服務,這些轉檔工作中,首先需要將原有的各種文件檔案內容讀取出來,抽取出文件檔案內的文字內容,至於圖片等其他資訊,則將會忽略掉;一旦取得這個文件檔案內的文字內容後,將會緊接著根據需要進行這些文字的精鍊處理工作,不過,因為已經成為了文字內容,這些精練的工作就會變得簡單多了。

所以,這裡將會把各種文件檔案,要如何把裡面的文字內容抽取出來的設計工作,寫成一系列的文章,在第一篇文章,將會要來挑戰 PDF 這樣類型的檔案;然而,經過初步的上網搜尋與分析,想要把各種文件檔案的內容,抽取出所有文字內容,似乎是件滿繁重的工作,若要自己來重頭開始設計這些程式碼,並無法呈現出你的優秀與能力高超,在這裡需要滿足能夠在最短的時間內,完成這樣的轉檔需求,因此,市面上各種套件將會是唯一最佳選擇。

現在將會需要面對另外一個挑戰,那就是對於這樣 PDF 文件檔案,想要把文字內容抽取出來,到底要選擇哪個套件比較合適呢?由於我這裡有時間壓力,因此,就隨機的在網路上尋找出各種轉檔套件,只使用能夠滿足這次需求目的的就好,不館這個套件是否擁有其他強大的功能還有多少。

建立可以將 PDF 檔案轉換出文字內容的測試專案

為了簡化測試用專案的複雜度,因此,在這裡將會建立一個 Console 主控台應用類型的專案。

  • 打開 Visual Studio 2022 IDE 應用程式
  • 從 [Visual Studio 2022] 對話窗中,點選右下方的 [建立新的專案] 按鈕
  • 在 [建立新專案] 對話窗右半部
    • 切換 [所有語言 (L)] 下拉選單控制項為 [C#]
    • 切換 [所有專案類型 (T)] 下拉選單控制項為 [主控台]
  • 在中間的專案範本清單中,找到並且點選 [主控台應用程式] 專案範本選項

    專案,用於建立可在 Windows、Linux 及 macOS 於 .NET 執行的命令列應用程式

  • 點選右下角的 [下一步] 按鈕
  • 在 [設定新的專案] 對話窗
  • 找到 [專案名稱] 欄位,輸入 csPdf2Text 作為專案名稱
  • 在剛剛輸入的 [專案名稱] 欄位下方,確認沒有勾選 [將解決方案與專案至於相同目錄中] 這個檢查盒控制項
  • 點選右下角的 [下一步] 按鈕
  • 現在將會看到 [其他資訊] 對話窗
  • 在 [架構] 欄位中,請選擇最新的開發框架,這裡選擇的 [架構] 是 : .NET 7.0 (標準字詞支援)
  • 在這個練習中,需要去勾選 [不要使用最上層陳述式(T)] 這個檢查盒控制項

    這裡的這個操作,可以由讀者自行決定是否要勾選這個檢查盒控制項

  • 請點選右下角的 [建立] 按鈕

稍微等候一下,這個主控台專案將會建立完成

安裝要用到的 NuGet 開發套件

因為開發此專案時會用到這些 NuGet 套件,請依照底下說明,將需要用到的 NuGet 套件安裝起來。

安裝 itext7 套件

iText7 是一個針對 C# 開發環境的開源 PDF 庫,主要用於創建、編輯、檢視和操作 PDF 文件。它提供了一個功能強大且靈活的 API,讓開發者能夠快速並且輕鬆地完成 PDF 文件的各種操作。

iText7 的主要功能和目的包括:

  • 創建 PDF 文件:可以從零開始創建新的 PDF 文件,也可以基於現有的模板或文件創建 PDF。
  • 編輯 PDF 文件:提供了編輯 PDF 文本、圖像、表格和其他內容的功能,讓開發者能夠輕鬆地修改現有的 PDF 文件。
  • PDF 操作:支持將多個 PDF 文件合併為一個文件、拆分 PDF 文件、重排 PDF 頁面順序等操作。
  • 表單填充與編輯:可以在 PDF 表單中填充數據、讀取表單數據以及編輯現有的 PDF 表單。
  • PDF 文字提取:允許從 PDF 文件中提取文字內容,便於進行分析或其他操作。
  • PDF 轉換:可以將 PDF 文件轉換為其他格式,如 HTML、XML、圖像等,並支持從這些格式轉換回 PDF。
  • 安全性:提供了 PDF 文件的加密、解密、簽名和驗證等安全功能,保護 PDF 文件的數據安全。
  • PDF 標籤和標記:支持為 PDF 文件添加標籤和標記,以便於閱讀和搜索。
  • PDF 與文檔標準相容:支持與 PDF/A、PDF/UA、PDF/X 等文檔標準相容,確保文檔在各種場景下的正確顯示和使用。
  • 總之,iText7 是一個強大的 PDF 處理套件,適用於 C# 開發環境。它可以幫助開發者快速完成 PDF 文件的創建、編輯和操作等任務,提高工作效率。

請依照底下說明操作步驟,將這個套件安裝到專案內

  • 滑鼠右擊 [方案總管] 視窗內的 [專案節點] 下方的 [相依性] 節點
  • 從彈出功能表清單中,點選 [管理 NuGet 套件] 這個功能選項清單
  • 此時,將會看到 [NuGet: csPdf2Text] 視窗
  • 切換此視窗的標籤頁次到名稱為 [瀏覽] 這個標籤頁次
  • 在左上方找到一個搜尋文字輸入盒,在此輸入 itext7
  • 稍待一會,將會在下方看到這個套件被搜尋出來
  • 點選 [itext7] 套件名稱
  • 在視窗右方,將會看到該套件詳細說明的內容,其中,右上方有的 [安裝] 按鈕
  • 點選這個 [安裝] 按鈕,將這個套件安裝到專案內

準備需要抽取文字內容的 PDF 檔案

  • 準備好一個 [.pdf] 文件檔案

  • 在這裡將會從網路上,隨機找到一個 [synapse_pacs.pdf] 檔案

  • 取得該檔案之後,將其透過檔案總管拖拉到 Visual Studio 2022 的專案內

  • 接著,點選 [synapse_pacs.pdf] 檔案

  • 查看 [屬性] 視窗的內容

    若沒有看到屬性視窗出現在 Visual Studio 2022 內,請從 Visual Studio 2022 功能表中,點選 [檢視] > [屬性視窗]

    (這個選項將會在功能表清單內的最下面)

  • 在屬性視窗內,找到 [複製到輸出目錄] 這個選項

  • 從下拉選單中找到並且設定為這個 [有更新時才複製] 選項

開始進行轉檔程式設計

  • 在此專案節點下,找到並且打開 [Program.cs] 這個檔案
  • 使用底下 C# 程式碼替換掉 [Program.cs] 檔案內所有程式碼內容
using System.Text;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Listener;

namespace csPdf2Text
{
    internal class Program
    {
        static void Main(string[] args)
        {
            StringBuilder result = new StringBuilder();

            using (PdfReader pdfReader = new PdfReader("synapse_pacs.pdf"))
            {
                using (PdfDocument pdfDoc = new PdfDocument(pdfReader))
                {
                    int numberOfPages = pdfDoc.GetNumberOfPages();

                    for (int i = 1; i <= numberOfPages; i++)
                    {
                        ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                        string pageContent = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(i), strategy);
                        result.AppendLine(pageContent);
                    }
                }
            }

            Console.WriteLine(result.ToString());
        }
    }
}

[result] 這個區域變數為一個 [StringBuilder] 型別的物件,將會用於暫時儲存從 PDF 檔案內讀取出來的文字內容,一旦所有文件內容都轉成文字內後,將會使用 [StringBuilder] 的 [ToString] 方法,取得所有的文字內容。

接下來建立一個 [PdfReader] 類別的物件,在呼叫建構函式時候,將測試用的 PDF 檔案路徑名稱,傳遞到建構式內。

現在可以透過 [PdfDocument] 類別的物件,開始逐一掃瞄該 PDF 文件內的每個頁面,對於每個 PDF 頁面,將會使用 [PdfTextExtractor.GetTextFromPage] 方法,把這個頁面的文字內容抽取出來。

最後,將所有的文字內容輸出到螢幕上

底下將會是執行後的螢幕截圖結果

 




沒有留言:

張貼留言