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进行处理,非常感谢!