彩票走势图

PDF处理控件Aspose.PDF推荐功能解析:使用C#以编程方式从PDF文档中提取文本

翻译|使用教程|编辑:李显亮|2020-05-19 10:01:04.843|阅读 3080 次

概述:PDF文件格式之所以受欢迎,是因为与其他文字处理文件格式相比,文件内容不容易修改。在本文中,将探索使用C#从PDF文件提取文本的众多可能性中的几种。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

PDF文件格式之所以受欢迎,是因为与其他文字处理文件格式相比,文件内容不容易修改。但是,您可以使用Aspose.PDF for .NET API从PDF文档中提取文本。

在本文中,将探索使用C#从PDF文件提取文本的众多可能性中的几种。以下是将在此博客中讨论的功能列表:

  • 使用C#从整个PDF文档中提取文本
  • 使用C#从PDF文档中的特定页面提取文本
  • 使用C#从PDF页面的特定区域提取文本
  • 使用C#从带有正则表达式的PDF文件中提取特定文本
  • 使用C#从PDF文档中的表格单元格提取文本
  • 使用C#从PDF文档中提取突出显示的文本
  • 使用C#提取内存消耗低的PDF文本

近日,.NET版Aspose.PDF升级到v20.5版,支持XFA表单设置/获取值中的绑定表达式,修复PDF转换时的一些问题,感兴趣的朋友可点击下方按钮下载最新版。

点击下载最新版Aspose.PDF for .NET

使用C#从整个PDF文档中提取文本

从PDF文档中读取文本内容是一种常用功能。您可以按照以下步骤从文档的所有页面提取所有文本:

  • 载入PDF文件
  • 创建TextAbsorber对象
  • 接受所有页面的吸收器
  • 将提取的文本写入文件并保存

下面的代码段遵循这些步骤,并显示如何使用C#从整个PDF文档中提取文本:

// Open PDF document
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Create TextAbsorber object to extract text
TextAbsorber textAbsorber = new TextAbsorber();
// Accept the absorber for all pages
pdfDocument.Pages.Accept(textAbsorber);
// Get the extracted text
string extractedText = textAbsorber.Text;
// Create a writer and open the file
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Write a line of text to the file
tw.WriteLine(extractedText);
// Close the stream
tw.Close();

使用C#从PDF文档中的特定页面提取文本

探索了文档级别的文本提取之后,让我们从PDF文档的特定页面提取文本。只需按照以下步骤来满足您的要求:

  • 载入PDF文件
  • 创建TextAbsorber对象
  • 接受吸收器以获取特定页面
  • 将提取的文本写入文件并保存

以下代码段遵循以下步骤,以使用C#从PDF文件的任何页面读取文本:

// Open PDF document
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Access required page in PDF document
Page page = pdfDocument.Pages[1];
// Create TextAbsorber object to extract text
TextAbsorber textAbsorber = new TextAbsorber();
// Accept the absorber for specified page
page.Accept(textAbsorber);
// Get the extracted text
string extractedText = textAbsorber.Text;
// Create a writer and open the file
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Write a line of text to the file
tw.WriteLine(extractedText);
// Close the stream
tw.Close();

使用C#从PDF页面的特定区域提取文本

考虑从页面的特定区域查找一些文本。在这里重要的是要理解,.NET的Aspose.PDF中的基本测量单位是磅,其中72磅等于1英寸。此外,左下角被认为是页面的原点(0,0)。以下是从PDF文档页面的特定区域或部分读取文本的步骤:

  • 载入PDF文件
  • 创建TextAbsorber对象
  • 设置TextSearchOptions并指定直角坐标
  • 接受特定页面的吸收体
  • 将提取的文本写入文件

下面的代码段演示了以下步骤,使用C#从特定区域提取文本:

// Open document
Document pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");
// Create TextAbsorber object to extract text
TextAbsorber absorber = new TextAbsorber();
absorber.TextSearchOptions.LimitToPageBounds = true;
absorber.TextSearchOptions.Rectangle = new Aspose.Pdf.Rectangle(100, 200, 250, 350);
// Accept the absorber for first page
pdfDocument.Pages[1].Accept(absorber);
// Get the extracted text
string extractedText = absorber.Text;
// Create a writer and open the file
TextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");
// Write a line of text to the file
tw.WriteLine(extractedText);
// Close the stream
tw.Close();

使用C#从带有正则表达式的PDF文件中提取特定文本

可以从PDF文档中提取与某些模式匹配的特定文本。例如,要提取一些特定的单词或数字。为此,需要设计一个正则表达式。API将利用该正则表达式在PDF文档中查找匹配的文本。以下步骤是从PDF文件搜索和提取特定文本的准则:

  • 加载输入的PDF文档
  • 创建TextAbsorber对象
  • 设计并设置正则表达式以匹配某些文本
  • 遍历每个提取的文本片段

以下C#代码段使用正则表达式在文档的所有页面中搜索包含4位数字的文本,例如1999、2000等。

// open document
Document pdfDocument = new Document(dataDir + @"Test.pdf");
// create TextAbsorber object to find all instances of the input search phrase
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;
// accept the absorber for all the pages
pdfDocument.Pages.Accept(textFragmentAbsorber);
// get the extracted text fragments
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;     
// loop through the fragments
foreach (TextFragment textFragment in textFragmentCollection)
{
    Console.WriteLine(textFragment.Text);
}

使用C#从PDF文档中的表格单元格提取文本

从PDF页面上的表格中提取文本有些不同。在先前的示例中,我们一直在使用TextAbsorber类,但是从Table中提取文本有些不同。因此,您需要按照以下步骤从Table对象提取文本:

  • 加载源PDF文件
  • 创建TextAbsorber对象
  • 遍历AbsorbedTable
  • 遍历表格每一行中的每个单元格

下面的代码段遵循这些步骤,并使用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#阅读突出显示的文本:

  • 加载源文件
  • 循环浏览所有注释
  • 过滤TextMarkupAnnotation
  • 检索突出显示的文本片段

以下是基于上述步骤的代码段,可用于从PDF文件中获取突出显示的文本:

Document doc = new Document(dataDir + "ExtractHighlightedText.pdf");
// Loop through all the annotations
foreach (Annotation annotation in doc.Pages[1].Annotations)
{
    // Filter TextMarkupAnnotation
    if (annotation is TextMarkupAnnotation)
    {
        TextMarkupAnnotation highlightedAnnotation = annotation as TextMarkupAnnotation;
        // Retrieve highlighted text fragments
        TextFragmentCollection collection = highlightedAnnotation.GetMarkedTextFragments();
        foreach (TextFragment tf in collection)
        {
            // Display highlighted text
            Console.WriteLine(tf.Text);
        }
    }
}

使用C#提取内存消耗低的PDF文本

以下是在使用C#语言从PDF文档提取文本时优化内存消耗的两种不同方法。

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

有时,文本提取可能会消耗大量的内存和处理器。可能是输入文件很大且包含很多文本时。因为TextFragmentAbsorber对象将所有找到的文本片段存储在内存中。

因此,建议的解决方案是在处理每个页面之后调用吸收器.Reset()方法。此外,如果仅执行读取操作,则还可以使用page.FreeMemory()方法释放页面对象所持有的内存。因此,需要按照以下步骤来利用最少的资源:

  • 加载源文件
  • 指定TextEditOptions
  • 读取TextFragment
  • 调用Reset()方法
  • 调用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);
    //Read something from fragments
    count += absorber.TextFragments.Count;
    absorber.Reset();
    page.FreeMemory();
    //GC.Collect();        
}

②使用MemorySaving枚举

用于.NET API的Aspose.PDF支持在从PDF文件读取文本时配置内存保存模式。该TextExtractionOptions.TextFormattingMode枚举服务资源的最优消费的目的。以下步骤概述了此方法需要遵循的步骤:

  • 加载源文件
  • 创建TextDevice对象
  • 设置TextExtractionOptions
  • 提取文本并将文本写入文件

下面的代码片段演示了使用C#进行内存节省的方法:

// Open document
Document pdfDocument = new Document(dataDir + "Test.pdf");
System.Text.StringBuilder builder = new System.Text.StringBuilder();
// String to hold extracted text
string extractedText = "";
foreach (Page pdfPage in pdfDocument.Pages)
{
    using (MemoryStream textStream = new MemoryStream())
    {
        // Create text device
        TextDevice textDevice = new TextDevice();

        // Set text extraction options - set text extraction mode (Raw or Pure)
        TextExtractionOptions textExtOptions = new
        TextExtractionOptions(TextExtractionOptions.TextFormattingMode.MemorySaving);
        textDevice.ExtractionOptions = textExtOptions;
        // Convert a particular page and save text to the stream
        textDevice.Process(pdfPage, textStream);
        // Convert a particular page and save text to the stream
        textDevice.Process(pdfDocument.Pages[1], textStream);
        // Close memory stream
        textStream.Close();
        // Get text from memory stream
        extractedText = Encoding.Unicode.GetString(textStream.ToArray());
    }
    builder.Append(extractedText);
}
dataDir = dataDir + "Memory_Text_Extracted.txt";
// Save the extracted text in text file
File.WriteAllText(dataDir, builder.ToString());

还想要更多吗?您可以点击阅读
【2019 · Aspose最新资源整合】查找需要的教程资源。如果您有任何疑问或需求,请随时加入Aspose技术交流群(642018183),我们很高兴为您提供查询和咨询

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP