2015-01-07 2 views
0

Я пытаюсь сделать простой PDF-ридер с Java и PDFBox; В моем коде я преобразовать страницы в ImageIcon, а затем я поставил его в JLabel, то JLabel добавляют к ScrollPane так что в конце у меня есть хороший прокручивать страницу.Java получение пустого изображения с помощью преобразования изображений PDFBox

Для первой страницы (нагруженного конструктор) он работает отлично, но когда я пытаюсь загрузить другую страницу из actionPerformed функции результата пустой страницы, даже если попытка прилов не дает ошибки.

public class PDFreader extends JFrame implements ActionListener { 

    List<PDPage> Pages; 
    int CurrentPage = 0; 

    JButton Back, Next; 
    JLabel Info, LabelImage; 

    public PDFreader(String Title, PDDocument doc) throws IOException { 

     this.setTitle(Title); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setExtendedState(JFrame.MAXIMIZED_BOTH); 

     getContentPane().setLayout(new BorderLayout()); 

     Pages = doc.getDocumentCatalog().getAllPages(); 
     PDPage pag = (PDPage) Pages.get(CurrentPage); 

     ImageIcon PageImage = new ImageIcon(pag.convertToImage()); 
     LabelImage = new JLabel(PageImage); 

     JScrollPane scrollPane = new JScrollPane(LabelImage); 

     Back = new JButton("Previous page"); 
     Next = new JButton("Next page"); 

     Back.setEnabled(false); 
     if(Pages.size()==1) 
      Next.setEnabled(false); 

     Back.addActionListener(this); 
     Next.addActionListener(this); 

     JPanel p = new JPanel(); 
     p.setLayout(new GridLayout(1,2)); 
     p.add(Back); 
     p.add(Next); 

     Info = new JLabel("Page 1 of "+ Pages.size(), SwingConstants.CENTER); 

     getContentPane().add(scrollPane, BorderLayout.CENTER); 
     getContentPane().add(p, BorderLayout.NORTH); 
     getContentPane().add(Info, BorderLayout.SOUTH); 

     pack(); 
     setVisible(true); 
    } 




    @Override 
    public void actionPerformed(ActionEvent Ev) { 
     // TODO Auto-generated method stub 
     if(Ev.getSource() == Next) { 
      CurrentPage++; 
     } 
     if(Ev.getSource() == Back) { 
      CurrentPage--; 
     } 

     if(CurrentPage == 0) 
      Back.setEnabled(false); 
     else 
      Back.setEnabled(true); 

     if(CurrentPage == Pages.size()-1) 
      Next.setEnabled(false); 
     else 
      Next.setEnabled(true);   


     try { 
      PDPage page = (PDPage) Pages.get(CurrentPage); 
      ImageIcon PageImage = new ImageIcon(page.convertToImage()); 
      LabelImage.setIcon(PageImage); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace();   

     } 

     Info.setText("Pagina "+(CurrentPage+1)+" di "+ Pages.size()); 

    } 
} 

Есть проблема, потому что я пытаюсь загрузить его в actionPerformed? Любые другие советы?

+0

Из «сухого» чтения я не вижу никаких проблем, кроме того, что первая страница, которую вы визуализируете, - это четвертый («3» в коде). Пробовали ли вы запустить приложение командной строки PDFReader? https://pdfbox.apache.org/1.8/commandline.html#pdfReader Это просто, чтобы быть уверенным, что в этом PDF-файле нет страницы, которая удаляется из-за ошибки в версии 1.8. –

+0

Извините за «3» в коде, это был тест, чтобы проверить, что вы позже спросили; Он загружает все страницы, которые я запрашиваю в первый раз, но когда я пытаюсь загрузить другую страницу из действия JButton, она дает мне пустой. –

+0

Отладка идей: что произойдет, если вы попробуете 1) сохранить BufferedInmage, который вы передадите в «новый ImageIcon()» с помощью ImageIO.write()? 2) что произойдет, если вы передадите BufferedImage, содержащий только один цвет, в «новый ImageIcon()»? Это ответит, действительно ли вы получите полезное изображение из convertToInage() и правильно ли ваш метод отображения (вы намекаете на это сами в последнем комментарии, но я больше парень в формате PDFBox, чем парень Java GUI) –

ответ

2

Вы закрываете документ слишком рано, поэтому. Я смог воспроизвести эффект, который вы получили, закрыв документ после звонка

new PDFReader("Title", doc); 

Таким образом, одним из решений может быть, например, открытие документа в конструкторе JPanel вместо передачи его в качестве параметра, как вы делаете сейчас (передать файл вместо этого), и закрыть его, когда JPanel закрывается путем добавления этого:

addWindowListener(new java.awt.event.WindowAdapter() 
{ 
    @Override 
    public void windowClosing(java.awt.event.WindowEvent evt) 
    { 
     try 
     { 
      document.close(); 
     } 
     catch (IOException ex) 
     { 
     } 
    } 
}); 

документа должны быть местным конечная переменная в вашем классе PDFReader.

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