摘要:在处理 PDF 文档时,经常需要从中提取文本内容用于数据分析或搜索入库。使用 Spire.PDF for .NET,只需几行 C#代码即可精准提取 PDF 中的文本,支持保留格式和批量处理,轻松解决文本提取需求。
在处理 PDF 文档时,经常需要从中提取文本内容用于数据分析或搜索入库。使用 Spire.PDF for .NET,只需几行 C#代码即可精准提取 PDF 中的文本,支持保留格式和批量处理,轻松解决文本提取需求。
Spire.PDF 是由 e-iceblue 公司开发的一款专业的 PDF 组件,专为 .NET 平台设计,支持在 C#、VB.NET 等语言中创建、读取、编辑、转换和打印 PDF 文档。在文本提取方面,Spire.PDF 展现出诸多独特优势:
广泛的兼容性: Spire.PDF 支持各种 PDF 版本,包括加密和受保护的 PDF 文档,确保了在不同场景下的通用性。灵活的提取模式: 它不仅支持提取整页文本,还能按指定区域、按行、甚至按特定格式(如文本元素的位置、大小、字体、颜色)进行精细 #技术分享化提取,满足多样化的需求。出色的复杂布局处理能力: 面对表格、多列布局、图片环绕文本等复杂页面结构,Spire.PDF 能够更好地识别和还原文本的逻辑顺序,减少乱码和布局错乱的发生。多语言支持: 对于包含中文、日文、韩文等多种语言的 PDF 文档,Spire.PDF 也能提供良好的支持,确保字符编码的正确性。易于使用与高性能: API 设计直观简洁,学习成本低。同时,其底层优化确保了在处理大型 PDF 文件时依然能保持高效的性能。(对比其他库): 相较于一些开源库如 iTextSharp,Spire.PDF 在商业支持、API 易用性以及对复杂 PDF 的处理能力上往往更具优势;与 PDFium 等底层库相比,Spire.PDF 提供了更高级别的抽象,减少了开发者的工作量。现在,让我们通过具体的 C# 代码示例,深入了解如何使用 Spire.PDF 进行文本提取。
首先,你需要在你的 .NET 项目中安装 Spire.PDF 库。最简单的方式是通过 NuGet 包管理器:
Install-Package Spire.PDF或者在 Visual Studio 的 NuGet 包管理器中搜索 "Spire.PDF" 并安装。
这是最常见的文本提取场景,即提取 PDF 文档中每一页的所有文本内容。
using Spire.Pdf;using System.Text;class Program { static void Main(string args) { PdfDocument doc = new PdfDocument; doc.Load("Sample.pdf");StringBuilder fullText = new StringBuilder;foreach (PdfPageBase page in doc.Pages) { string textOnPage = page.ExtractText; fullText.AppendLine(textOnPage);}System.IO.File.WriteAllText("ExtractedFullText.txt", fullText.ToString); Console.WriteLine("文本已成功提取并保存到 ExtractedFullText.txt");doc.Close; } }代码解析:
PdfDocument doc = new PdfDocument; doc.Load("Sample.pdf"); 用于加载目标 PDF 文档。foreach (PdfPageBase page in doc.Pages) 遍历文档中的所有页面。page.ExtractText 是核心方法,用于提取当前页面的所有文本内容。StringBuilder 用于高效地拼接所有页面的文本。doc.Close 释放文档资源,这是一个良好的编程习惯。有时我们只需要 PDF 页面中某个特定区域的文本,例如一个表格或者某个数据块。Spire.PDF 允许我们通过定义一个矩形区域来精确提取文本。
using Spire.Pdf;using Spire.Pdf.Graphics; using Spire.Pdf.Texts; using System.Drawing;class Program { static void Main(string args) { PdfDocument doc = new PdfDocument; doc.Load("Sample.pdf");PdfPageBase page = doc.Pages[0];RectangleF extractArea = new RectangleF(80, 180, 500, 200);PdfTextExtractOptions options = new PdfTextExtractOptions; options.ExtractArea = extractArea;PdfTextExtractor extractor = new PdfTextExtractor(page); string extractedText = extractor.ExtractText(options);Console.WriteLine($"从指定区域提取的文本:\n{extractedText}");doc.Close; } }代码解析:
RectangleF extractArea = new RectangleF(80, 180, 500, 200); 定义了一个浮点型矩形,用于指定提取区域。 x 和 y 是相对于页面左上角的偏移量, width 和 height 是区域的尺寸。PdfTextExtractOptions options = new PdfTextExtractOptions; options.ExtractArea = extractArea; 将定义的区域作为提取选项。PdfTextExtractor extractor = new PdfTextExtractor(page); 创建一个页面文本提取器实例。extractor.ExtractText(options); 使用带有区域选项的提取器来获取文本。Spire.PDF 还提供了更高级的文本提取能力,例如提取被高亮(highlight)的文本。这在处理批注和审阅过的文档时非常有用。
using Spire.Pdf;using Spire.Pdf.Annotations; using Spire.Pdf.Graphics;using Spire.Pdf.Texts;using System.Drawing;using System.Text;class Program { static void Main(string args) { PdfDocument doc = new PdfDocument; doc.Load("SampleWithHighlight.pdf");PdfPageBase page = doc.Pages[0]; StringBuilder stringBuilder = new StringBuilder; PdfTextExtractor pdfTextExtractor = new PdfTextExtractor(page);for (int i = 0; i代码解析:
page.Annotations 属性用于访问页面上的所有批注。通过 is PdfTextMarkupAnnotationWidget 判断批注类型是否为文本标记批注。textMarkupAnnotation.Bounds 获取高亮批注的矩形区域,然后利用 PdfTextExtractOptions.ExtractArea 来提取该区域的文本。textMarkupAnnotation.TextMarkupColor 可以获取高亮批颜色,方便进行进一步处理或分析。在实际应用中,我们可能会遇到一些更复杂的情况,以下是一些进阶技巧和常见问题解决方案。
文本提取后出现乱码通常是由于编码不匹配造成的。Spire.PDF 在内部对多种编码有良好支持,但如果遇到特殊情况,可以尝试以下方法:
确保字体嵌入: 如果 PDF 中的字体没有嵌入,或者使用了非常规字体,提取时可能会丢失信息或出现乱码。Spire.PDF 会尽力处理,但最佳实践是确保 PDF 生成时嵌入了所有字体。指定编码(如果 API 支持): 某些 PDF 库允许在提取时指定文本编码,但 Spire.PDF 通常会自动处理。如果仍有问题,可以检查 PDF 本身的编码信息。后处理: 对于少量难以解决的乱码,可能需要进行后处理,例如使用字符映射或替换算法。提示: Spire.PDF 在处理多语言和复杂编码方面表现优秀,通常无需手动干预。如果出现乱码,首先确认 PDF 文件本身是否正常,或尝试更新 Spire.PDF 到最新版本。
仅仅提取文本有时是不够的,我们还需要了解文本在页面上的位置、大小、字体等布局信息,以便更好地还原原始文档结构。
Spire.PDF 提供了 ExtractText(bool) 重载方法或 PdfTextExtractor 类,可以获取更详细的文本元素信息,而不仅仅是纯文本字符串。例如,通过 PdfTextExtractor 我们可以获取 TextLine 和 TextWord 对象,它们包含了文本的坐标、字体、大小等属性。
using Spire.Pdf;using Spire.Pdf.Texts;using System.Drawing;class Program { static void Main(string args) { PdfDocument doc = new PdfDocument; doc.Load("Sample.pdf");PdfPageBase page = doc.Pages[0]; PdfTextExtractor extractor = new PdfTextExtractor(page);TextLine textLines = extractor.ExtractTextLines;foreach (TextLine line in textLines) { Console.WriteLine($"行文本: {line.Text} (位置: {line.Bounds})"); foreach (TextWord word in line.Words) { Console.WriteLine($" 单词: {word.Text} (位置: {word.Bounds}, 字体: {word.FontName}, 大小: {word.FontSize})"); } }doc.Close; } }代码解析:
extractor.ExtractTextLines 返回一个 TextLine 数组,每个 TextLine 代表页面上的一行文本。TextLine 包含 Text 属性(行文本内容)和 Bounds 属性(行在页面上的矩形区域)。line.Words 进一步提供了 TextWord 数组,每个 TextWord 包含单词文本、位置、字体名称和大小等详细信息。利用这些信息,你可以根据需求重新构建文本的布局,例如生成 HTML、XML 或其他结构化数据。
分批处理: 如果 PDF 文件非常大,可以考虑将其分割成小块或按页分批处理,避免一次性加载过多内容导致内存溢出。及时释放资源: 每次处理完一个 PdfDocument 实例后,务必调用 doc.Close 方法释放其占用的内存和文件句柄。避免不必要的重复操作: 如果某个页面需要多次提取不同区域的文本,可以先创建一次 PdfTextExtractor 实例,然后多次调用其 ExtractText 方法。硬件优化: 在高性能服务器上运行,利用多核 CPU 和充足的内存,也能显著提升处理速度。来源:墨码行者