gpt4 book ai didi

spring-boot - FOP 在 jar 中运行时抛出 "IllegalArgumentException: URI is not absolute"

转载 作者:行者123 更新时间:2023-12-02 01:26:22 34 4
gpt4 key购买 nike

我正在使用 Spring Boot 和 FOP 生成 PDF 并发送回 UI 组件。当我使用“mvn spring-boot:run”运行 Spring Boot 应用程序时,一切正常(PDF 即时生成并在 UI 中呈现),但是,如果我将此 Spring Boot 应用程序打包在一个 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)

...

FopFactory 是在一行中使用配置文件 (fop.xconf) 的 InputStream 创建的:
fopFactory = FopFactory.newInstance(fopConfig.getURI(),fopConfig.getInputStream());
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

我怀疑异常与 fop.xconf 中的字体配置有关,我在其中添加了两行添加中文字体支持:
    <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 是否有更好的方法来支持中文字体,例如利用主机上安装的系统字体,而不是每个字体系列的硬编码字体配置。

非常感谢您的帮助。

最佳答案

经过一番挖掘,问题解决了。这是因为 Spring Boot 在以不同模式运行 Spring Boot 应用程序时使用了不同的类加载器,例如,作为 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>

请注意嵌入网址中使用的“文件:”。这是解决这个问题的关键。

由于不同的类加载器,我在 xslt 样式表中使用 时遇到了同样的问题。根据使用的类加载器,fop 可能找不到具有相对路径的外部图像。所以我必须使用以“http”开头的绝对网址,并将我的图像作为公共(public)资源,这对我来说没问题,因为它们是 Logo 和图标。

关于spring-boot - FOP 在 jar 中运行时抛出 "IllegalArgumentException: URI is not absolute",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36914369/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com