如何通过.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
相关产品推荐
相关产品推荐

