提取文本 PDF csharp

PDF 文件格式很受歡迎,因為與其他文字處理文件格式相比,文件內容不易修改。但是,在 C# 中,您可以使用 Aspose.PDF for .NET API 從 PDF 文檔中提取文本。在本文中,讓我們探索使用 C# 從 PDF 文件中搜索和提取文本的多種可能性中的幾種。以下是我們將在此博客中討論的功能列表:

使用 C# 從整個 PDF 文檔中提取文本

從 PDF 文檔中讀取文本內容是一項經常使用的功能。使用 C#,您可以按照以下步驟從文檔的所有頁面中提取所有文本:

  1. 載入PDF文件
  2. 創建 TextAbsorber 對象
  3. 接受所有頁面的吸收器
  4. 將提取的文本寫入文件並保存

下面的代碼片段遵循這些步驟並展示瞭如何使用 C# 從整個 PDF 文檔中提取文本:

// 打開 PDF 文檔
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// 創建 TextAbsorber 對像以提取文本
TextAbsorber textAbsorber = new TextAbsorber();
// 接受所有頁面的吸收器
pdfDocument.Pages.Accept(textAbsorber);
// 獲取提取的文本
string extractedText = textAbsorber.Text;
// 創建編寫器並打開文件
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// 向文件寫入一行文本
tw.WriteLine(extractedText);
// 關閉流
tw.Close();

在 C# 中從 PDF 中的特定頁面搜索和提取文本

在探索了文檔級別的文本提取之後,讓我們從 PDF 文檔的特定頁面中提取文本。只需按照以下步驟即可實現您的要求:

  1. 載入PDF文件
  2. 創建 TextAbsorber 對象
  3. 接受特定頁面的吸收器
  4. 將提取的文本寫入文件並保存

以下代碼片段遵循以下步驟使用 C# 從 PDF 文件的任何頁面讀取文本:

// 打開 PDF 文檔
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// 訪問 PDF 文檔中的所需頁面
Page page = pdfDocument.Pages[1];
// 創建 TextAbsorber 對像以提取文本
TextAbsorber textAbsorber = new TextAbsorber();
// 接受指定頁面的吸收器
page.Accept(textAbsorber);
// 獲取提取的文本
string extractedText = textAbsorber.Text;
// 創建編寫器並打開文件
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// 向文件寫入一行文本
tw.WriteLine(extractedText);
// 關閉流
tw.Close();

在 C# 中從 PDF 頁面的特定區域搜索和提取文本

讓我們將此文本提取更進一步。考慮從頁面的特定區域查找一些文本。重要的是要了解 Aspose.PDF for .NET 中的基本測量單位是點,其中 72 點等於 1 英寸。此外,左下角被視為頁面的原點 (0,0)。以下是從 PDF 文檔中頁面的特定區域或部分讀取文本的步驟:

  1. 加載源 PDF 文檔
  2. 創建 TextAbsorber 對象
  3. 設置 TextSearchOptions 並指定直角坐標
  4. 接受特定頁面的吸收器
  5. 將提取的文本寫入文件

下面的代碼片段演示了使用 C# 從特定區域提取文本的這些步驟:

// 打開文檔
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// 創建 TextAbsorber 對像以提取文本
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// 接受第一頁的吸收器
pdfDocument.Pages[1].Accept(absorber);
// 獲取提取的文本
string extractedText = absorber.Text;
// 創建編寫器並打開文件
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// 向文件寫入一行文本
tw.WriteLine(extractedText);
// 關閉流
tw.Close();

使用 C# 使用正則表達式從 PDF 文件中搜索或提取特定文本

您可以從 PDF 文檔中提取與某些模式匹配的特定文本。例如,您可能想要提取一些特定的單詞或數字。為此,您需要設計一個正則表達式。 API 將利用該正則表達式在 PDF 文檔中查找匹配的文本。以下步驟是從 PDF 文件中搜索和提取特定文本的指南:

  • 加載輸入 PDF 文檔
  • 創建 TextAbsorber 對象
  • 設計並設置一個正則表達式來匹配一些文本
  • 遍歷每個提取的文本片段

以下 C# 代碼片段使用正則表達式在文檔的所有頁面中搜索包含 4 位數字的文本,例如 1999、2000 等。

// 打開文檔
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// 創建 TextAbsorber 對像以查找輸入搜索短語的所有實例
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"\d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usage
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.TextSearchOptions = textSearchOptions;
// 接受所有頁面的吸收器
pdfDocument.Pages.Accept(textFragmentAbsorber);
// 獲取提取的文本片段
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// 遍歷片段
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

使用 C# 從 PDF 文檔中的表格單元格中提取文本

從 PDF 頁面上的表格中提取文本有點不同。在前面的示例中,我們一直在使用 TextAbsorber 類,但是從 Table 中提取文本有點不同。因此,您需要按照以下步驟從 Table 對像中提取文本:

  1. 加載源 PDF 文件
  2. 創建 TableAbsorber 類的對象
  3. 遍歷 AbsorbedTable
  4. 循環遍歷 Table 每一行中的每個單元格

下面的代碼片段遵循這些步驟並使用 C# 有效地從 PDF 文檔中的表格單元格中提取文本:

Document pdfDocument = new Document(dataDir + "Test.pdf");
TableAbsorber absorber = new TableAbsorber();
absorber.Visit(pdfDocument.Pages[1]);
foreach (AbsorbedTable table in absorber.TableList)
{
    foreach (AbsorbedRow row in table.RowList)
    {
        foreach (AbsorbedCell cell in row.CellList)
        {
            TextFragment textfragment = new TextFragment();
            TextFragmentCollection textFragmentCollection = cell.TextFragments;
            foreach (TextFragment fragment in textFragmentCollection)
            {
                Console.WriteLine(fragment.Text);
            }
        }
    }
}

使用 C# 從 PDF 文檔中搜索和提取突出顯示的文本

突出顯示的文本在 PDF 文件中顯示為註釋。它們包含標記文本,這使得它們不同於文檔中的常規文本。以下步驟描述瞭如何使用 C# 閱讀突出顯示的文本:

  1. 加載源文檔
  2. 遍歷所有註釋
  3. 過濾 TextMarkupAnnotation
  4. 檢索突出顯示的文本片段

以下是基於上述步驟的代碼片段,可用於從 PDF 文件中獲取高亮文本:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// 遍歷所有註釋
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // 過濾 TextMarkupAnnotation
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // 檢索突出顯示的文本片段
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // 顯示突出顯示的文本
            Console.WriteLine(tf.Text);
        }
    }
}

使用 C# 以低內存消耗提取 PDF 文本

以下是使用 C# 語言從 PDF 文檔中提取文本時優化內存消耗的兩種不同方法。

i) 使用 Reset() 和 FreeMemory() 方法

有時文本提取可能會消耗大量內存和處理器。可能是當輸入文件很大並且包含大量文本時。因為 TextFragmentAbsorber 對象將所有找到的文本片段存儲在內存中。

因此,我們這裡推薦的解決方案是在處理完每個頁面後調用absorber.Reset()方法。此外,如果您只執行讀取操作,那麼您還可以使用 page.FreeMemory() 方法釋放頁面對象持有的內存。因此,您需要按照以下步驟來利用最少的資源:

  1. 加載源 PDF 文檔
  2. 指定 TextEditOptions
  3. 閱讀 TextFragment
  4. 調用 Reset() 方法
  5. 調用 FreeMemory() 方法

以下代碼片段演示了使用 C# 從 PDF 文檔中提取文本:

Document pdfDocument = new Document(dataDir + @"ITF-TTF Manual.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
foreach (Page page in pdfDocument.Pages)
{
    page.Accept(absorber);
    //從片段中讀取一些東西
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.收集();        
}

我們已經使用包含 450 頁、24500 個文本片段以及大量光柵和矢量圖像的巨大示例文件測試了此代碼片段。該進程僅消耗了 500MB 內存。這裡的另一個提示是,您可以向 .NET 垃圾收集器收費,以將最大內存消耗減少到 250MB 左右,並額外增加 10 秒的處理時間。

ii) 使用 MemorySaving 枚舉

Aspose.PDF for .NET API 支持在從 PDF 文件讀取文本時配置內存節省模式。 TextExtractionOptions.TextFormattingMode 枚舉用於優化資源消耗的目的。以下步驟總結了您需要為此方法遵循的步驟:

  1. 加載源 PDF 文件
  2. 創建 TextDevice 對象
  3. 設置 TextExtractionOptions
  4. 提取文本並將文本寫入文件

下面的代碼片段演示了使用 C# 的內存節省方法:

// 打開文檔
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// 保存提取文本的字符串
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // 創建文本設備
        TextDevice textDevice = new TextDevice();

        // 設置文本提取選項 - 設置文本提取模式(原始或純)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // 轉換特定頁面並將文本保存到流中
        textDevice.Process(pdfPage, textStream);
        // 轉換特定頁面並將文本保存到流中
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // 關閉內存流
        textStream.Close();
        // 從內存流中獲取文本
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// 將提取的文本保存在文本文件中
File.WriteAllText(dataDir, builder.ToString());

結論

我們已經探索了本文中許多有用用例中的幾個,使用 C# 和 Aspose.PDF for .NET API 從 PDF 文檔中提取文本的可能性無窮無盡。您可以通過 API 文檔 了解更多信息。如有任何疑問,請通過 免費支持論壇 與我們聯繫。

也可以看看