2012-08-27 44 views
0

我有一個打印100萬(1頁)PDF文件的Java批量作業。 此批處理作業將在每5天后運行一次。Java Communication Server打印100萬PDF文件

對於通過批處理作業打印100萬(1頁)PDF文檔,哪種方法更好?

在此PDF大部分的文/段是同樣爲所有客戶,只有少數的信息動態地從數據庫中挑取作爲(客戶ID /名稱/到期日/到期日/金額)

我們已經嘗試以下

1)碧玉報告

2)iText的

但上述2種方法並不總是達到更好的性能爲靜態文本/創建段爲每個文檔運行。

所以我想一些辦法像

會有用佔位動態值(用戶ID /名稱/到期日/到期日/金額)的模板。

將會有一個像Open Office這樣的通信服務器,它會有這個模板。

通過我們在Web服務器上部署的Java應用程序將從數據庫中獲取數據集並傳遞到此通信服務器上,其中模板已經打開到內存中,並且僅從數據集開始,動態佔位符值將被更改並且模板將被保存爲「Save如「命令。

以上方法是否可以實現,如果是,哪個API /通信服務器更好?

這裏是碧玉報告準則供參考

InputStream is = getClass().getResourceAsStream("/jasperreports/reports/"+reportName+".jasper");  
JasperPrint print = JasperFillManager.fillReport(is, parameters, dataSource);  
pdf = File.createTempFile("report.pdf", ""); 
JasperExportManager.exportReportToPdfFile(print, pdf.getPath()); 
+1

什麼是您在JasperReports的方法嗎?在Jasper中,你可以創建一個'JasperPrint'對象,其中加載了Jasper文件,並且每次都使用新的數據填充它。 – medopal

+1

每5天有一百萬頁......而另一片森林則死亡。 (OK,所以你可能不會實際打印出來,但即使產生百萬的PDF文件是要咀嚼很多資源。) –

+0

示例代碼碧玉上面 –

回答

0

正如上面提到的一對海報,100萬PDF文件意味着你將不得不維持每秒超過2個文件的速度。這可以從純文檔生成方面實現,但是您需要記住,運行查詢和編譯數據的系統上的負載也將承受合理的負載。您也沒有說過關於PDF的任何內容 - 一頁PDF比40頁PDF更容易生成...

我曾見過iText和Docmosis每秒可以達到幾十個文件,所以Jasper和其他技術大概也可以。我提到了Docmosis,因爲它符合你所提到的技術(將模板加載到內存中)。請注意我爲生產Docmosis的公司工作。

如果你還沒有,你需要考慮的硬件/軟件架構和運行與任何技術你想確保你就能得到你要求的性能試驗。推測峯值負荷可能比平均負荷略高。

祝你好運。

+0

這項工作將在單獨的服務器上運行,這是一個很好的配置服務器機器。 Onle這裏指的是每秒生成3-4(1頁)PDF文件。 –

1

我將與PDF形式去(這應該是 「快」):

public final class Batch 
{ 
    private static final String FORM = "pdf-form.pdf" 

    public static void main(final String[] args) { 
     final PdfPrinter printer = new PdfPrinter(FORM); 
     final List<Customer> customers = readCustomers(); 

     for(final Customer customer : customers) { 
      try { 
       printer.fillAndCreate("pdf-" + customer.getId(), customer); 
      } catch (IOException e) { 
       // handle exception 
      } catch (DocumentException e) { 
       // handle exception 
      } 
     } 

     printer.close(); 
    } 

    private @Nonnull List<Customers> readCustomers() { 
     // implements me 
    } 

    private Batch() { 
     // nothing 
    } 
} 

public class PdfPrinter implements Closable 
{ 
    private final PdfReader reader; 

    public PdfPrinter(@Nonnull final String src) { 
     reader = new PdfReader(src); // <= this reads the form pdf 
    } 

    @Override 
    public void close() { 
     reader.close(); 
    } 

    public void fillAndCreate(@Nonnull final String dest, @Nonnull final Customer customer) throws IOException, DocumentException { 
     final PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); // dest = output 
     final AcroFields form = stamper.getAcroFields(); 
     form.setField("customerId", customer.getId()); 
     form.setField("name", customer.getName()); 
     // ... 
     stamper.close(); 
    } 
} 

還看到:http://itextpdf.com/examples/iia.php?id=164

2

哇。每5天有100萬PDF文件。

即使從頭到尾只生成一個PDF文件0.5秒(磁盤上的完成文件) - 您需要5天的時間才能順序生成這些PDF文件。

我認爲在亞秒的時間內生成文件的任何方法都很好(Jasper報告當然可以爲您提供此級別的性能)。

我認爲您需要考慮如何優化整個過程:您當然必須使用多線程甚至幾個物理服務器來生成任何合理數量的文件的時間(至少一夜之間)。