[英]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.