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

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

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

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

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

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

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

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

// Open PDF documentDocument pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");// Create TextAbsorber object to extract textTextAbsorber textAbsorber = new TextAbsorber();// Accept the absorber for all pagespdfDocument.Pages.Accept(textAbsorber);// Get the extracted textstring extractedText = textAbsorber.Text;// Create a writer and open the fileTextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");// Write a line of text to the filetw.WriteLine(extractedText);// Close the streamtw.Close();

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

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

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

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

// Open PDF documentDocument pdfDocument = new Document(dataDir + "ExtractTextAll.pdf");// Access required page in PDF documentPage page = pdfDocument.Pages[1];// Create TextAbsorber object to extract textTextAbsorber textAbsorber = new TextAbsorber();// Accept the absorber for specified pagepage.Accept(textAbsorber);// Get the extracted textstring extractedText = textAbsorber.Text;// Create a writer and open the fileTextWriter tw = new StreamWriter(dataDir + "extracted-text.txt");// Write a line of text to the filetw.WriteLine(extractedText);// Close the streamtw.Close();

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

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

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

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

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

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

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

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

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

// open documentDocument pdfDocument = new Document(dataDir + @"Test.pdf");// create TextAbsorber object to find all instances of the input search phraseTextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(@"d{4}"); //like 1999-2020                                                                                                                // set text search option to specify regular expression usageTextSearchOptions textSearchOptions = new TextSearchOptions(true);textFragmentAbsorber.TextSearchOptions = textSearchOptions;// accept the absorber for all the pagespdfDocument.Pages.Accept(textFragmentAbsorber);// get the extracted text fragmentsTextFragmentCollection textFragmentCollection = textFragmentAbsorber.TextFragments;// loop through the fragmentsforeach (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 annotationsforeach (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 documentDocument pdfDocument = new Document(dataDir + "Test.pdf");System.Text.StringBuilder builder = new System.Text.StringBuilder();// String to hold extracted textstring 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 fileFile.WriteAllText(dataDir, builder.ToString());


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

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年4月16日
下一篇 2020年4月16日

相关推荐

发表回复

登录后才能评论