Я пытаюсь сделать простой 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? Любые другие советы?
Из «сухого» чтения я не вижу никаких проблем, кроме того, что первая страница, которую вы визуализируете, - это четвертый («3» в коде). Пробовали ли вы запустить приложение командной строки PDFReader? https://pdfbox.apache.org/1.8/commandline.html#pdfReader Это просто, чтобы быть уверенным, что в этом PDF-файле нет страницы, которая удаляется из-за ошибки в версии 1.8. –
Извините за «3» в коде, это был тест, чтобы проверить, что вы позже спросили; Он загружает все страницы, которые я запрашиваю в первый раз, но когда я пытаюсь загрузить другую страницу из действия JButton, она дает мне пустой. –
Отладка идей: что произойдет, если вы попробуете 1) сохранить BufferedInmage, который вы передадите в «новый ImageIcon()» с помощью ImageIO.write()? 2) что произойдет, если вы передадите BufferedImage, содержащий только один цвет, в «новый ImageIcon()»? Это ответит, действительно ли вы получите полезное изображение из convertToInage() и правильно ли ваш метод отображения (вы намекаете на это сами в последнем комментарии, но я больше парень в формате PDFBox, чем парень Java GUI) –