簡體   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