Отрисовка содержимого pdf файла в окне java

Узнай цену своей работы

Формулировка задачи:

Уважаемые, вопрос следующего порядка: в сети нашел вроде как бесплатную бибилотеку на java для работы с pdf файлами, но вот теперь вопрос на какую панель или в какой контейнер можно отрисовывать содержимое pdf файлов или любых других графических файлов, чтобы не морочить голову с вытаскиванием содержимого pdf, да еще и сделать этот контейнер универсальным , для просмотра содержимого любого графического файла.

Решение задачи: «Отрисовка содержимого pdf файла в окне java»

textual
Листинг программы
  1. import com.google.common.base.CharMatcher;
  2. import com.sun.pdfview.PDFFile;
  3. import com.sun.pdfview.PDFPage;
  4. import com.sun.pdfview.PagePanel;
  5.  
  6. import javax.swing.*;
  7. import java.awt.*;
  8. import java.awt.event.ActionEvent;
  9. import java.awt.event.ActionListener;
  10. import java.io.File;
  11. import java.io.IOException;
  12. import java.io.RandomAccessFile;
  13. import java.nio.ByteBuffer;
  14. import java.nio.channels.FileChannel;
  15.  
  16. import static com.google.common.base.Strings.isNullOrEmpty;
  17.  
  18. public class PdfViewer extends JPanel {
  19.     private static enum Navigation {GO_FIRST_PAGE, FORWARD, BACKWARD, GO_LAST_PAGE, GO_N_PAGE}
  20.  
  21.     private static final CharMatcher POSITIVE_DIGITAL = CharMatcher.anyOf("0123456789");
  22.     private static final String GO_PAGE_TEMPLATE = "%s of %s";
  23.     private static final int FIRST_PAGE = 1;
  24.     private int currentPage = FIRST_PAGE;
  25.     private JButton btnFirstPage;
  26.     private JButton btnPreviousPage;
  27.     private JTextField txtGoPage;
  28.     private JButton btnNextPage;
  29.     private JButton btnLastPage;
  30.     private PagePanel pagePanel;
  31.     private PDFFile pdfFile;
  32.  
  33.     public PdfViewer() {
  34.         initial();
  35.     }
  36.  
  37.     private void initial() {
  38.         setLayout(new BorderLayout(0, 0));
  39.         JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
  40.         add(topPanel, BorderLayout.NORTH);
  41.         btnFirstPage = createButton("|<<");
  42.         topPanel.add(btnFirstPage);
  43.         btnPreviousPage = createButton("<<");
  44.         topPanel.add(btnPreviousPage);
  45.         txtGoPage = new JTextField(10);
  46.         txtGoPage.setHorizontalAlignment(JTextField.CENTER);
  47.         topPanel.add(txtGoPage);
  48.         btnNextPage = createButton(">>");
  49.         topPanel.add(btnNextPage);
  50.         btnLastPage = createButton(">>|");
  51.         topPanel.add(btnLastPage);
  52.         JScrollPane scrollPane = new JScrollPane();
  53.         add(scrollPane, BorderLayout.CENTER);
  54.         JPanel viewPanel = new JPanel(new BorderLayout(0, 0));
  55.         scrollPane.setViewportView(viewPanel);
  56.  
  57.         pagePanel = new PagePanel();
  58.         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  59.         pagePanel.setPreferredSize(screenSize);
  60.         viewPanel.add(pagePanel, BorderLayout.CENTER);
  61.  
  62.         disableAllNavigationButton();
  63.  
  64.         btnFirstPage.addActionListener(new PageNavigationListener(Navigation.GO_FIRST_PAGE));
  65.         btnPreviousPage.addActionListener(new PageNavigationListener(Navigation.BACKWARD));
  66.         btnNextPage.addActionListener(new PageNavigationListener(Navigation.FORWARD));
  67.         btnLastPage.addActionListener(new PageNavigationListener(Navigation.GO_LAST_PAGE));
  68.         txtGoPage.addActionListener(new PageNavigationListener(Navigation.GO_N_PAGE));
  69.     }
  70.  
  71.     private JButton createButton(String text) {
  72.         JButton button = new JButton(text);
  73.         button.setPreferredSize(new Dimension(55, 20));
  74.  
  75.         return button;
  76.     }
  77.  
  78.     private void disableAllNavigationButton() {
  79.         btnFirstPage.setEnabled(false);
  80.         btnPreviousPage.setEnabled(false);
  81.         btnNextPage.setEnabled(false);
  82.         btnLastPage.setEnabled(false);
  83.     }
  84.  
  85.     private boolean isMoreThanOnePage(PDFFile pdfFile) {
  86.         return pdfFile.getNumPages() > 1;
  87.     }
  88.  
  89.     private class PageNavigationListener implements ActionListener {
  90.         private final Navigation navigation;
  91.  
  92.         private PageNavigationListener(Navigation navigation) {
  93.             this.navigation = navigation;
  94.         }
  95.  
  96.         public void actionPerformed(ActionEvent e) {
  97.             if (pdfFile == null) {
  98.                 return;
  99.             }
  100.  
  101.             int numPages = pdfFile.getNumPages();
  102.             if (numPages <= 1) {
  103.                 disableAllNavigationButton();
  104.             } else {
  105.                 if (navigation == Navigation.FORWARD && hasNextPage(numPages)) {
  106.                     goPage(currentPage, numPages);
  107.                 }
  108.  
  109.                 if (navigation == Navigation.GO_LAST_PAGE) {
  110.                     goPage(numPages, numPages);
  111.                 }
  112.  
  113.                 if (navigation == Navigation.BACKWARD && hasPreviousPage()) {
  114.                     goPage(currentPage, numPages);
  115.                 }
  116.  
  117.                 if (navigation == Navigation.GO_FIRST_PAGE) {
  118.                     goPage(FIRST_PAGE, numPages);
  119.                 }
  120.  
  121.                 if (navigation == Navigation.GO_N_PAGE) {
  122.                     String text = txtGoPage.getText();
  123.                     boolean isValid = false;
  124.                     if (!isNullOrEmpty(text)) {
  125.                         boolean isNumber = POSITIVE_DIGITAL.matchesAllOf(text);
  126.                         if (isNumber) {
  127.                             int pageNumber = Integer.valueOf(text);
  128.                             if (pageNumber >= 1 && pageNumber <= numPages) {
  129.                                 goPage(Integer.valueOf(text), numPages);
  130.                                 isValid = true;
  131.                             }
  132.                         }
  133.                     }
  134.  
  135.                     if (!isValid) {
  136.                         JOptionPane.showMessageDialog(PdfViewer.this, format("Invalid page number '%s' in this document", text));
  137.                         txtGoPage.setText(format(GO_PAGE_TEMPLATE, currentPage, numPages));
  138.                     }
  139.                 }
  140.             }
  141.         }
  142.  
  143.         private void goPage(int pageNumber, int numPages) {
  144.             currentPage = pageNumber;
  145.             PDFPage page = pdfFile.getPage(currentPage);
  146.             pagePanel.showPage(page);
  147.             boolean notFirstPage = isNotFirstPage();
  148.             btnFirstPage.setEnabled(notFirstPage);
  149.             btnPreviousPage.setEnabled(notFirstPage);
  150.             txtGoPage.setText(format(GO_PAGE_TEMPLATE, currentPage, numPages));
  151.             boolean notLastPage = isNotLastPage(numPages);
  152.             btnNextPage.setEnabled(notLastPage);
  153.             btnLastPage.setEnabled(notLastPage);
  154.         }
  155.  
  156.         private boolean hasNextPage(int numPages) {
  157.             return (++currentPage) <= numPages;
  158.         }
  159.  
  160.         private boolean hasPreviousPage() {
  161.             return (--currentPage) >= FIRST_PAGE;
  162.         }
  163.  
  164.         private boolean isNotLastPage(int numPages) {
  165.             return currentPage != numPages;
  166.         }
  167.  
  168.         private boolean isNotFirstPage() {
  169.             return currentPage != FIRST_PAGE;
  170.         }
  171.     }
  172.  
  173.     public PagePanel getPagePanel() {
  174.         return pagePanel;
  175.     }
  176.  
  177.     public void setPDFFile(PDFFile pdfFile) {
  178.         this.pdfFile = pdfFile;
  179.         currentPage = FIRST_PAGE;
  180.         disableAllNavigationButton();
  181.         txtGoPage.setText(format(GO_PAGE_TEMPLATE, FIRST_PAGE, pdfFile.getNumPages()));
  182.         boolean moreThanOnePage = isMoreThanOnePage(pdfFile);
  183.         btnNextPage.setEnabled(moreThanOnePage);
  184.         btnLastPage.setEnabled(moreThanOnePage);
  185.     }
  186. }
  187.     }
  188.    
  189. }
  190. Tester
  191.  
  192. public static void main(String[] args) {
  193.         try {
  194.             long heapSize = Runtime.getRuntime().totalMemory();
  195.             System.out.println("Heap Size = " + heapSize);
  196.  
  197.             JFrame frame = new JFrame("PDF Test");
  198.             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  199.  
  200.             //load a pdf from a byte buffer
  201.             File file = new File("/Users/Sean/Documents/test-pdf.pdf");
  202.             RandomAccessFile raf = new RandomAccessFile(file, "r");
  203.             FileChannel channel = raf.getChannel();
  204.             ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
  205.             final PDFFile pdffile = new PDFFile(buf);
  206.             PdfViewer pdfViewer = new PdfViewer();
  207.             pdfViewer.setPDFFile(pdffile);
  208.             frame.add(pdfViewer);
  209.             frame.pack();
  210.             frame.setVisible(true);
  211.  
  212.             PDFPage page = pdffile.getPage(0);
  213.             pdfViewer.getPagePanel().showPage(page);
  214.         } catch (IOException e) {
  215.             e.printStackTrace();
  216.         }
  217.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут