2017-02-17 15 views
1

Я использую Apache FOP v2.1, встроенный в программу Java. Я пытаюсь получить удаленный шрифт с помощью файла конфигурации, подобный следующему:Apache FOP embeded remote fonts

<?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> 

Однако, когда я запустить приложение, чтобы сгенерировать PDF-файл из XML и XSL файлы, которые он дает мне ошибку:

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) 

Проверяя исходный код FOP, я обнаружил, что FOP пытается добавить шрифт в кэш. Однако, поскольку URI шрифта является URL-адресом HTTP, когда он пытается передать URL-адрес в объект Java-файла, он дает мне ошибку «URI-схема не является файлом».

Есть ли какой-то шаг, который мне не хватает, чтобы загрузить удаленный шрифт?

+0

В качестве обходного пути я использую скрипт, который анализирует файл заранее, загружает все удаленные шрифты в локальную папку и перезаписывает содержимое файла конфигурации для использования локального загруженного содержимого. Он отлично работает, однако мне все еще интересно узнать, как преодолеть эту проблему. –

ответ

1

Проблема была FontCache. Он использует класс File Java для чтения содержимого, и поскольку файл конфигурации содержит URL-адрес протокола http (-ов), он выдает указанное исключение. Чтобы решить эту проблему, необходимо отключить кэш шрифтов, как это:

// 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... 

Отключив шрифтовой кэш удаленные шрифты должны быть загружены нормально без конфигурации Доп.