2012-04-25 59 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不一样,我猜这是行不通的。

当然,这些问题应该由图书馆向用户报告。