java - 如何使用自定义字体从 servlet 使用 iText+XMLWorker 创建 PDF?

标签 java pdf servlets itext xmlworker

使用 iText/XMLWorker 示例(主要是 this one ),我可以轻松编写简单的应用程序,能够使用我自己的额外字体从 HTML 代码创建 PDF 文件,但一旦尝试在某些 Web 服务代码中使用我的东西,我以如下异常(exception)结束:

Table 'name' does not exist in file:/C:/work/MyServer/target/classes/fonts/My%20Font.ttf
ExceptionConverter: com.itextpdf.text.DocumentException: Table 'name' does not exist in file:/C:/work/MyServer/target/classes/fonts/My%20Font.ttf

...这似乎指出在 Web 服务上下文中,无法按预期加载字体文件。这是我的大部分代码:

public HtmlRenderer(final String css, final String[] fontPaths) {
    // fontPaths = {
    // "/fonts/My Font.ttf",
    // "/fonts/My Other Font.ttf",
    // ...
    // };

    // CSS
    cssResolver = new StyleAttrCSSResolver();
    if (css != null) {
        final CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(css.getBytes()));
        cssResolver.addCss(cssFile);
    }

    // HTML
    XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
    if (fontPaths != null) {
        for (final String fontPath : fontPaths) {
            final String path = this.getClass().getResource(fontPath).toExternalForm();
            fontProvider.register(path);
        }
    }
    CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
    htmlContext = new HtmlPipelineContext(cssAppliers);
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
    ...

我应该依赖这样的东西:

  1. 从临时文件中的资源中提取字体(参见 here )
  2. 然后,在自定义字体工厂中预加载字体(参见 there )

最佳答案

我必须指示 Maven 对资源字体文件进行文字复制(常规过滤过程会更改文件并损坏字体):

<resources>
    <resource>
        <filtering>true</filtering>
        <directory>src/main/resources</directory>
        <excludes>
            <exclude>**/*.ttf</exclude>
        </excludes>
    </resource>
    <resource>
        <filtering>false</filtering>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.ttf</include>
        </includes>
    </resource>
    ...
</resources>

关于java - 如何使用自定义字体从 servlet 使用 iText+XMLWorker 创建 PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30712551/

相关文章:

java - 如何在java中生成增量标识符

java - 如何从正在运行的 webapp 重启 tomcat?

python-3.x - 使用 PyPDF2 将字符串写入 pdf

php - 如何使用php从服务器在客户端打印机上打印

java - 更新 .WAR 文件而不导致 Tomcat 暂停在生产服务器中提供网页服务

java - 网络 bean : Transferring Maven Repository index: Central - stuck at 0%

java - 使用加密 key 解密文本

java - 使用 Java PDFBox 库编写俄语 PDF

java - 如何使用属性文件在 web.xml 中设置值?

jsp - 为什么ServletRequest具有setAttribute而不是ServletResponse?