首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@字体-font字体

@字体-font字体
EN

Stack Overflow用户
提问于 2012-04-25 20:44:59
回答 2查看 7.6K关注 0票数 6

我在跳有人能帮我..。似乎我想做的事情应该是相当简单的,但我已经为这件事斗争了一天多了,已经没有想法了。我在StackOverflow和互联网上找到了很多信息,但是没有什么帮助我解决这个问题。

我正在尝试使用itext-2.0.8以及核心渲染器-R8创建一个带有嵌入式字体的PDF。我试图从有效的XHTML生成PDF,并使用@字体样式标记嵌入字体。我已经确认@字体面板标签是通过在浏览器中打开文件来包含字体的。我总是小心地保持TTF字段相对于teh /CSS文档。

为了尝试和工作方式通过这一点,我已经创建了一个小的'Hello‘类型的程序,试图嵌入字体。我采取了两种不同的办法,但都未能产生预期的结果。我在http://christopherluft.com/FlyingSaucer.zip放了一份Eclipse程序的副本

该程序在这两种情况下都生成一个PDF,但也没有像预期的那样嵌入PDF。使用带有setDocument的文件的第一种方法不会产生错误,也不会产生字体。第二个方法生成一个PDF,但在调试输出中显示一个java.net.MalformedURLException。

我尝试过各种路径和URL的多次排列;但是,没有一个不能够产生期望的结果。我的怀疑是,我没有理解ITextRenderer.setDocument的一些东西;然而,我已经很难找到任何适合我的用例的适当文档。

我正在尝试的第一个方法是:

代码语言:javascript
复制
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();
}

我使用的第二个方法(更接近我们在应用程序中使用它的实际方式)是:

代码语言:javascript
复制
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中的@字体面包含如下所示:

代码语言:javascript
复制
@font-face {

    font-family: 'MisoRegular';

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

    -fs-pdf-font-embed: embed;

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

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

EN

回答 2

Stack Overflow用户

发布于 2012-04-27 02:10:21

我曾经经历过飞碟的问题,似乎字体没有被正确的嵌入,结果是我试图嵌入的字体已经损坏或者至少不完整。缺少有关字体家族和描述的属性。当我尝试在OS上使用FontBook中的Validate选项验证我的字体时,我立刻收到了警告:

表usability

  • 'name‘表结构
  • 'name’

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

我花了几个小时试图增加来自FlyingSaucer的日志记录的冗长性,以获取更多的信息,直到我逐步完成整个呈现过程,我才发现情况是这样的,只是碰巧注意到,在加载字体之后,FontFamily设置为"“在调试器中,并且它没有包含我希望它注册的名称。

的底线:,如果你对FlyingSaucer和字体有问题,并且把头撞在墙上,确保你的字体是有效的。

票数 4
EN

Stack Overflow用户

发布于 2020-09-15 11:22:26

我也面临着一个类似的问题,字体没有被应用到最终的pdf中,而m4t关于调试的建议确实帮助我识别了这个问题,所以谢谢你!

就我的情况而言,实际上有两个问题:

  1. 作为@font-face规则的一部分指定的src属性有两个值,即url和格式。它看起来有点像

代码语言:javascript
复制
@font-face {
   src: url("../../static/fonts/OpenSans-Regular.ttf") format("ttf");
}

由于第二个值format,CSSParser中断,导致src属性完全被悄悄跳过。因此,在进一步处理时,呈现不知道从哪里选择字体。一旦我从值中删除了format部件,问题就得到了解决。

  1. 一旦CSSParser成功地解析了url,就无法正确地解析它,因为css中指定的url是一个相对的url,并且在在呈现器上调用setDocumentAsString时没有显式指定(可选的第二个参数) baseUrl。我通过使用类加载器显式地在代码中加载静态资源的uri来解决这个问题,然后将其设置为基本url。更改后,字体文件的路径被成功解析并应用到我的pdf中。

这里需要注意的是,提供给

的基本url必须是URI (文件:/ setDocumentAsString /structure/static/),并且必须以尾随斜杠('/')结尾。否则,文件和url不能得到正确的解析。

希望这对面临类似问题的人有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10323480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档