我希望有人可以帮助我……看来我要做的事情应该很简单,但是我已经为这个事情奋斗了整整一天,而且没有想法。我已经在StackOverflow和整个Internet上找到了很多信息,但是没有什么可以帮助我解决此问题。

我正在尝试将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包含如下所示:
@font-face {

    font-family: 'MisoRegular';

    src: url("miso-regular-webfont.ttf");

    -fs-pdf-font-embed: embed;

    -fs-pdf-font-encoding: Identity-H;
}

现在,我觉得这是一个非常普遍的用例,我想我只是无法执行一个简单的步骤就可以使它正常工作...问题是我已经有一段时间了,并认为我是无法透过树木看到森林。任何人都可以提供给我的帮助将不胜感激。感谢您的时间。

最佳答案

我在飞碟上遇到了问题,似乎字体没有正确嵌入,结果是我尝试嵌入的字体损坏或至少不完整。缺少有关字体系列和描述的属性。当我尝试在OS X上使用FontBook中的Validate File选项来验证我的字体时,立即出现警告,提示:

  • 'name'表的可用性
  • 'name'表结构

  • 但是,FlyingSaucer默默地失败了,只是继续嵌入Times-Roman和Times-Bold作为默认字体。当我尝试使用通过FontBook验证的字体时,我发现该字体已正确嵌入。

    我花了几个小时试图增加从FlyingSaucer进行日志记录的详细程度,以获取更多信息,直到逐步完成整个渲染过程,才发现情况确实如此,只是偶然发现加载后调试器中FontFamily设置为“”字体,并且其中不包含我希望以其注册的名称。

    底线:如果您在FlyingSaucer和字体方面遇到问题,并且将头撞在墙上,请确保您的字体有效。

    关于css - @ font-face与飞碟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10323480/

    10-12 15:18