繁体   English   中英

如何找出可以使用给定字体在PDF中呈现的字符?

[英]How to find out what chars can be rendered in PDF in the given font?

我遇到了一个类似此问题的问题 :有些字符无法以我使用的字体显示( Lato-Regular.ttf )。 通过加载字体

document = new PDDocument();
baseFont = PDType0Font.load(document, stream);

在评论中,我被告知类型0字体早已过时,但是, PDTrueTypeFont#load的Javadoc说

简单字体仅支持256个字符。 为了支持Unicode,请改用PDType0Font#load(PDDocument, File)

这就是我所做的。


问题发生在 ,它实际上是一个控制字符,因此呈现它显然没有任何意义。 主要原因是导入中使用了错误的字符集。

字体似乎包含了我到目前为止所需的所有字符。 但是,由于输入是任意Unicode字符串,因此字体中可能缺少一些适当的字符。

替换无效字符很简单,但是我需要知道哪些字符有效。 最初,我认为我可以使用

PDType0Font.hasGlyph(code);

但是该代码是一些PDF内部代码,即,当您有String且不知道如何转换时,它完全没有用。 有一个受保护的方法encode ,它“对给定的字符串进行编码以供在PDF内容流中使用”(无论它是什么意思),并且听起来没有什么转换。

有比这种丑陋更好的方法吗?

private boolean canRender(PDType0Font font, int codepoint) {
    try {
        font.getStringWidth(new String(Character.toChars(codepoint)));
        return true;
    } catch (final Exception e) {
        return false;
    }
}

替换无效字符很简单,但是我需要知道哪些字符有效。

使用Font.canDisplayUpto(text)

String content = "ĈĉĜĝĤĥĴĵŜŝŬŭ";
java.awt.Font font = java.awt.Font.createFont​(java.awt.TRUETYPE_FONT,
                                              inputStream);
int index = font.canDisplayUpTo​(content);
if (index != -1) {
    throw new IllegalStateException(
        String.format("Font does not contain U+%06X: %s",
             context.codePointAt(index),
             font.getFamily()));
}

可以加载TRUETYPE_FONT和TYPE1_FONT。 Type0可能没有涵盖,但是您提到了True-Type兼容性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM