2016-03-10 4 views
1

Я новичок в Apache PDFBox, я использовал org.apache.pdfbox.PDFReader для открытия PDF и т. Д., , но теперь мне нужно показать в документах JFrame PDF все страницы в одном JPanel, это возможно? like thisПоказать все страницы PDF с помощью Apache PDFBox

+0

Ваш вопрос непонятен, и я подозреваю, что он вообще не связан с PDFBox. PDFBox может возвращать BufferedImages для каждой страницы. Что вы хотите, если, например, PDF имеет 1000 страниц, так что у вас есть массив из 1000 изображений? Показать все 1000 страниц на одной панели одновременно? –

ответ

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