這不一定是一種解決方案,但可能是另一種選擇,因爲我們在發現相同問題並做了一些調查後提出了一種解決方法。它也(海事組織)比生成虛擬報告更好。
在啓動時(或根據您的需要一些其他的點),進行下面的調用:
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
S IN IRenderOption
。出於我們的目的,我調試瞭解我們希望String
爲pdf
。考慮到這也是所希望的輸出格式,我想假設IRenderOption.OUTPUT_FORMAT_PDF
是要走的路線。
如果您最終創建PDF和HTML文件,看起來您可以撥打電話兩次(一次使用IRenderOption.OUTPUT_FORMAT_PDF
,一次使用IRenderOption.OUTPUT_FORMAT_HTML
),並且只會考慮不同的字體配置文件(即您將不會從c:/windows/fonts
讀取兩次)。
所有這一切說,帶上一粒鹽。我相信這是完全安全的,因爲getFontMappingManager(String, Locale)
的目的是獲得訪問可用字體等的對象,並且它可以方便地緩存結果。但是,如果將來發生變化,最終可能會出現棘手的問題。
這個問題有什麼好運?在我的情況下,它需要53秒! – paul
是的。我每天都會測試BIRT,並且我注意到有些用戶沒有這個問題,即使是在同一個S.O. (預計與Linux/MAC/Windows不同!)。即使您在org.eclipse.birt.report.engine.fonts插件上配置了fontsConfig.xml,時間也與系統中驅動器的數量成正比。在只連接一個驅動器的系統中嘗試BIRT並給我您的反饋。 – marcolopes
很有意思!我有15個驅動器(包括網絡共享)。這可能是時候放棄一些了!我會得到一個更少的驅動器的同事測試熱身時間,我會回到你身邊。 – paul