如何用脚本检测PAC报错的非符号TrueType字体编码项问题?
解决PAC检测的“非符号型TrueType字体存在Encoding条目”问题
你的原脚本未检测到PAC报错的核心原因是逻辑与错误定义完全相反:PAC提示的是「非符号型TrueType字体中存在Encoding条目」,而原脚本在检测「缺少Encoding且缺少ToUnicode的非符号字体」。以下是修改后的脚本及关键调整:
修改后的检测脚本
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDResources; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDFontDescriptor; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import java.io.File; import java.io.IOException; public class FindEncodingIssueFonts { public static void main(String[] args) throws IOException { File inputFile = new File("input.pdf"); try (PDDocument document = PDDocument.load(inputFile)) { boolean foundIssue = false; for (int pageIndex = 0; pageIndex < document.getNumberOfPages(); pageIndex++) { PDPage page = document.getPage(pageIndex); PDResources resources = page.getResources(); if (resources == null) continue; for (COSName fontName : resources.getFontNames()) { PDFont font = resources.getFont(fontName); if (font == null) continue; PDFontDescriptor descriptor = font.getFontDescriptor(); if (descriptor == null) continue; // 判断是否为TrueType字体:检查FontFile2条目(TrueType字体的特征) boolean isTrueType = descriptor.getCOSObject().containsKey(COSName.FONT_FILE2); if (!isTrueType) continue; // 判断是否为非符号型字体:PDF规范中,Bit6(NonSymbolic=64)为非符号,Bit3(Symbolic=4)为符号 int flags = descriptor.getFlags(); boolean isNonSymbolic = ((flags & 64) != 0) || ((flags & 4) == 0); if (isNonSymbolic) { // 检测是否存在Encoding条目(PAC报错的核心条件) boolean hasEncoding = hasEncodingEntry(font); if (hasEncoding) { foundIssue = true; System.out.println("❌ 匹配PAC错误:"); System.out.println(" 字体名称: " + font.getName()); System.out.println(" 所在页码: " + (pageIndex + 1)); System.out.println(" 错误描述: 非符号型TrueType字体中存在Encoding条目"); } } } } if (!foundIssue) { System.out.println("✅ 未检测到PAC提示的「非符号型TrueType字体存在Encoding条目」错误"); } } } // 检查字体字典是否包含Encoding条目 private static boolean hasEncodingEntry(PDFont font) { COSDictionary dict = font.getCOSObject(); return dict.containsKey(COSName.ENCODING); } }
关键调整说明
- 核心逻辑修正:将检测目标从「缺少Encoding/ToUnicode」改为「非符号型TrueType字体存在Encoding条目」,完全匹配PAC的错误定义
- TrueType字体校验:通过FontDescriptor的
FontFile2条目判断是否为TrueType字体,精准锁定错误限定的字体类型 - 非符号字体判断优化:结合PDF规范的Flags位(Bit6为NonSymbolic,Bit3为Symbolic),确保非符号字体的判断准确
- 移除冗余检测:删除与当前PAC错误无关的ToUnicode检测,聚焦问题本身
内容的提问来源于stack exchange,提问作者fascinating coder
相关产品推荐
相关产品推荐

