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

如何通过.NET版PDFTron获取FreeText注释的字体信息(字体族、颜色等)

获取FreeText注释的字体及颜色信息(PDFTron .NET)

嘿,我之前刚好做过类似的需求,知道只靠GetFontSize()确实不够。下面给你分享两种可靠的方式,用PDFTron .NET SDK获取FreeText注释的字体族、颜色这些细节:

一、获取颜色信息

FreeText注释的颜色可以直接通过GetColor()方法获取,它返回一个ColorPt对象,你可以把它转换成常用的RGB格式:

using (PDFDoc doc = new PDFDoc("your-document.pdf"))
{
    doc.InitSecurityHandler();
    Page targetPage = doc.GetPage(1); // 替换成你要处理的页码
    Annots allAnnots = targetPage.GetAnnots();

    for (int i = 0; i < allAnnots.Size(); i++)
    {
        Annot annot = allAnnots.GetAt(i);
        if (annot.GetType() == Annot.Type.e_FreeText)
        {
            FreeText freeTextAnnot = new FreeText(annot);
            
            // 获取颜色对象
            ColorPt annotColor = freeTextAnnot.GetColor();
            if (annotColor != null)
            {
                // 转换为0-255范围的RGB值(ColorPt默认返回0-1的浮点数)
                int red = (int)(annotColor.GetComponent(0) * 255);
                int green = (int)(annotColor.GetComponent(1) * 255);
                int blue = (int)(annotColor.GetComponent(2) * 255);
                Console.WriteLine($"FreeText 颜色: RGB({red}, {green}, {blue})");
            }
        }
    }
}

二、获取字体族信息

字体信息的获取要稍微复杂一点,因为PDF里的FreeText字体通常存储在默认外观字符串(DA)或者注释的外观流资源字典中,这里给你两种方法:

方法1:解析默认外观字符串(DA)

DA字符串是PDF定义注释外观的标准方式,格式类似"/Helvetica 12 Tf 0 g",其中包含字体名、字号、颜色等信息。我们可以通过GetDefaultAppearance()获取并解析:

// 承接上面的代码,在FreeText判断内部
string daString = freeTextAnnot.GetDefaultAppearance();
if (!string.IsNullOrEmpty(daString))
{
    // 拆分DA字符串,找到字体名部分(格式通常是 "/字体名 字号 Tf")
    string[] daParts = daString.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
    for (int j = 0; j < daParts.Length; j++)
    {
        if (daParts[j] == "Tf" && j >= 2)
        {
            // 去掉字体名前面的 '/'
            string fontFamily = daParts[j-2].TrimStart('/');
            Console.WriteLine($"字体族(DA解析): {fontFamily}");
            break;
        }
    }
}

方法2:从外观流资源字典获取(更准确)

有些复杂的FreeText注释可能会自定义外观,这时候DA字符串可能不全,直接读取外观流的资源字典会更可靠:

// 承接上面的代码,在FreeText判断内部
PDFObj appearanceObj = freeTextAnnot.GetAppearance();
if (appearanceObj != null)
{
    PDFDict resourcesDict = appearanceObj.FindObj("Resources").AsDict();
    if (resourcesDict != null)
    {
        PDFDict fontResources = resourcesDict.FindObj("Font").AsDict();
        if (fontResources != null)
        {
            // 遍历字体资源(通常只有一个)
            for (PDFDictIterator itr = fontResources.GetIterator(); itr.HasNext(); itr.Next())
            {
                PDFName fontKey = itr.Key().AsName();
                PDFDict fontObj = itr.Value().AsDict();
                // 获取字体的真实名称(BaseFont字段)
                PDFName baseFontName = fontObj.FindObj("BaseFont").AsName();
                if (baseFontName != null)
                {
                    Console.WriteLine($"真实字体名称: {baseFontName.GetName()}");
                }
            }
        }
    }
}

注意事项

  • 记得对所有返回的对象做null判断,避免空引用异常(比如有些注释可能没有设置颜色或字体)。
  • 字体名可能是PDF内置的别名(比如/Helv对应Helvetica),如果需要映射到系统字体名,可能需要额外的处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:44:12