Java 使用 PDFBox 图像转换获取空白图像
Java getting blank image using PDFBox image conversion
我正在尝试使用 Java 和 PDFBox 制作一个简单的 pdf 阅读器;
在我的代码中,我转换 ImageIcon 中的页面,然后将其设置在 JLabel 中,JLabel添加到 ScrollPane 所以最后我有一个漂亮的可滚动页面。
对于第一页(由构造函数加载)它工作正常,但是当我尝试从 actionPerformed 函数加载另一个页面时,结果是一个空白页面,即使try-catch 没有错误。
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 中加载它?还有其他提示吗?
您关闭文档的时间过早,这就是原因。在调用
后关闭文档,我能够重现您获得的效果
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 中的局部最终变量 class。
我正在尝试使用 Java 和 PDFBox 制作一个简单的 pdf 阅读器; 在我的代码中,我转换 ImageIcon 中的页面,然后将其设置在 JLabel 中,JLabel添加到 ScrollPane 所以最后我有一个漂亮的可滚动页面。
对于第一页(由构造函数加载)它工作正常,但是当我尝试从 actionPerformed 函数加载另一个页面时,结果是一个空白页面,即使try-catch 没有错误。
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 中加载它?还有其他提示吗?
您关闭文档的时间过早,这就是原因。在调用
后关闭文档,我能够重现您获得的效果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 中的局部最终变量 class。