2016-04-28 14 views
2

私は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が中国語フォントをサポートするためのより良い方法がありますか?フォントファミリごとにハードコードされたフォント設定ではなく、ホストマシンにインストールされているシステムフォントを活用してください。

ありがとうございました。

+0

問題を再現する完全な最小限の例を共有できますか? –

+0

私はいくつかのコメントを提供しましょう:埋め込みURLの値は実際には相対パスのURLなので、プロセスがシステム上の正しい場所から作業している場合にのみ、それらのフォントが正しく検出されます。彼らはどこに位置しています。また、

+0

@acg_so提案があります。埋め込みURLは絶対パスです(私はMacを使用していますので、フォントファイルの絶対パスです)。この問題を引き起こした別のクラスローダーのように見えます。 Springブートアプリケーションは、jarとして実行する場合、LaunchedURLClassLoaderを使用しますが、「mvn spring-boot:run」を使用して実行する場合、使用されるクラスローダーは標準のjava.net.URLClassLoaderです。私はfop.xconfからいくつかの設定を削除して問題を切り分けようとしています。進歩があれば報告します。 – user6266433

答えて

2

いくつかの掘削の後、問題は解決されます。スプリングブートアプリケーションをさまざまなモードで実行する場合(たとえば、jarとして実行するか、Webアプリケーションとして実行する場合など)、Springブートによって使用されるクラスローダが異なるためです。この問題を解決するために私が行った変更は次のとおりです。埋め込みURLで使用されている "file:"に注意してください。それがこの問題を解決する鍵です。

異なるクラスローダーのため、< fo:external-graphic >をxsltスタイルシートに使用したときに同じ問題が発生しました。どのクラスローダーが使用されているかによって、fopは相対パスで外部イメージを見つけることができません。だから私は "http"で始まる絶対URLを使用し、ロゴやアイコンであるので私と一緒にOKです公共リソースとして私のイメージを作る必要があります。

関連する問題