私はSpringブートとFOPを使用してPDFを生成し、UIコンポーネントに送り返しています。しかし、私がこのバネ・ブート・アプリケーションをjarファイルにパッケージ化して実行すると、 "mvn spring-boot:run"でSpringブート・アプリケーションを実行するとすべて正常に動作します(PDFはその場で生成され、UIでレンダリングされます)ます。java -jar xxx.jar」、私はFOPによって発生した次のエラーが発生した:JOPで実行中にFOPが "IllegalArgumentException:URI is Absolute"を返す
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は1行で設定ファイルの入力ストリーム(fop.xconf)で作成されます:
fopFactory = FopFactory.newInstance(fopConfig.getURI(),fopConfig.getInputStream());
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
例外はfop.xconfのフォント設定に関連していると思われる、私は中国語フォントのサポートを追加するために、2本のラインを入れている場所:
<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が中国語フォントをサポートするためのより良い方法がありますか?フォントファミリごとにハードコードされたフォント設定ではなく、ホストマシンにインストールされているシステムフォントを活用してください。
ありがとうございました。
問題を再現する完全な最小限の例を共有できますか? –
私はいくつかのコメントを提供しましょう:埋め込みURLの値は実際には相対パスのURLなので、プロセスがシステム上の正しい場所から作業している場合にのみ、それらのフォントが正しく検出されます。彼らはどこに位置しています。また、
@acg_so提案があります。埋め込みURLは絶対パスです(私はMacを使用していますので、フォントファイルの絶対パスです)。この問題を引き起こした別のクラスローダーのように見えます。 Springブートアプリケーションは、jarとして実行する場合、LaunchedURLClassLoaderを使用しますが、「mvn spring-boot:run」を使用して実行する場合、使用されるクラスローダーは標準のjava.net.URLClassLoaderです。私はfop.xconfからいくつかの設定を削除して問題を切り分けようとしています。進歩があれば報告します。 – user6266433