当前位置: 首页 > 知识库问答 >
问题:

使用Apache PDFBox显示PDF的所有页面

沈良策
2023-03-14

共有1个答案

严恩
2023-03-14

如前所述,我需要在jframe中显示PDF文档的所有页面,为此我使用org.apache.pdfbox.PDFReader如下:

import java.awt.*;
import java.lang.reflect.*;
import java.util.List;

import javax.swing.*;

import org.apache.pdfbox.PDFReader;
import org.apache.pdfbox.pdfviewer.PageWrapper;
import org.apache.pdfbox.pdmodel.PDPage;

public class CustomPDFReader extends PDFReader {
/**
 * 
 */
private static final long serialVersionUID = 678451510308887925L;

public CustomPDFReader() {
    super();
}

public void setCurrentFile(String file) {
    try {
        Method m = getClass().getSuperclass().getDeclaredMethod("openPDFFile", 
                new Class<?>[]{String.class, String.class});
        m.setAccessible(true);
        m.invoke(this, file, null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String []args) {
    CustomPDFReader reader = new CustomPDFReader();
    // remove menubar
    JMenuBar menu = reader.getJMenuBar();
    menu.setVisible(false);

    JPanel header = new JPanel(new BorderLayout());

    JPanel firstLine = new JPanel();

    JLabel label = new JLabel("Label");
    firstLine.add(label);

    JPanel secondLine = new JPanel();

    JTextField text = new JTextField();
    text.setPreferredSize(new Dimension(100, 30));
    secondLine.add(text);

    JButton button = new JButton("Button");
    button.setPreferredSize(new Dimension(100, 30));
    secondLine.add(button);

    header.add(firstLine, java.awt.BorderLayout.NORTH);
    header.add(secondLine, java.awt.BorderLayout.SOUTH);

    reader.getContentPane().add(header, java.awt.BorderLayout.NORTH);

    // set default opened file
    reader.setCurrentFile("test.pdf");
    reader.showAllPages();
    reader.setVisible(true);
}

private void showAllPages() {
    try {
        Field pages = getClass().getSuperclass().getDeclaredField("pages");
        pages.setAccessible(true);
        List<PDPage> pagesList = (List<PDPage>) pages.get(this);

        Field documentPanel = getClass().getSuperclass().getDeclaredField("documentPanel");
        documentPanel.setAccessible(true);
        JPanel panel = (JPanel) documentPanel.get(this);
        panel.remove(0);
        GridLayout layout = new GridLayout(0, 1);
        panel.setLayout(layout);
        for(PDPage page : pagesList) {
            PageWrapper wrapper = new PageWrapper(this);
            wrapper.displayPage(page);
            panel.add(wrapper.getPanel());
        }
        pack();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

}

PDFBox版本是1.8.10。你可以在那里找到样本项目

 类似资料:
  • 我正在使用pdfbox和easytablehttps://github.com/vandeseer/easytable用于创建动态页面,效果非常好。但我确实希望在所有页面中添加标题。我尝试过下面的事情。 1) Tablebuilder是在写入行之前创建的,因此我们可以创建一个完美的Tablebuilder,因为行是动态的。 2) 在创建tablebuilder时,试图在中间插入标题,但这也不是完美

  • 问题内容: 我正在尝试通过AJAX调用显示PDF(在服务器端创建并作为网络流传递给客户端)。我的代码如下: “ inputxml”包含用于服务器创建PDF的输入参数。和成功函数中包含PDF流的“数据”。是否可以在AJAX调用成功功能内的浏览器中打开PDF文件,而无需进行任何页面提交?在服务器端,PDF也不是物理生成的。非常感谢您的帮助。 问题答案: 为什么要通过AJAX加载它?为什么不将其加载到需

  • 我有一个带有ASP.NetWeb API的angular2项目。我有代码从我的数据库中检索到服务器上文档的文件路径。然后我想在浏览器的新选项卡中显示这个文档。有人有什么建议吗? 我很高兴在Angular2(Typescript)或我的API中检索文件并将其流式传输。 这是我尝试在我的API中检索它,但我不知道如何在Angular2中接收它并正确显示它: 任何帮助将不胜感激。 非常感谢!!!

  • 我正在使用DynamicJasper API开发pdf报告。 根据要求,我必须在页眉和页脚显示一个徽标。我可以使用DynamicReportBuilder在标题处显示徽标。addImageBanner方法。但我没有找到在页脚添加图像的方法。 我在动态jasper论坛上看到了一些关于这个问题的帖子,其中提到的一个解决方法是使用pageFooter band创建一个jrxml模板。 我尝试了这个,但没

  • 问题内容: 我的单元测试失败了,我不确定为什么。我希望能够看到在被测系统中发生的所有模拟调用。这并不是我始终希望所有测试都具有的行为,只是为了快速调整我的测试以找出问题所在。 但是,似乎有点像hack。 是否可以在Mockito中进行本机操作而无需使用? 这不是首选方法,因为堆栈跟踪包括Mockito内部使用的所有其他调用。 问题答案: 此功能自Mockito 1.9.5起内置。只需使用