如何使用Java PDF BOx 2.0.2在左侧面板中呈现大尺寸文件的所有页面

时间:2016-10-18 15:41:07

标签: java multithreading object pdf heap-memory

我正在尝试使用java pdfbox并使用该项目自定义它以使用1969页呈现我的大尺寸pdf(100 MB)。 我已根据我的要求更改了UI。原始PDF框也没有在左侧面板上呈现图像形式的所有页面。所以我添加了一段单独的代码来呈现相同的内容。但这样做会造成巨大的内存泄漏。我可以看到使用1 GB的内存。

我想这种情况正在发生,因为我试图在JButton中加载内存中的所有页面,然后尝试渲染它。

以下是我的代码:

  private JPanel sidePanel = new JPanel();
  sidePanel.setBorder(new EmptyBorder(0, 0, 0, 0));
  for (int i = 1; i < numberOfPages + 1; i++) {
    int pageListValue = i - 1;
    JButton pageButton = new JButton();
    JLabel pageNum = new JLabel();
    try {
      BufferedImage bim = pdfRenderer.renderImageWithDPI((i - 1), 100, ImageType.RGB);
      ImageIcon imageIcon = new ImageIcon(resize(bim, 140, 190));
      pageButton.setIcon(imageIcon);
    } catch (IOException exception) {
      exception.printStackTrace();
    }
    pageNum.setText(Integer.toString(i));
    pageNum.setForeground(Color.WHITE);
    pageButton.setBackground(new Color(39, 48, 55));
    pageButton.setBorder(new EmptyBorder(0, 10, 0, 10));
    pageNum.setBorder(new EmptyBorder(0, 0, 10, 0));
    pageNum.setFont(new Font("Arial Narrow", Font.BOLD, 14));
    pageNum.setAlignmentX(Component.CENTER_ALIGNMENT);
    pageButton.setAlignmentX(Component.CENTER_ALIGNMENT);
    pageButton.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        showPage(pageListValue);
      }
    });
    sidePanel.add(pageButton);
    sidePanel.add(pageNum);
   pageButton=null;
   pageNum=null;
  }

这里,numberOfPages的值为1969,因此循环运行1969次并加载内存中的所有按钮和标签,然后将它们添加到侧面板。 有没有什么方法可以在不加载内存中的所有按钮的情况下执行此操作,从而在我向下滚动滚动条的同时在我的查看器上呈现它们。

为什么我需要使用多线程?

我需要一次在内存中加载2页,当我向下滚动时,我需要删除前两页并加载下两页。

任何建议都将受到高度赞赏。

0 个答案:

没有答案