这不一定是解决方案,但可能是我在注意到相同问题并进行一些调查后提出的另一种解决方法。它也(IMO)比生成虚拟报告更好。
在启动时(或根据您的需要在其他时间点),进行以下调用:
FontMappingManagerFactory.getInstance().getFontMappingManager(format, Locale.getDefault());
为什么?
BIRT 使用com.lowagie.text.FontFactory
( iText ) 注册字体。对该类的调用也会从该类中
org.eclipse.birt.report.engine.layout.pdf.font.FontMappingManagerFactory
吐出问题中给出的日志条目。
在里面FontMappingManagerFactory
我们可以看到日志条目的来源:
private static void registerFontPath( final String fontPath )
{
AccessController.doPrivileged( new PrivilegedAction<Object>( ) {
public Object run( )
{
long start = System.currentTimeMillis( );
File file = new File( fontPath );
if ( file.exists( ) )
{
if ( file.isDirectory( ) )
{
FontFactory.registerDirectory( fontPath );
}
else
{
FontFactory.register( fontPath );
}
}
long end = System.currentTimeMillis( );
logger.info( "register fonts in " + fontPath + " cost:"
+ ( end - start ) + "ms" ); // <-- Here!
return null;
}
} );
}
向后工作,我们看到registerFontPath(String)
由loadFontMappingConfig(URL)
等调用,导致以下调用层次结构:
getFontMappingManager(String, Locale)
`-- createFontMappingManager(String, Locale)
`-- loadFontMappingConfig(String)
`-- loadFontMappingConfig(URL)
`-- registerFontPath(String)
并且getFontMappingManager(String, Locale)
是我们可以调用的公共方法。然而,更重要的是,该方法还缓存了FontMappingManager
被创建的内容:
public synchronized FontMappingManager getFontMappingManager(
String format, Locale locale )
{
HashMap managers = (HashMap) cachedManagers.get( format );
if ( managers == null )
{
managers = new HashMap( );
cachedManagers.put( format, managers );
}
FontMappingManager manager = (FontMappingManager) managers.get( locale );
if ( manager == null )
{
manager = createFontMappingManager( format, locale );
managers.put( locale, manager );
}
return manager;
}
因此,当您准备好生成 PDF 时,它已经在缓存中,并且 BIRT 不必向下调用 FontFactory 并重新注册字体。
但是格式字符串呢?
这一点是一些猜测,但我认为有效的选项OUTPUT_FORMAT_XXX
String
是IRenderOption
. 出于我们的目的,我进行了调试以查看我们想要String
的pdf
. 考虑到这也是方便的输出格式,我认为 IRenderOption.OUTPUT_FORMAT_PDF
这是要走的路。
如果您最终同时创建 PDF 和 HTML 文件,您似乎可以进行两次调用(一次使用IRenderOption.OUTPUT_FORMAT_PDF
,一次使用IRenderOption.OUTPUT_FORMAT_HTML
),并且只会考虑不同的字体配置文件(即,您不会从c:/windows/fonts
两次)。
话虽如此,但还是要加一粒盐。我相信这是完全安全的,因为 的目的getFontMappingManager(String, Locale)
是获取一个用于访问可用字体等的对象,并且它可以方便地缓存结果。但是,如果将来要改变这种情况,您最终可能会遇到一个难以发现的错误。