如何在C#中读取PDF文件特定区域内的文本?
在C#中读取PDF特定区域跨多行文本的方案
方法1:基于iTextSharp自定义提取策略
iTextSharp的Rectangle固定坐标提取存在局限,但可以通过自定义文本提取策略,判断每个文本块是否落在目标区域内,从而收集跨多行的文本:
using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; using System.Collections.Generic; using System.Linq; public class RegionTextExtractor : LocationTextExtractionStrategy { private readonly Rectangle _targetRegion; private readonly List<string> _matchedChunks = new(); public RegionTextExtractor(Rectangle region) { _targetRegion = region; } public override void RenderText(TextRenderInfo renderInfo) { var textBounds = renderInfo.GetDescentLine().GetBoundingRectange(); // 检查文本块是否与目标区域相交 if (_targetRegion.Intersects(textBounds)) { _matchedChunks.Add(renderInfo.GetText()); } } public string GetResultText() => string.Join(" ", _matchedChunks); } // 调用示例 using (var pdfReader = new PdfReader("target.pdf")) { // 定义目标区域(x1,y1: 左下角坐标;x2,y2: 右上角坐标) var targetArea = new Rectangle(150, 300, 600, 500); var extractor = new RegionTextExtractor(targetArea); PdfTextExtractor.GetTextFromPage(pdfReader, 1, extractor); string extractedText = extractor.GetResultText(); }
方法2:使用PdfPig库(更简洁)
PdfPig是轻量的PDF处理库,直接暴露每个字符的位置信息,可轻松筛选区域内的文本,天然支持跨多行场景:
首先通过NuGet安装UglyToad.PdfPig,然后使用以下代码:
using UglyToad.PdfPig; using UglyToad.PdfPig.Content; using (var doc = PdfDocument.Open("target.pdf")) { var page = doc.GetPage(1); // 定义目标区域(PDF坐标以左下角为原点) var targetRegion = new PdfRectangle(150, 300, 600, 500); // 筛选区域内的字符并拼接 string extractedText = string.Join("", page.Letters .Where(letter => targetRegion.Contains(letter.BoundingBox)) .Select(letter => letter.Value)); }
注意事项
- PDF的坐标系统以左下角为原点,定义区域时要确认坐标的准确性,避免提取范围错误。
- 若PDF是扫描件生成的图片PDF,上述方法无效,需先做OCR识别(可结合Tesseract库)。
内容的提问来源于stack exchange,提问作者Dinesh
相关产品推荐
相关产品推荐

