2014-01-17 90 views
0

下面是示例代碼從iText的動作NUP樣品中如下:document.close()需要很長的時間來寫PDF數據到硬盤

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.sql.SQLException; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Rectangle; 
import com.itextpdf.text.pdf.PdfContentByte; 
import com.itextpdf.text.pdf.PdfImportedPage; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfWriter; 
public class NUpTool { 
    /** Format of the resulting PDF files. */ 
    public static final String RESULT = "results/part2/chapter06/result%dup.pdf"; 
    /** 
    * Manipulates a PDF file src with the file dest as result 
    * @param src the original PDF 
    * @param dest the resulting PDF 
    * @param pow the PDF will be N-upped with N = Math.pow(2, pow); 
    * @throws IOException 
    * @throws DocumentException 
    * @throws SQLException 
    */ 
    public void manipulatePdf(String src, String dest, int pow) 
    throws IOException, DocumentException { 
     // reader for the src file 
     PdfReader reader = new PdfReader(src); 
     // initializations 
     Rectangle pageSize = reader.getPageSize(1); 
     Rectangle newSize = (pow % 2) == 0 ? 
      new Rectangle(pageSize.getWidth(), pageSize.getHeight()) : 
      new Rectangle(pageSize.getHeight(), pageSize.getWidth()); 
     Rectangle unitSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight()); 
     for(int i = 0; i < pow; i++) { 
      unitSize = new Rectangle(unitSize.getHeight()/2, unitSize.getWidth()); 
     } 
     int n = (int) Math.pow(2, pow); 
     int r = (int) Math.pow(2, pow/2); 
     int c = n/r; 
     // step 1 
     Document document = new Document(newSize, 0, 0, 0, 0); 
     // step 2 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(String.format(dest, n))); 
     // step 3 
     document.open(); 
     // step 4 
     PdfContentByte cb = writer.getDirectContent(); 
     PdfImportedPage page; 
     Rectangle currentSize; 
     float offsetX, offsetY, factor; 
     int total = reader.getNumberOfPages(); 
     for(int i = 0; i < total;) { 
      if(i % n == 0) { 
       document.newPage(); 
      } 
      currentSize = reader.getPageSize(++i); 
      factor = Math.min(
       unitSize.getWidth()/currentSize.getWidth(), 
       unitSize.getHeight()/currentSize.getHeight()); 
      offsetX = unitSize.getWidth() * ((i % n) % c) + (unitSize.getWidth() - (currentSize.getWidth() * factor))/2f; 
      offsetY = newSize.getHeight() - (unitSize.getHeight() * (((i % n)/c) + 1)) + (unitSize.getHeight() - (currentSize.getHeight() * factor))/2f; 
      page = writer.getImportedPage(reader, i); 
      cb.addTemplate(page, factor, 0, 0, factor, offsetX, offsetY); 
     } 
     // step 5 
     document.close(); 
     reader.close(); 
    } 
    /** 
    * Main method. 
    * @param args no arguments needed 
    * @throws DocumentException 
    * @throws IOException 
    * @throws SQLException 
    */ 
    public static void main(String[] args) 
    throws IOException, DocumentException, SQLException { 
     Stationery.main(args); 
     new NUpTool().manipulatePdf(Stationery.RESULT, RESULT, 1); 
     new NUpTool().manipulatePdf(Stationery.RESULT, RESULT, 2); 
     new NUpTool().manipulatePdf(Stationery.RESULT, RESULT, 3); 
     new NUpTool().manipulatePdf(Stationery.RESULT, RESULT, 4); 
    } 
} 

,我嘗試處理約700MB一個pdf文件,並且它幾乎需要半個小時才能將pdf數據寫入硬盤(我認爲是「document.close()」需要很長時間),而我的電腦杯 I5-2430 2.4G內存6GB,硬盤520G 7200 RPM不太不好,所以我想問的是有無論如何做一些優化,以加快itext寫入速度。

非常感謝

埃裏克

+0

運行該程序時,您允許JVM使用多少內存?考慮允許更多。 – mkl

回答

1

你嵌入到PDF的視頻? ;)

我真的沒有想法,但這太長了評論。我可以看到以下幾種可能性:

  • 真正的處理過程是在您撥打document.close()之前開始的,然後才完成一些準備工作。
  • 處理過程涉及一些隨機文件訪問,這些訪問的縮放比例差別很大。嘗試將文檔放入RAM磁盤(/dev/shm)。
  • 處理過程需要幾GB的內存,您忘記了give it您的過程。

無論如何,要了解更多信息,例如,如果任務是CPU或磁盤綁定。

+0

對於任何PDF,700 MB是*可疑*大尺寸。我敢打賭,像每個頁面都會不必要地複製字體等項目。 – usr2564301

+0

..看到http://stackoverflow.com/questions/20604124/large-pdf-generation-using-itext-taking-very-long-time – usr2564301

+0

@Jongware下的評論:是的,這是一個瘋狂的大小。我想你的猜測是正確的(但正如我所說的,我沒有真正的線索)。 – maaartinus

相關問題