2013-05-28 3 views
0

Я пытаюсь написать изображение в PDF с помощью PDFBox. Я использую их образец (как прилагается). Все в порядке, но запись 3,5 МБ jpeg (3200 * 2500 пикселей) занимает примерно 2 секунды.Добавление JPG в 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

С благодарностью, в данный момент мы также оцениваем эту функцию. –

Смежные вопросы