有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何忽略PDFBox 2.0.7使用的字体中缺少的字形

我看到在调用PDFPageContentStream的showText(String)方法时引发“java.lang.IllegalArgumentException:No glyph for U+05D0 in font”(例如)异常

捕获异常并没有多大帮助,因为无法编写好的字符。检查输入字符串中的每一个字符也不重要,这将是性能杀手(每个PDF可能有数千页,数百万个字符)。我真正需要的是一种方法来防止任何缺少的glyph出现异常,并将其自动替换为其他glyph,或显示unicode值的动态创建的glyph

我不想因为字体不支持特定的字形而停止生成PDF,我只想使用一些替换字符,然后继续

如何做到这一点


共 (1) 个答案

  1. # 1 楼答案

    我就是这么做的

    private final char[] replacements = IntStream.range(0, 1<<16)
        .map(c -> canRender(font, c) ? c : "?")
        .collect(StringBuilder::new, StringBuilder::appendCodePoint,
                 StringBuilder::append)
        .toString().toCharArray();
    
    // This is extremely ugly!!!
    private boolean canRender(PDType0Font font, int codepoint) {
        try {
            font.getStringWidth(new String(Character.toChars(codepoint)));
            return true;
        } catch (final Exception e) {
            return false;
        }
    }
    
    String sanitize(String input) {
        return input.codePoints()
                .map(c -> c<replacements.length ? replacements[c] : '?')
                .collect(StringBuilder::new, StringBuilder::appendCodePoint,
                         StringBuilder::append)
                .toString();
    

    我认为,这不值得优化,因为在PDF生成过程中,还需要做更多的工作,包括hasGlyph测试