2011-04-15 63 views
4

我正在使用itext創建PDF文檔。由於許可限制,某些字體無法使用。如何檢查字體是否可嵌入

... 
ExceptionConverter: com.lowagie.text.DocumentException: C:\WINDOWS\Fonts\LucidaSansRegular.ttf cannot be embedded due to licensing restrictions. 
    at com.lowagie.text.pdf.TrueTypeFontUnicode.<init>(Unknown Source) 
    at com.lowagie.text.pdf.BaseFont.createFont(Unknown Source) 
    at com.lowagie.text.pdf.BaseFont.createFont(Unknown Source) 
    at com.lowagie.text.pdf.BaseFont.createFont(Unknown Source) 
    at com.lowagie.text.pdf.DefaultFontMapper.awtToPdf(Unknown Source) 
    at com.lowagie.text.pdf.PdfGraphics2D.getCachedBaseFont(Unknown Source) 
    at com.lowagie.text.pdf.PdfGraphics2D.setFont(Unknown Source) 
... 

我想檢查字體或PDF內容來檢查這種情況。如何檢查一個字體是否可以使用java或itext嵌入?

+2

使用,你可以如'try {embed ...} catch(not embeddable){}' – Erik 2011-04-15 11:38:00

回答

5

據我所知,沒有直接的方法來識別是否可以嵌入字體。 我做了一個快速搜索,除了使用Erik在註釋中提到的異常捕獲方法之外,我不認爲這是可能的。

// 1) have a list of all fonts ArrayList allAvailableFonts; 
// 2) second list of fonts that that can be embedded ArrayList embedableFonts; 

//Iterate through every available font in allAvailableFonts 

for(.... allAvailableFonts .....) 
{ 
    boolean isFontEmbeddable = true; 
    try 
    { 
      // try to embed the font 
    } 
    catch(DocumentException de) 
    { 
     //this font cannot be embedded 
     isEmbeddable = false; 
    } 

    if(isEmbeddable) 
    { 
     // add to list of embeddable fonts 
     embedableFonts.add (font); 
    } 
} 

你或許可以去真正的鐵桿,並執行到的Windows API本地調用,以獲得相同的結果,但我認爲它太多的工作了一個簡單的任務,因爲這。

做了一些研究,並發現瞭如何異常是由Java的

產生上述異常可以在這裏找到的代碼拋出。 http://kickjava.com/src/com/lowagie/text/pdf/TrueTypeFont.java.htm 行號367368

if (!justNames && embedded && os_2.fsType == 2) 
    throw new DocumentException(fileName + style + " cannot be embedded due to licensing restrictions."); 

有趣的部分要注意的是條件os_2.fsType == 2

OS_2是WindowsMetrics實例看線174這裏 http://kickjava.com/src/com/lowagie/text/pdf/TrueTypeFont.java.htm

一種在谷歌和這個WindowsMetrics搜索是我得到的。

這說明了參數fsType保存了是否可以嵌入字體的信息。 http://www.microsoft.com/typography/otspec/os2ver3.htm#fst

相當於Java中的WindowsMetrics作爲在iText的 http://www.docjar.org/docs/api/com/lowagie/text/pdf/TrueTypeFont.WindowsMetrics.html