2012-11-11 45 views
3

我們從版本2開始使用BIRT(目前使用4.2.2)並一直困擾着PDF(itext?)字體註冊時間。BIRT PDF渲染:字體註冊時間

org.eclipse.birt.report.engine.layout.pdf.font.FontMappingManagerFactory$2 run 
INFO: register fonts in c:/windows/fonts cost:17803ms 

此過程僅在首次使用渲染時發生。後續渲染不成問題。

這個問題似乎是訪問所有連接系統的DRIVES時浪費的時間。

org.eclipse.birt.report.engine.fonts插件中編輯fontsConfig.xml,減少搜索路徑不能解決問題。 所有連接的驅動器都由BIRT訪問。

<font-paths> 
    <path path="/windows/fonts" /> 
</font-paths> 

是否有一個簡單的解決方案,而不必渲染一個「虛擬」報告來初始化背景中的BIRT?

+0

這個問題有什麼好運?在我的情況下,它需要53秒! – paul

+0

是的。我每天都會測試BIRT,並且我注意到有些用戶沒有這個問題,即使是在同一個S.O. (預計與Linux/MAC/Windows不同!)。即使您在org.eclipse.birt.report.engine.fonts插件上配置了fontsConfig.xml,時間也與系統中驅動器的數量成正比。在只連接一個驅動器的系統中嘗試BIRT並給我您的反饋。 – marcolopes

+0

很有意思!我有15個驅動器(包括網絡共享)。這可能是時候放棄一些了!我會得到一個更少的驅動器的同事測試熱身時間,我會回到你身邊。 – paul

回答

2

這不一定是一種解決方案,但可能是另一種選擇,因爲我們在發現相同問題並做了一些調查後提出了一種解決方法。它也(海事組織)比生成虛擬報告更好。

在啓動時(或根據您的需要一些其他的點),進行下面的調用:

FontMappingManagerFactory.getInstance().getFontMappingManager(format, Locale.getDefault()); 

爲什麼?

BIRT使用com.lowagie.text.FontFactoryiText)來註冊字體。打給該班的電話是 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_XXXString S IN IRenderOption。出於我們的目的,我調試瞭解我們希望Stringpdf。考慮到這也是所希望的輸出格式,我想假設IRenderOption.OUTPUT_FORMAT_PDF是要走的路線。

如果您最終創建PDF和HTML文件,看起來您可以撥打電話兩次(一次使用IRenderOption.OUTPUT_FORMAT_PDF,一次使用IRenderOption.OUTPUT_FORMAT_HTML),並且只會考慮不同的字體配置文件(即您將不會從c:/windows/fonts讀取兩次)。


所有這一切說,帶上一粒鹽。我相信這是完全安全的,因爲getFontMappingManager(String, Locale)的目的是獲得訪問可用字體等的對象,並且它可以方便地緩存結果。但是,如果將來發生變化,最終可能會出現棘手的問題。

+0

無可挑剔!很棒!非常好的解釋(應該是!)。我只是不明白需要一個「區域設置」:\我使用默認的,但我想知道哪裏是birt獲取區域設置訪問FontMappingManager管理器 – marcolopes

0

我建議您可以修改fontsConfig.xml並刪除不再需要的字體。同時刪除你不想檢查字體的驅動器。

+0

正如我所說的:在org.eclipse.birt.report.engine.fonts插件中編輯fontsConfig.xml,減少搜索路徑並不能解決問題。 BIRT訪問所有連接的驅動器。 – marcolopes