【问题标题】:How to embed font in PDF created from HTML with iText and Flying Saucer?如何在使用 iText 和飞碟的 HTML 创建的 PDF 中嵌入字体?
【发布时间】:2011-11-23 10:26:03
【问题描述】:

我在将波兰字体嵌入从 HTML 转换的 PDF 时遇到问题。

我的 HTML 代码在正文中有样式:

<BODY style="font-family: Tahoma, Arial, sans-serif;font-size : 8pt;">

我尝试了两种将此类 HTML 转换为 PDF 的方法:

  • 带有 htmlcleaner 的 FOP
  • 带有飞碟的 iText

对于 FOP,我可以将所有使用的字体添加到其配置文件中,然后创建的 PDF 嵌入这些字体(如果字体在 HTML 中使用)。在生成的 PDF 中,我使用 Identity-H 编码的 Tahoma 字体。看起来不错 - 所有波兰字母都按预期显示。

然后我尝试使用 iText 进行这种转换:似乎更简单,因为我不需要为每个 HTML 创建转换。不幸的是,我不知道如何将使用过的字体嵌入到生成的 PDF 中。我发现的大多数示例都是从头开始创建 PDF,但我不知道如何将这些方法应用于飞碟 ITextRenderer 或转换中使用的其他对象。

我当前的代码尝试通过获取ITextFontResolver 并添加字体fs.addFont(path, true); 来在PDFCreationListener.preOpen() 中添加字体。但是我创建的所有 .pdf 都没有我想要的字体。

第二个问题是结果 PDF 没有波兰字母。飞碟或 iText 有问题吗? Acrobat 显示创建的 PDF 文档使用带有 Ansi 编码和 ArialMT 作为字体的 Helvetica。我觉得这个 Ansi 编码不好。如何设置波兰语编码(Identity-H)?

【问题讨论】:

    标签: html pdf itext apache-fop flying-saucer


    【解决方案1】:

    工作示例:

    项目根目录下的文件:

    • Calibri.ttf
    • input.html

    代码:

    File inputFile = new File("input.html");
    File outputFile = new File("example.pdf");
    
    ITextRenderer renderer = new ITextRenderer();
    
    String url = inputFile.toURI().toURL().toString();
    FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
    
    renderer.setDocument(url);
    renderer.getFontResolver().addFont("Calibri.ttf", BaseFont.IDENTITY_H, true);
    renderer.layout();
    renderer.createPDF(fileOutputStream);
    
    fileOutputStream.close();       
    

    HTML:

    <style type="text/css">
        body {
            font-family: Calibri, sans-serif;
        }
    </style>
    

    令人惊讶的是 @font-face 不需要 css

    【讨论】:

      【解决方案2】:

      我的错误是在PDFCreationListener.preOpen() 中使用了FontResolver.addFont()。我在 renderer.layout(); 之前移动了它,现在可以使用了!

      【讨论】:

      • 嘿,我也有同样的问题,我试过这段代码renderer.getFontResolver().addFont("c:/simsun.ttf", "UTF-8",BaseFont.EMBEDDED);//I also tried with arialuni.ttf ,但它不起作用
      【解决方案3】:

      你可以试试 -fs-pdf-font-embed 和 -fs-pdf-font-encoding css 规则。

      来自User's Guide

      -fs-pdf-font-embed: 与嵌入字体规则中的值一起使用 让飞碟在 PDF 文档中嵌入字体文件, 避免调用 FontResolver 的 addFont() 方法 类

      -fs-pdf-font-encoding: 在字体规则内使用来指定 为您嵌入 PDF 中的自定义字体编码;采取 编码的名称作为值。

      例如在您的打印 css 中:

      @font-face {
          font-family: DejaVu Serif;
          src: url(fonts/DejaVuSerif.ttf);
          -fs-pdf-font-embed: embed;
          -fs-pdf-font-encoding: Identity-H;
      }
      

      【讨论】:

      • 谢谢,我试过了,这不起作用。当然我也试过FontResolver.addFont(),但结果PDF没有我想要的字体。
      • 奇怪,这对我来说很好用。只要确保使用正确的src 语法; FS 似乎只了解 url() 部分,而不了解 format() 或其他任何内容。必须只有一个只有 ttf 文件的 src。上面的例子有效。
      • 这对我有用。使用@font-face { font-family: Roboto; src: url(file:///home/fonts/Roboto-Regular.ttf); font-weight: normal; font-style: normal; -fs-pdf-font-embed: embed; -fs-pdf-font-encoding: Identity-H; } 更详细地添加了 Googles Roboto,并由例如使用它。 &lt;body style="font-family: Roboto;"&gt;
      猜你喜欢
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2021-03-25
      相关资源
      最近更新 更多