2011-03-29 91 views

回答

0

字體通常繪製爲「填充形狀」。您可以通過更改文本渲染模式來添加一些寬度的筆劃,從而實現「窮人粗體」。

它看起來像iText的已經實現了這個非常有(伴隨着「窮人的斜體」,在PdfChunk.java。它採用的1/30字體大小筆劃寬度。

所以,如果你只是要求Arial Unicode的大膽版本,你應該已經得到「窮人的粗體」了。

至於組合字體,我不知道系統是這樣做的,不,你可以在例如:

void addTextToPara(Paragraph paragraph, String string, Font font, Font otherFont) { 
    BaseFont mainfont = font.getBaseFont(); 

    StringBuffer curChunk = new StringBuffer(); 
    StringBuffer otherChunk = new StringBuffer(); 

    for (int curCharIdx = 0; curCharIdx< string.length(); ++curCharIdx) { 
    char curChar = string.charAt(curCharIdx); 
    byte charBytes[] = mainFont.convertToBytes(curChar); 
    if (charBytes == null || charBytes.length == 0) { 
     // can't represent that character in the main font 
     if (curChunk.length() > 0) { 
     paragraph.add(new Chunk(curChunk.toString(), font); 
     curChunk.setLength(0); 
     } 
     otherChunk.append(curChar); 
    } else { 
     if (otherChunk.length() > 0) { 
     paragraph.add(new Chunk(otherChunk.toString(), otherFont); 
     otherChunk.setLength(0); 
     } 
     curChunk.append(curChar); 
     // can represent the character with the main font 
    } 
    } 
    if (curChunk.length() > 0) { 
    paragraph.add(new Chunk(curChunk.toString(), font); 
    } else if (otherChunk.length() > 0) { 
    paragraph.add(new Chunk(otherChunk.toString(), otherFont); 
    } 
} 

BaseFont arialBoldBaseFont = BaseFont.createFont(arialBoldPath, BaseFont.WINANSI, false); // not embedded 
BaseFont arialUnicodeBaseFont = BaseFont.createFont(arialUniPath, BaseFont.IDENTITY_H, true); // IDENITY_H forces an embedded subset, ignores "embedded" param. 

Font mainFont = new Font(arialBoldBaseFont, size); 
Font backupFont = new Font(arialUnicodeBaseFont, size, Font.BOLD); 

... 

addTextToPara(paragraph, string, mainFont, backupFont); 

注意事項上面的代碼不會嘗試查看是否可以在otherFont中繪製給定的字符。可以重寫addTextToPara()以獲得一組字體,但我幾乎沒有那麼無聊。 ;)

通過上面的代碼,你可以用你喜歡的任何編碼創建BaseFonts,我只是比98%的情況更喜歡「身份H」。 mainFont可以從WinAnsiEncoding字體構建,並且backupFont可以是其他東西。哎呀,你甚至可以做這樣的事情:

BaseFont mainFont = BaseFont.createFont(arialBoldPath, BaseFont.WINANSI, false); 
BaseFont backupFont = BaseFont.createFont(arialBoldPath, BaseFont.IDENTITY_H, true); 

使用相同的系統級字體兩種,只有嵌入落在外面「規範」的字符。這仍然會在PDF中產生兩個單獨的字體資源,但其中一個不是嵌入的(並且大部分時間都是使用的),另一個是希望的罕見字符的嵌入子集。

+0

向短語添加這樣的內容很有意義。嗯... – 2011-03-30 18:14:28