2012-04-25 66 views
3

我在跳一個人可以幫助我......看起來我想做的事情應該相當簡單,但我一直在爲這件事爭取一整天,而且沒有想法。我在StackOverflow和Internet上發現了大量信息,但沒有什麼能幫助我解決這個問題。@飛碟的font-face

我正在嘗試使用itext-2.0.8以及core-renderer-R8來創建帶有嵌入字體的PDF。我正嘗試從有效的XHTML生成PDF,並使用@ font-face樣式標記嵌入字體。我已經確認@ font-face標籤是通過在瀏覽器中打開文件來包含字體的。我總是小心地保持TTF場相對於XHTML/CSS文檔。

爲了嘗試和通過我的方式工作,我創建了一個小型'Hello World'類型的程序來嘗試嵌入字體。我採取了兩種獨立的方法,他們都未能產生預期的結果。我已經將這個小Eclipse程序的副本放在http://christopherluft.com/FlyingSaucer.zip

該程序在兩種情況下均生成PDF,但都沒有按預期嵌入PDF。使用帶有setDocument的文件的第一種方法不會產生錯誤,也不會產生字體。第二種方法生成PDF,但在調試輸出中顯示了java.net.MalformedURLException。

我嘗試了各種路徑和URL的許多排列組合;然而,沒有人不能產生期望的結果。我的懷疑是我無法理解有關ITextRenderer.setDocument的內容;然而,我很難找到任何適合我的用例的文檔。

我想第一個方法是:

public static void main(String[] args) throws IOException, DocumentException { 

    System.getProperties().setProperty("xr.util-logging.loggingEnabled", 
      "true"); 
    XRLog.setLoggingEnabled(true); 

    String inputFile = "sample.xhtml"; 
    String url = new File(inputFile).toURI().toURL().toString(); 
    String outputFile = "firstdoc.pdf"; 

    OutputStream os = new FileOutputStream(outputFile); 

    ITextRenderer renderer = new ITextRenderer(); 
    renderer.setDocument(url); 
    renderer.layout(); 
    renderer.createPDF(os); 

    os.close(); 
} 

,我使用(這是更接近我們用它在我們的應用程序的實際方式)的第二個方法是:

public static void main(String[] args) throws IOException, DocumentException { 

    System.getProperties().setProperty("xr.util-logging.loggingEnabled", "true"); 
    XRLog.setLoggingEnabled(true); 

    String inputFile = "sample.xhtml"; 
    String url = new File(inputFile).toURI().toURL().toString(); 

    DocumentBuilder documentBuilder; 
    org.w3c.dom.Document xhtmlContent; 

    try 
    { 
     documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     documentBuilder.setEntityResolver(new XhtmlEntityResolver(new SuppressingEntityResolver())); 
     xhtmlContent = documentBuilder.parse(url); 

     System.out.println(url); 

     String outputFile = "firstdoc.pdf"; 
     OutputStream os = new FileOutputStream(outputFile); 
     ITextRenderer renderer = new ITextRenderer(); 

     renderer.setDocument(xhtmlContent,"."); 
     renderer.layout(); 
     renderer.createPDF(os); 

     System.out.println("Finishing up...."); 
     os.close(); 
    } 
    catch (SAXException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    catch (ParserConfigurationException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

而在XHTML中包含的@ font-face看起來像這樣:

現在我覺得這是一個很常見的u我想,我只是沒有執行一個簡單的步驟,爲了讓這個工作...問題是,我一直在這一段時間,並認爲我無法通過樹木看到森林。任何人可以提供給我的幫助將不勝感激。感謝您的時間。

+0

確保Maven不會損壞您的字體。 http://stackoverflow.com/a/35367727/2420718 – 2016-06-29 21:54:13

回答

4

我遇到飛碟的問題,看起來字體沒有正確嵌入,結果是我試圖嵌入的字體被破壞或至少不完整。有關字體系列和說明的屬性缺失。當我試圖驗證使用FontBook的驗證文件選項我的字體在OS XI被及時帶有警告說:

  • 「名」表可用性
  • 「名」表結構

然而FlyingSaucer默默地失敗,只是將Times-Roman和Times-Bold嵌入爲默認字體。當我嘗試使用通過FontBook驗證的字體時,我發現字體已正確嵌入。

我花了幾個小時試圖增加從FlyingSaucer登錄的詳細信息以獲取更多信息,直到我逐步完成整個渲染過程並且恰巧注意到FontFamily被設置爲「」時才發現這種情況加載字體後的調試器,並且它沒有包含我期望它註冊的名稱。

底線:如果您在使用FlyingSaucer和字體時遇到問題,並將頭撞向牆壁,請確保您的字體有效。

+0

謝謝。我使用FontForge修復了我的字體,您可以在其中快速修復錯誤。使用有效字體時,FlyingSaucer會選擇它。 – kevinverhoef 2015-06-19 09:55:03

2

我掙扎着像tekgrunt一樣的問題,但最終我得到了一個嵌入自定義字體(計算機現代)的PDF。我的經驗:

  • 的字體格式OTF沒有工作(崩潰在iText的功能)
  • TTF格式沒有工作後,我做了如下改變:在CSS中使用相同的字體家族名稱就像在字體中編碼的名稱一樣。在
    org.xhtmlrenderer.pdf.ITextFontResolver.addFontFaceFont()
    中設置斷點並找出變量「fontFamily」獲得的值。如果這與CSS font-family不一樣,我猜這是行不通的。

當然,這些問題應該由圖書館向用戶報告。