2014-12-07 136 views
2

在書我看到例如:字體之間有什麼區別是embedd字體和nonembedd字體?

BaseFont bf = BaseFont.createFont("KozMinPro-Regular", "Identity-V", BaseFont.NOT_EMBEDDED); 
Font font = new Font(bf, 20); 
VerticalText vt = new VerticalText(writer.getDirectContent()); vt.setVerticalLayout(390, 570, 540, 12, 30); 
font = new Font(bf, 20); 
vt.addText(new Phrase(convertCIDs("a"), font)); 
vt.go(); 

public String convertCIDs(String text) { 
    char cid[] = text.toCharArray(); 
    for (int k = 0; k < cid.length; ++k) { 
    char c = cid[k]; 
    if (c == '\n') 
    cid[k] = '\uff00'; 
    else 
    cid[k] = (char) (c - ' ' + 8720); 
    } 
    return new String(cid); 
} 

當我更改爲:

BaseFont bf = BaseFont.createFont("/../KozMinProRegular.otf",BaseFont.IDENTITY_V, BaseFont.EMBEDDED); 

結果: 'a' 沒有順時針旋轉90度。

回答

3

當字體未嵌入時,PDF查看器不知道字體的樣子。它不是使用實際字體,而是在查看文檔的人的操作系統上搜索具有相似名稱的字體。

例如:有14個所謂的標準Type 1字體不需要被嵌入:

  • ZAPFDINGBATS
  • 次羅馬
  • 次斜體
  • 黑體-boldoblique
  • courier-boldoblique
  • helvetica-bold
  • 黑體
  • 快遞斜
  • 黑體斜
  • 快遞粗體
  • 倍,BOLDITALIC
  • 快遞
  • 倍,大膽
  • 符號

如果使用iText中的這些字體,iText將忽略embedded參數,因爲假定Adobe Reader和其他查看器可以正確呈現這些字體是安全的。

現在假設您使用特殊字體,例如可口可樂字體來繪製您在可口可樂廣告上看到的文字,或者使用華特迪士尼字形來繪製文字。在這種情況下,最好嵌入字體。如果你不這樣做,那麼當用戶打開他的PDF文檔時,字體很可能無法正確顯示。

嵌入字體意味着您將全字體或字體的子集的字形描述包含到PDF中。這會導致文件大小增加,但在某些情況下,嵌入字體是必需的。例如:如果您想遵守PDF/A標準,則需要嵌入所有字體。

當使用CJK字體(在itext-asian.jar中定義的字體)時,iText將忽略embedded參數。它會從來沒有嵌入CJK字體,因爲CJK字體希望在您的查看器中存在亞洲字體包(如果它不存在,Adobe Reader會要求您下載這樣的字體包)。

當使用IDENTITY_H或​​,iText的也將忽略embedded參數,因爲您在使用這些值的encoding參數時,嵌入字體的一個子集的PDF規範要求。

現在還不清楚爲什麼你會希望在更改embedded參數時順時針旋轉90度的字形。在我看來,你正在混合一些概念。​​不是關於旋轉字形。這是關於垂直渲染文本而不是水平。對於西方語言,我們按照從左到右和從上到下的順序水平寫文本。阿拉伯文和希伯來文從右到左寫成橫線。一些亞洲語言,如日語,是垂直書寫的,從右到左列。這是在您要使用​​時,不要將字形旋轉90度,而是要確保不同字形之間的垂直間距正確(而IDENTITY_H定義了水平間距)。

有關V有意義的示例,請參閱vertical_text_1.pdf。還有,我們旋轉文本的例子:

/** 
* Converts the CIDs of the horizontal characters of a String 
* into a String with vertical characters. 
* @param text The String with the horizontal characters 
* @return A String with vertical characters 
*/ 
public String convertCIDs(String text) { 
    char cid[] = text.toCharArray(); 
    for (int k = 0; k < cid.length; ++k) { 
     char c = cid[k]; 
     if (c == '\n') 
      cid[k] = '\uff00'; 
     else 
      cid[k] = (char) (c - ' ' + 8720); 
    } 
    return new String(cid); 
} 

結果如下:vertical_text_2.pdf(不是很好,我承認)。這個例子的完整代碼,可以找到here

+0

我的問題是:「如何以字體(.otf)的旋轉模式顯示文本嵌入」作爲鏈接http://www.unicode.org/Public/vertical/revision-13/VerticalOrientation-13.html。我發現很多主題,但沒有任何解決方案。 – 2014-12-07 17:11:01

+0

我更新了這個例子。解決方案的關鍵是您需要使用正確的UNICODE值。 'convertCIDs'方法將水平西文字母的Unicode值轉換爲旋轉90度的相同字母的Unicode值。我不知道這是否適用於其他語言。爲什麼你自己如此困難?爲什麼不使用正常字母並旋轉完整的'String'?你想達到什麼目的?也許你正在用一種非常困難的方式來做一些非常簡單的事情。 – 2014-12-07 17:17:14

+0

在日語中,字母以旋轉模式(以字體顯示)與普通字母(順時針旋轉90度)不同。例如:unicode U + 3300中的char作爲鏈接http://www.unicode.org/reports/tr50/。因爲我想通過cmap將水平模式中的字符映射到垂直模式。 – 2014-12-07 17:26:41

相關問題