如何获取PdfSharp中XGraphics.DrawString创建的文本元素ID及查找指定文本
关于PdfSharp创建文本元素及查找特定文本元素的解决方案
问题背景
使用PdfSharp NuGet包可在PDF文档中创建文本元素,但XGraphics.DrawString方法无返回值,无法直接识别创建的元素。现有创建文本元素的代码如下:
private static void DrawLabel(PdfPage page, PdfRectangle pdfRect, string text, XFont Font, XBrush brush, XStringFormat format) { using (XGraphics gfx = XGraphics.FromPdfPage(page)) { gfx.DrawString(text, font, brush, layoutRect, format); } }
需解决两个核心问题:
- 如何确定所创建的文本元素
- 如何查找含特定文本的已有元素
解决方案
一、跟踪创建的文本元素
由于DrawString本身不返回元素引用,需手动记录文本元素的关键信息:
- 定义一个自定义类存储文本元素的元数据:
public class PdfTextElement { public string Text { get; set; } public PdfRectangle Bounds { get; set; } public XFont Font { get; set; } public XStringFormat Format { get; set; } public PdfPage Page { get; set; } } - 维护一个集合存储所有绘制的文本元素,修改
DrawLabel方法时同步添加元数据:// 类级别集合,用于记录所有绘制的文本元素 private static List<PdfTextElement> _drawnTextElements = new List<PdfTextElement>(); private static void DrawLabel(PdfPage page, PdfRectangle pdfRect, string text, XFont font, XBrush brush, XStringFormat format) { using (XGraphics gfx = XGraphics.FromPdfPage(page)) { gfx.DrawString(text, font, brush, pdfRect, format); // 同步记录文本元素信息 _drawnTextElements.Add(new PdfTextElement { Text = text, Bounds = pdfRect, Font = font, Format = format, Page = page }); } } - 后续需要确认创建的元素时,直接从
_drawnTextElements集合中查询即可。
二、查找已有PDF中的特定文本元素
PdfSharp本身无内置文本提取API,需通过内容解析或第三方工具实现:
- 使用PdfSharp内置的内容解析工具(部分版本包含
PdfSharp.Pdf.Content命名空间):public static List<PdfTextElement> FindTextInPage(PdfPage page, string searchText) { var foundElements = new List<PdfTextElement>(); var contentReader = PdfContentReader.FromPage(page); foreach (var content in contentReader.Contents) { if (content.Text.Contains(searchText)) { foundElements.Add(new PdfTextElement { Text = content.Text, Bounds = content.Bounds, Page = page }); } } return foundElements; } - 注意事项:解析时需处理文本分段、换行等情况,复杂PDF可能需要拼接分散的文本片段;若内置解析能力不足,可搭配专门的PDF文本提取库(需注意许可证兼容性)辅助实现。
内容的提问来源于stack exchange,提问作者Matt W
相关产品推荐
相关产品推荐

