PDFBox - 无法编码由代理对

时间:2017-11-06 16:43:29

标签: java unicode pdfbox emoji surrogate-pairs

在我的PDFBox实现中,我创建了通过测试不同字体来编写多种语言字符串的方法。

PDFont currentFont = PDType0Font.load(pdfDocument, new File("path/to/font/font.ttf"));
for (int offset = 0; offset < sValue.length();) {
    int iCodePoint = sValue.codePointAt(offset);
    boolean isEncodable = isCodePointEncodable(currentFont, iCodePoint);
    //-Further logic here, etc.

    offset += Character.charCount(iCodePoint);
}

private boolean isCodePointEncodable (PDFont currentFont, int iCodePoint) throws IOException {
    StringBuilder st = new StringBuilder();
    st.appendCodePoint(iCodePoint);
    try {
        currentFont.encode(st.toString());
        return true;
    } catch (IllegalArgumentException iae) {
        return false;
    }
}

虽然这适用于基本多语言平面(BMP)中的任何内容,但任何涉及BMP之外的unicodes的内容都不起作用。我已经下载并使用字形图广泛查看了所涉及的字体,并记录了每个代码。例如,在尝试编码时,即U + 1F681(或十进制128641),我跟踪了日志记录,发现它特意尝试在NotoEmoji-Regular.ttf中对此字符进行编码,这是正确匹配的字符,确实有这个角色。不幸的是,它仍然是假的。

具体来说,我的日志服务器返回了这个:

Code Point 128641 () cannot be encoded in font NotoEmoji

是否有任何解决方法或解决方案?谢谢。

1 个答案:

答案 0 :(得分:1)

我创建并解决了问题PDFBOX-3997。原因是我们没有使用最好的cmap子表。

没有解决方法,但错误将在2.0.9版本中修复,几个月后即可解决。但是你不必等那么久 - 你可以用snapshot build进行测试。