Java ApacheFop嵌入式远程字体

Java ApacheFop嵌入式远程字体,java,fonts,apache-fop,Java,Fonts,Apache Fop,我正在使用嵌入Java程序的ApacheFopV2.1。我正在尝试使用类似于以下内容的配置文件检索远程字体: <?xml version="1.0"?> <fop version="1.0"> <renderers> <renderer mime="application/pdf"> <fonts> <font kerning="yes" embe

我正在使用嵌入Java程序的ApacheFopV2.1。我正在尝试使用类似于以下内容的配置文件检索远程字体:

<?xml version="1.0"?>
<fop version="1.0">
<renderers>
    <renderer mime="application/pdf">
        <fonts>
            <font kerning="yes"
                  embed-url="http://localhost:8000/MyFont.ttf" embedding-mode="subset">
                <font-triplet name="MyFont" style="normal" weight="normal"/>
            </font>
        </fonts>
    </renderer>
</renderers>
</fop>

但是,当我运行应用程序从XML和XSL文件生成PDF文件时,会出现一个错误:

java.lang.IllegalArgumentException: URI scheme is not "file"
at java.io.File.<init>(File.java:421)
at org.apache.fop.fonts.FontCache.addFont(FontCache.java:335)
at org.apache.fop.fonts.DefaultFontConfigurator.getFontInfo(DefaultFontConfigurator.java:173)
at org.apache.fop.fonts.DefaultFontConfigurator.addFonts(DefaultFontConfigurator.java:136)
at org.apache.fop.fonts.DefaultFontConfigurator.configure(DefaultFontConfigurator.java:89)
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)
at com.example.myapp.myFunction(MyApp.java:123)
java.lang.IllegalArgumentException:URI方案不是“文件”
在java.io.File.(File.java:421)
位于org.apache.fop.fonts.FontCache.addFont(FontCache.java:335)
位于org.apache.fop.fonts.DefaultFontConfigurator.getFontInfo(DefaultFontConfigurator.java:173)
在org.apache.fop.fonts.DefaultFontConfigurator.addFonts(DefaultFontConfigurator.java:136)上
位于org.apache.fop.fonts.DefaultFontConfigurator.configure(DefaultFontConfigurator.java:89)
位于org.apache.fop.render.PrintRenderConfigurator.getCustomFontCollection(PrintRenderConfigurator.java:147)
位于org.apache.fop.render.PrintRenderConfigurator.setupFontInfo(PrintRenderConfigurator.java:127)
位于org.apache.fop.render.intermediate.IFUtil.setupFonts(IFUtil.java:170)
位于org.apache.fop.render.intermediate.IFRenderer.setupFontInfo(IFRenderer.java:187)
位于org.apache.fop.area.RenderPagesModel(RenderPagesModel.java:75)
位于org.apache.fop.area.AreaTreeHandler.setupModel(AreaTreeHandler.java:135)
位于org.apache.fop.area.AreaTreeHandler(AreaTreeHandler.java:105)
位于org.apache.fop.render.renderFactory.createFOEventHandler(renderFactory.java:350)
位于org.apache.fop.fo.FOTreeBuilder(FOTreeBuilder.java:107)
位于org.apache.fop.apps.fop.createDefaultHandler(fop.java:104)
在org.apache.fop.apps.fop.(fop.java:78)
位于org.apache.fop.apps.FOUserAgent.newFop(FOUserAgent.java:182)
位于org.apache.fop.apps.FopFactory.newFop(FopFactory.java:240)
位于com.example.myapp.myFunction(myapp.java:123)
通过检查FOP的源代码,我发现FOP正试图将字体添加到缓存中。但是,因为字体URI是一个HTTP URL,所以当它试图将URL传递给java文件对象时,会出现错误“URI方案不是文件”


是否缺少加载远程字体的步骤?

问题在于
FontCache
。它使用
File
Java类来读取内容,并且由于配置文件包含http(s)协议的URL,因此它抛出所提到的异常。要解决此问题,需要禁用字体缓存,如下所示:

// load the config file with fonts from remote resources (HTTP)
File configFileWithRemoteFontUrl = new File("fop-config.xconf");

// create a factory instance and disable the font cache
FopFactory factory = FopFactory.newInstance(configFileWithRemoteFontUrl);
factory.getFontManager().disableFontCache();

// your code as usual...

通过禁用字体缓存,您的远程字体应该可以在没有其他配置的情况下正常加载。

作为一种解决方法,我使用了一个脚本,可以提前解析文件,将所有远程字体下载到本地文件夹,然后重写配置文件内容以使用本地下载的内容。它的工作很好,但我仍然有兴趣知道如何克服这个问题。