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

如何用脚本检测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);
    }
}

关键调整说明

  1. 核心逻辑修正:将检测目标从「缺少Encoding/ToUnicode」改为「非符号型TrueType字体存在Encoding条目」,完全匹配PAC的错误定义
  2. TrueType字体校验:通过FontDescriptor的FontFile2条目判断是否为TrueType字体,精准锁定错误限定的字体类型
  3. 非符号字体判断优化:结合PDF规范的Flags位(Bit6为NonSymbolic,Bit3为Symbolic),确保非符号字体的判断准确
  4. 移除冗余检测:删除与当前PAC错误无关的ToUnicode检测,聚焦问题本身

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:07:02