2013-05-28 110 views
0

我試圖使用PDFBox將圖像寫入PDF。我正在使用他們的樣本(如附件)。一切都很好,但寫入3.5MB jpeg(3200 * 2500px)大約需要2秒。將PDF添加到PDF極其緩慢

這是正常的嗎?有什麼辦法可以讓它更快(至少10倍)?

public void createPDFFromImage(String inputFile, String image, String outputFile) 
    throws IOException, COSVisitorException 
{ 
    // the document 
    PDDocument doc = null; 
    try 
    { 
     doc = PDDocument.load(inputFile); 

     //we will add the image to the first page. 
     PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get(0); 

     PDXObjectImage ximage = null; 
     if(image.toLowerCase().endsWith(".jpg")) 
     { 
      ximage = new PDJpeg(doc, new FileInputStream(image)); 
     } 
     else if (image.toLowerCase().endsWith(".tif") || image.toLowerCase().endsWith(".tiff")) 
     { 
      ximage = new PDCcitt(doc, new RandomAccessFile(new File(image),"r")); 
     } 
     else 
     { 
      //BufferedImage awtImage = ImageIO.read(new File(image)); 
      //ximage = new PDPixelMap(doc, awtImage); 
      throw new IOException("Image type not supported:" + image); 
     } 
     PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true); 

     contentStream.drawImage(ximage, 20, 20); 

     contentStream.close(); 
     doc.save(outputFile); 
    } 
    finally 
    { 
     if(doc != null) 
     { 
      doc.close(); 
     } 
    } 
} 
+0

我看過1.8源代碼,時間用在ImageIO.read()中。圖像被讀取一次以獲得圖像信息(例如大小),這就是爲什麼。 –

回答

0

如果您願意使用其他產品iText的可以去真快,看看http://tutorials.jenkov.com/java-itext/image.html .Personally,我做了這個測試用+ 750K的jpg圖片,把78毫秒

try { 
     PdfWriter.getInstance(document, 
       new FileOutputStream("Image2.pdf")); 
     document.open(); 

     long start = System.currentTimeMillis(); 
     String imageUrl = "c:/Users/dummy/notSoBigImage.jpg"; 
     Image image = Image.getInstance((imageUrl)); 
     image.setAbsolutePosition(500f, 650f); 
     document.add(image); 

     document.close(); 
     long end = System.currentTimeMillis() - start; 
     System.out.println("time: " + end + " ms"); 
    } catch(Exception e){ 
     e.printStackTrace(); 
    } 
+0

謝謝,我們目前也在評估這個選項。 –