2016-11-25 1 views
0

У меня есть код для конвертирования pptx в изображение и отображение изображения на панели поворота.Apache POI pptx to image занимает слишком много времени для обработки

Когда я запускаю свой код в eclipse, для отображения панели требуется 10 секунд, тогда как тот же код запускается через jar, для открытия панели требуется более одной минуты.

Это происходит только тогда, когда пользователь открывает его в первый раз, позже он загружается быстрее.

Любая помощь будет оценена и благодарна заранее.

Здесь я включил код

// currentPage - Slide number to display 
// source - pptx file path 
public void Display(int currentPage, String source) { 
    try { 

     FileInputStream is = new FileInputStream(source); 
     XMLSlideShow ppt = new XMLSlideShow(is); 
     is.close(); 

     double zoom = 1; // magnify it by 2 
     AffineTransform at = new AffineTransform(); 
     at.setToScale(zoom, zoom); 

     Dimension pgsize = ppt.getPageSize(); 

     XSLFSlide[] slides = ppt.getSlides(); 
     all = slides.length; 
     lblPage.setText(currentPage + "/" + all); 

     current = currentPage; 

     BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB); 

     Graphics2D graphics = img.createGraphics(); 
     graphics.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
     graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
     graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); 
     graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
     graphics.transform(at); 

     graphics.setColor(Color.white); 
     graphics.clearRect(0, 0, pgsize.width, pgsize.height); 
     graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height)); 

     System.out.println("Before draw: " + new Date()); 

     slides[currentPage - 1].draw(graphics); 

     System.out.println("After draw: " + new Date()); 

     // save the output 
     Image newImg = img.getScaledInstance(lblPresentasi.getWidth(), lblPresentasi.getHeight(), Image.SCALE_SMOOTH); 
     final ImageIcon icon = new ImageIcon(newImg); 
     lblPresentasi.setIcon(icon); 
     lblPresentasi.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e) { 
       JLabel label = (JLabel) e.getComponent(); 
       Dimension size = label.getSize(); 
       Image resized = icon.getImage().getScaledInstance(size.width-10, size.height-10, Image.SCALE_FAST); 
       label.setIcon(new ImageIcon(resized)); 
      } 
     }); 
     graphics.dispose(); 
     newImg.flush(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
}// end of method Display() 
+2

В первый раз, когда выполняется рендеринг, загружается определение XML для предварительно настроенных фигур ... это обычно занимает 1-2 секунды. Но 1 мин. загрузки выглядит так, что может быть какая-то загрузка схемы в фоновом режиме - попробуйте пример без сети и посмотрите, не имеет значения. Если нет, вам необходимо профилировать свои приложения. Если вы хотите, вы можете опубликовать свой пример (code & ppt/x) в POIs bugzilla, и я посмотрю на него. – kiwiwings

+0

@kiwiwings: Когда я выполняю затмение, он занимает всего 4 секунды, тогда как проблема в JAR. Я строю свой JAR с одним банком для ссылки lib jar. Это влияет на что-либо? – Tamil

ответ

0

Эта задержка была вызвана пользовательский загрузчик классов One-Жар. В первый раз требуется больше времени для загрузки библиотек зависимостей и загрузки классов.

Итак, я удалил одну банку и с помощью JarSplice загрузил классы библиотек зависимостей, он отлично работает.

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