[英]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;
}
}
替换无效字符很简单,但是我需要知道哪些字符有效。
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.