在 Apache FOP 中,如何将自定义目录中的字体优先于系统字体?

In Apache FOP, how to prioritize fonts from custom directory over system fonts?

我有一个 XML 配置可以自动检测系统字体:

<fop version="1.0">
  <fonts>
    <auto-detect/>
  </fonts>
  <!-- ... -->
</fop>

然后我以编程方式配置自定义字体目录:

// ...
FopConfParser fopConfParser = new FopConfParser(configFileStream, environmentProfile);
FopFactoryBuilder fopFactoryBuilder = fopConfParser.getFopFactoryBuilder()
fopFactoryBuilder.getFontManager().setResourceResolver(ResourceResolverFactory.createDefaultInternalResourceResolver(fontDir.toURI()));

原则上,这是可行的。但是,如果字体存在于系统字体目录以及我的自定义目录中,则使用系统字体。这似乎将行为从 FOP 1.x 更改为 2.x.

有没有办法让自定义目录中的字体优先于系统字体?我知道这可以用 embed-url 解决,但我理想情况下不想为每种字体显式配置它。

Documentation 状态:

Fonts found as a result of a "directory" tag configuration override fonts found as a result of the "auto-detect" tag being specified.

因此,可以将 <directory> 标记添加到您的配置文件中。为了以编程方式设置它,您可以将其指定为占位符:

<fop version="1.0">
  <fonts>
    <directory>DYNAMIC_FONTDIR</directory>
    <auto-detect/>
  </fonts>
  <!-- ... -->
</fop>

为了扩展占位符,更改您提供的代码如下:

String originalConfig = new String(configFileStream.readAllBytes(), StandardCharsets.UTF_8);
String adaptedConfig = originalConfig.replace("DYNAMIC_FONTDIR", fontDir.getAbsolutePath());
InputStream adaptedConfigStream = new ByteArrayInputStream(adaptedConfig.getBytes(StandardCharsets.UTF_8));

FopConfParser fopConfParser = new FopConfParser(adaptedConfigStream, environmentProfile);
// ...