You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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本身不返回元素引用,需手动记录文本元素的关键信息:

  1. 定义一个自定义类存储文本元素的元数据:
    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; }
    }
    
  2. 维护一个集合存储所有绘制的文本元素,修改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
            });
        }
    }
    
  3. 后续需要确认创建的元素时,直接从_drawnTextElements集合中查询即可。

二、查找已有PDF中的特定文本元素

PdfSharp本身无内置文本提取API,需通过内容解析或第三方工具实现:

  1. 使用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;
    }
    
  2. 注意事项:解析时需处理文本分段、换行等情况,复杂PDF可能需要拼接分散的文本片段;若内置解析能力不足,可搭配专门的PDF文本提取库(需注意许可证兼容性)辅助实现。

内容的提问来源于stack exchange,提问作者Matt W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:35:57