翻译|使用教程|编辑:李显亮|2020-05-19 10:01:04.843|阅读 3080 次
概述:PDF文件格式之所以受欢迎,是因为与其他文字处理文件格式相比,文件内容不容易修改。在本文中,将探索使用C#从PDF文件提取文本的众多可能性中的几种。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
PDF文件格式之所以受欢迎,是因为与其他文字处理文件格式相比,文件内容不容易修改。但是,您可以使用Aspose.PDF for .NET API从PDF文档中提取文本。
在本文中,将探索使用C#从PDF文件提取文本的众多可能性中的几种。以下是将在此博客中讨论的功能列表:
近日,.NET版Aspose.PDF升级到v20.5版,支持XFA表单设置/获取值中的绑定表达式,修复PDF转换时的一些问题,感兴趣的朋友可点击下方按钮下载最新版。
从PDF文档中读取文本内容是一种常用功能。您可以按照以下步骤从文档的所有页面提取所有文本:
下面的代码段遵循这些步骤,并显示如何使用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();
探索了文档级别的文本提取之后,让我们从PDF文档的特定页面提取文本。只需按照以下步骤来满足您的要求:
以下代码段遵循以下步骤,以使用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();
考虑从页面的特定区域查找一些文本。在这里重要的是要理解,.NET的Aspose.PDF中的基本测量单位是磅,其中72磅等于1英寸。此外,左下角被认为是页面的原点(0,0)。以下是从PDF文档页面的特定区域或部分读取文本的步骤:
下面的代码段演示了以下步骤,使用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();
可以从PDF文档中提取与某些模式匹配的特定文本。例如,要提取一些特定的单词或数字。为此,需要设计一个正则表达式。API将利用该正则表达式在PDF文档中查找匹配的文本。以下步骤是从PDF文件搜索和提取特定文本的准则:
以下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); }
从PDF页面上的表格中提取文本有些不同。在先前的示例中,我们一直在使用TextAbsorber类,但是从Table中提取文本有些不同。因此,您需要按照以下步骤从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); } } } }
高亮显示的文本在PDF文件中以注释形式显示。它们包含“标记文本”,这使其与文档中的常规文本不同。以下步骤描述了如何使用C#阅读突出显示的文本:
以下是基于上述步骤的代码段,可用于从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文档提取文本时优化内存消耗的两种不同方法。
①使用Reset()和FreeMemory()方法
有时,文本提取可能会消耗大量的内存和处理器。可能是输入文件很大且包含很多文本时。因为TextFragmentAbsorber对象将所有找到的文本片段存储在内存中。
因此,建议的解决方案是在处理每个页面之后调用吸收器.Reset()方法。此外,如果仅执行读取操作,则还可以使用page.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枚举服务资源的最优消费的目的。以下步骤概述了此方法需要遵循的步骤:
下面的代码片段演示了使用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());
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn