Grails 生成PDF时出错:ITextFontResolver:java.lang.RuntimeException:Font';信使号';与';Cp1252';不被承认

Grails 生成PDF时出错:ITextFontResolver:java.lang.RuntimeException:Font';信使号';与';Cp1252';不被承认,grails,flying-saucer,pdfrenderer,Grails,Flying Saucer,Pdfrenderer,最近需要对库进行一些更改,以便可以对docxsuppot使用apachepoi。这包括将Itext版本从2.1.0更改为4.2.1 还将Grails渲染器插件用于飞碟。从build.gradle: compile 'org.xhtmlrenderer:flying-saucer-core:9.1.12' compile 'org.xhtmlrenderer:flying-saucer-pdf:9.1.12' compile 'org.xhtmlrenderer:flying-saucer-log

最近需要对库进行一些更改,以便可以对
docx
suppot使用
apachepoi
。这包括将
Itext
版本从
2.1.0
更改为
4.2.1

还将Grails渲染器插件用于飞碟。从build.gradle:

compile 'org.xhtmlrenderer:flying-saucer-core:9.1.12'
compile 'org.xhtmlrenderer:flying-saucer-pdf:9.1.12'
compile 'org.xhtmlrenderer:flying-saucer-log4j:9.1.12'

compile ('org.grails.plugins:rendering:2.0.3') {
    exclude group: 'org.xhtmlrenderer', module: 'core-renderer'
}

compile("com.lowagie:itext:4.2.1")
生成PDF时,我遇到以下异常:

java.lang.RuntimeException: Font 'Courier-BoldOblique' with 'Cp1252' is not recognized.
    at org.xhtmlrenderer.pdf.ITextFontResolver.createInitialFontMap(ITextFontResolver.java:470) ~[flying-saucer-pdf-9.1.12.jar:na]
    at org.xhtmlrenderer.pdf.ITextFontResolver.<init>(ITextFontResolver.java:40) ~[flying-saucer-pdf-9.1.12.jar:na]
    at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:124) ~[flying-saucer-pdf-9.1.12.jar:na]
    at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:110) ~[flying-saucer-pdf-9.1.12.jar:na]
    at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:106) ~[flying-saucer-pdf-9.1.12.jar:na]
    at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:102) ~[flying-saucer-pdf-9.1.12.jar:na]
Caused by: com.lowagie.text.DocumentException: Font 'Courier-BoldOblique' with 'Cp1252' is not recognized.
    at com.lowagie.text.pdf.BaseFont.createFont(BaseFont.java:696) ~[itext-4.2.1.jar:na]
    at com.lowagie.text.pdf.BaseFont.createFont(BaseFont.java:603) ~[itext-4.2.1.jar:na]
    at com.lowagie.text.pdf.BaseFont.createFont(BaseFont.java:438) ~[itext-4.2.1.jar:na]
    at org.xhtmlrenderer.pdf.ITextFontResolver.createFont(ITextFontResolver.java:483) ~[flying-saucer-pdf-9.1.12.jar:na]
    at org.xhtmlrenderer.pdf.ITextFontResolver.createFont(ITextFontResolver.java:479) ~[flying-saucer-pdf-9.1.12.jar:na]
    at org.xhtmlrenderer.pdf.ITextFontResolver.addCourier(ITextFontResolver.java:491) ~[flying-saucer-pdf-9.1.12.jar:na]
    at org.xhtmlrenderer.pdf.ITextFontResolver.createInitialFontMap(ITextFontResolver.java:459) ~[flying-saucer-pdf-9.1.12.jar:na]
我的代码正在部署在Tomcat上的war中运行。我可以看到字体文件(如
Courier.afm
),但它们在
/com/lowagie/text/pdf/font
中的jar
itext-4.2.1.jar

如何让代码正确查找字体,以便成功创建
ITextRenderer

发现问题:

  • 字体在静态初始值设定项的
    com.lowagie.text.pdf.BaseFont
    中初始化为局部变量
    内置信息14
  • 但是,在内部类
    ExtendedBaseFont
    中的
    fr.opensagres.xdocreport.itext.extension.font.AbstractFontRegistry
    中,有一个方法
    ClearBuiltInfo
    正在清除初始化的
    内置信息14
因此,(丑陋的)解决方案如下:

创建一个类:

public abstract class FixBaseFont extends BaseFont {

    public static void fixBuiltinFonts() {

        if (BuiltinFonts14.size() != 14) {
            BuiltinFonts14.clear();

            BuiltinFonts14.put(COURIER, PdfName.COURIER);
            BuiltinFonts14.put(COURIER_BOLD, PdfName.COURIER_BOLD);
            BuiltinFonts14.put(COURIER_BOLDOBLIQUE, PdfName.COURIER_BOLDOBLIQUE);
            BuiltinFonts14.put(COURIER_OBLIQUE, PdfName.COURIER_OBLIQUE);
            BuiltinFonts14.put(HELVETICA, PdfName.HELVETICA);
            BuiltinFonts14.put(HELVETICA_BOLD, PdfName.HELVETICA_BOLD);
            BuiltinFonts14.put(HELVETICA_BOLDOBLIQUE, PdfName.HELVETICA_BOLDOBLIQUE);
            BuiltinFonts14.put(HELVETICA_OBLIQUE, PdfName.HELVETICA_OBLIQUE);
            BuiltinFonts14.put(SYMBOL, PdfName.SYMBOL);
            BuiltinFonts14.put(TIMES_ROMAN, PdfName.TIMES_ROMAN);
            BuiltinFonts14.put(TIMES_BOLD, PdfName.TIMES_BOLD);
            BuiltinFonts14.put(TIMES_BOLDITALIC, PdfName.TIMES_BOLDITALIC);
            BuiltinFonts14.put(TIMES_ITALIC, PdfName.TIMES_ITALIC);
            BuiltinFonts14.put(ZAPFDINGBATS, PdfName.ZAPFDINGBATS);
        }
    }
}
然后每次在初始化
ITextRenderer

FixBaseFont.fixBuiltinFonts()
ITextRenderer renderer = new ITextRenderer()
发现问题:

  • 字体在静态初始值设定项的
    com.lowagie.text.pdf.BaseFont
    中初始化为局部变量
    内置信息14
  • 但是,在内部类
    ExtendedBaseFont
    中的
    fr.opensagres.xdocreport.itext.extension.font.AbstractFontRegistry
    中,有一个方法
    ClearBuiltInfo
    正在清除初始化的
    内置信息14
因此,(丑陋的)解决方案如下:

创建一个类:

public abstract class FixBaseFont extends BaseFont {

    public static void fixBuiltinFonts() {

        if (BuiltinFonts14.size() != 14) {
            BuiltinFonts14.clear();

            BuiltinFonts14.put(COURIER, PdfName.COURIER);
            BuiltinFonts14.put(COURIER_BOLD, PdfName.COURIER_BOLD);
            BuiltinFonts14.put(COURIER_BOLDOBLIQUE, PdfName.COURIER_BOLDOBLIQUE);
            BuiltinFonts14.put(COURIER_OBLIQUE, PdfName.COURIER_OBLIQUE);
            BuiltinFonts14.put(HELVETICA, PdfName.HELVETICA);
            BuiltinFonts14.put(HELVETICA_BOLD, PdfName.HELVETICA_BOLD);
            BuiltinFonts14.put(HELVETICA_BOLDOBLIQUE, PdfName.HELVETICA_BOLDOBLIQUE);
            BuiltinFonts14.put(HELVETICA_OBLIQUE, PdfName.HELVETICA_OBLIQUE);
            BuiltinFonts14.put(SYMBOL, PdfName.SYMBOL);
            BuiltinFonts14.put(TIMES_ROMAN, PdfName.TIMES_ROMAN);
            BuiltinFonts14.put(TIMES_BOLD, PdfName.TIMES_BOLD);
            BuiltinFonts14.put(TIMES_BOLDITALIC, PdfName.TIMES_BOLDITALIC);
            BuiltinFonts14.put(TIMES_ITALIC, PdfName.TIMES_ITALIC);
            BuiltinFonts14.put(ZAPFDINGBATS, PdfName.ZAPFDINGBATS);
        }
    }
}
然后每次在初始化
ITextRenderer

FixBaseFont.fixBuiltinFonts()
ITextRenderer renderer = new ITextRenderer()
这个最新的依赖项(XHTMLender 9.1.22)将解决这个问题。 不知何故,fr.opensagres.xdocreport.itext.extension.font.AbstractFontRegistry清除内置信息14

<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf-itext5</artifactId>
    <version>9.1.22</version>
</dependency>

org.xhtmlender
飞碟-pdf-itext5
9.1.22
此最新的依赖项(xhtmlrenderer 9.1.22)将解决此问题。 不知何故,fr.opensagres.xdocreport.itext.extension.font.AbstractFontRegistry清除内置信息14

<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf-itext5</artifactId>
    <version>9.1.22</version>
</dependency>

org.xhtmlender
飞碟-pdf-itext5
9.1.22

iText 4.2.1从未正式发布过。请不要将您的问题标记为iText问题,因为您没有使用正式版本。如果您确实想使用真实的iText,请阅读。如果您不相信我,请将我的名字与您在源代码中的名字进行比较。我就是那个Lowagie,是的。我知道所有这些e是要了解iText的历史,什么是官方的,什么不是。@BrunoLowagie:按要求删除了iText标记。我希望您能提供有关该问题的任何解决方案。我无法解决任何飞碟问题,也无法解决任何与iText非官方版本相关的问题。我共享了一个链接,指向使用iText 7将HTML转换为PDF的解决方案还有pdfHTML附加组件。iText 4.2.1从未正式发布过。请不要将您的问题标记为iText问题,因为您没有使用正式版本。如果您确实想使用真实的iText,请阅读。如果您不相信我,请将我的名字与源代码中的名字进行比较。我就是那个Lowagie,是的。我知道w所有关于iText历史的知识,什么是官方的,什么不是。@BrunoLowagie:按要求删除了iText标记。我将非常感谢您对这个问题的任何解决方案。我无法解决任何飞碟问题,也无法解决任何与iText非官方版本相关的问题。我确实共享了一个链接,指向将HTML转换为HTML的解决方案使用iText 7和pdfHTML附加组件的PDF。