Search code examples
javaconfigurationapache-fop

Specify a configuration file with FopFactoryBuilder


Originally I was creating my FopFactory like so:

FopFactory.newInstance(new File("config/pdf/fop.xconf"))

Which picked up all of the custom configuration in my configuration file. However, my requirements have changed and I need to use a FopFactoryBuilder to build my FopFactory (which does not take a configuration file as a parameter).

FopFactoryBuilder builder = new FopFactoryBuilder(URI.create("/"), uriResolverAdapter);
Configuration configuration = new DefaultConfiguration("config/pdf/fop.xconf");
builder.setConfiguration(configuration);

But, this doesn't seem to work. I specifically need to include some font related stuff:

<fonts>
  <auto-detect/>
  <font-base>./</font-base>
  <directory recursive="true">config/pdf/fonts</directory>
</fonts>

Edit:

I've also tried this,

DefaultConfigurationBuilder defaultConfigurationBuilder = new DefaultConfigurationBuilder();
builder.setConfiguration(defaultConfigurationBuilder.build("config/pdf/fop.xconf"));

as well as this,

builder.setConfiguration(defaultConfigurationBuilder.buildFromFile(new File("config/pdf/fop.xconf")));

this,

FileInputStream config = new FileInputStream(new File("config/pdf/fop.xconf"));
builder.setConfiguration(defaultConfigurationBuilder.build(config));

this,

builder.setConfiguration(defaultConfigurationBuilder.buildFromFile("config/pdf/fop.xconf"));

and finally this (Jars.getJarFile just gets the file of the running jar):

File jarFile = Jars.getJarFile(this);
if (jarFile!= null) {
    String absoluteLocation = jarFile.getParent() + "/config/pdf/fop.xconf";
    builder.setConfiguration(defaultConfigurationBuilder.buildFromFile(absoluteLocation));
}

but those all give me an exception when I create a new fop with FopFactory:

java.lang.IllegalArgumentException: URI is not absolute

Solution

  • What I ended up doing was creating a configuration like this:

    DefaultConfigurationBuilder defaultConfigurationBuilder = new DefaultConfigurationBuilder();
    builder.setConfiguration(defaultConfigurationBuilder.build("config/pdf/fop.xconf"));
    

    and removing the following line from my configuration:

    <auto-detect/>