Я новичок в Apache PDFBox, я использовал org.apache.pdfbox.PDFReader для открытия PDF и т. Д., , но теперь мне нужно показать в документах JFrame PDF все страницы в одном JPanel, это возможно? Показать все страницы PDF с помощью Apache PDFBox
1
A
ответ
1
Как описано выше мне нужно, чтобы показать все страницы PDF документа в JFrame, для этого я использовал 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. Пример проекта вы можете найти there
+0
, пожалуйста, предоставьте версию вашего pdfBox, потому что код не работает для меня! –
+0
@MohammedHousseynTaleb Я отредактировал свой ответ, PLS взгляните на последнюю строку – Daniyar
Ваш вопрос непонятен, и я подозреваю, что он вообще не связан с PDFBox. PDFBox может возвращать BufferedImages для каждой страницы. Что вы хотите, если, например, PDF имеет 1000 страниц, так что у вас есть массив из 1000 изображений? Показать все 1000 страниц на одной панели одновременно? –