我使用Spring Boot和FOP生成PDF并发送回UI组件。当我使用" mvn spring-boot运行Spring Boot应用程序时:运行"一切正常(PDF是动态生成并在UI中呈现),但是,如果我将这个Spring启动应用程序打包在jar中并通过" java -jar xxx.jar"运行它,我遇到了FOP引发以下错误:
java.lang.IllegalArgumentException: URI is not absolute
at java.net.URI.toURL(URI.java:1088)
at org.apache.fop.fonts.FontDetectorFactory$DefaultFontDetector.detect(FontDetectorFactory.java:94)
at org.apache.fop.fonts.FontManager.autoDetectFonts(FontManager.java:229)
at org.apache.fop.fonts.DefaultFontConfigurator.configure(DefaultFontConfigurator.java:82)
at org.apache.fop.render.PrintRendererConfigurator.getCustomFontCollection(PrintRendererConfigurator.java:147)
at org.apache.fop.render.PrintRendererConfigurator.setupFontInfo(PrintRendererConfigurator.java:127)
at org.apache.fop.render.intermediate.IFUtil.setupFonts(IFUtil.java:170)
at org.apache.fop.render.intermediate.IFRenderer.setupFontInfo(IFRenderer.java:187)
at org.apache.fop.area.RenderPagesModel.<init>(RenderPagesModel.java:75)
at org.apache.fop.area.AreaTreeHandler.setupModel(AreaTreeHandler.java:135)
at org.apache.fop.area.AreaTreeHandler.<init>(AreaTreeHandler.java:105)
at org.apache.fop.render.RendererFactory.createFOEventHandler(RendererFactory.java:350)
at org.apache.fop.fo.FOTreeBuilder.<init>(FOTreeBuilder.java:107)
at org.apache.fop.apps.Fop.createDefaultHandler(Fop.java:104)
at org.apache.fop.apps.Fop.<init>(Fop.java:78)
at org.apache.fop.apps.FOUserAgent.newFop(FOUserAgent.java:182)
at org.apache.fop.apps.FopFactory.newFop(FopFactory.java:240)
...
使用配置文件(fop.xconf)的InputStream在一行中创建FopFactory:
fopFactory = FopFactory.newInstance(fopConfig.getURI(),fopConfig.getInputStream());
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
我怀疑该异常与fop.xconf中的Font配置有关,我在这里添加了两行来添加中文字体支持:
<font kerning="yes" embed-url="/Users/matrix/Library/Fonts/msyh.ttf" embedding-mode="subset">
<font-triplet name="MicrosoftYaHei" style="normal" weight="normal"/>
</font>
<font kerning="yes" embed-url="/Users/matrix/Library/Fonts/msyhbd.ttf" embedding-mode="subset">
<font-triplet name="MicrosoftYaHei" style="normal" weight="bold"/>
</font>
我的问题是: 1)这真的是与fop.xconf文件中的字体配置有关的问题吗?
2)如果是,我该如何解决这个问题?
3)FOP是否有更好的方式来支持中文字体,例如利用主机上安装的系统字体,而不是每个字体系列的硬编码字体配置。
非常感谢你的帮助。
答案 0 :(得分:2)
经过一番挖掘,问题得以解决。这是因为Spring Boot在不同模式下运行Spring引导应用程序时使用了不同的类加载器,例如,作为jar运行或作为Web应用程序运行。以下是我为解决此问题所做的更改:
<font kerning="yes" embed-url="file:/Users/matrix/Library/Fonts/msyh.ttf" embedding-mode="subset">
<font-triplet name="MicrosoftYaHei" style="normal" weight="normal"/>
</font>
<font kerning="yes" embed-url="file:/Users/matrix/Library/Fonts/msyhbd.ttf" embedding-mode="subset">
<font-triplet name="MicrosoftYaHei" style="normal" weight="bold"/>
</font>
请注意&#34;文件:&#34;用于嵌入式URL。这是解决这个问题的关键。
由于使用了不同的类加载器,我在使用&lt; fo:external-graphic&gt;时遇到了同样的问题。在我的xslt样式表中。根据使用的类加载器,fop可能找不到具有相对路径的外部图像。所以我必须使用以&#34; http&#34;开头的绝对网址。并将我的图像作为公共资源,这对我来说没关系,因为它们是徽标和图标。
答案 1 :(得分:0)
当我从资源(embed-url =“ / fonts / times.ttf”)中引用字体时,我遇到了类似的问题(java.lang.IllegalArgumentException:URI不是绝对的)。以“ classpath:”(embed-url =“ classpath:/fonts/times.ttf”)为前缀解决了该问题,FOP可以正确找到该字体。