PDFSpliter


点击(此处)折叠或打开

  1. package test;

  2. import java.awt.BorderLayout;
  3. import java.awt.Cursor;
  4. import java.awt.Dimension;
  5. import java.awt.FlowLayout;
  6. import java.awt.Graphics;
  7. import java.awt.Image;
  8. import java.awt.Point;
  9. import java.awt.event.ActionEvent;
  10. import java.awt.event.ActionListener;
  11. import java.awt.event.MouseEvent;
  12. import java.awt.event.MouseListener;
  13. import java.awt.event.MouseMotionListener;
  14. import java.awt.image.BufferedImage;
  15. import java.io.File;

  16. import javax.swing.DefaultListModel;
  17. import javax.swing.ImageIcon;
  18. import javax.swing.JButton;
  19. import javax.swing.JFileChooser;
  20. import javax.swing.JFrame;
  21. import javax.swing.JLabel;
  22. import javax.swing.JList;
  23. import javax.swing.JOptionPane;
  24. import javax.swing.JPanel;
  25. import javax.swing.JScrollPane;
  26. import javax.swing.JTextField;
  27. import javax.swing.ListSelectionModel;
  28. import javax.swing.border.EmptyBorder;
  29. import javax.swing.event.ListSelectionEvent;
  30. import javax.swing.event.ListSelectionListener;
  31. import javax.swing.filechooser.FileNameExtensionFilter;

  32. import org.apache.pdfbox.pdmodel.PDDocument;
  33. import org.apache.pdfbox.rendering.ImageType;
  34. import org.apache.pdfbox.rendering.PDFRenderer;

  35. public class PDFSpliterFrame extends JFrame implements ActionListener {

  36.     private static final long serialVersionUID = -5084055481088442254L;

  37.     private JTextField fileInput;
  38.     private JTextField pageInput;
  39.     private JList<Integer> pdfPageList;
  40.     private JImagePanel pdfView;
  41.     private PDDocument doc;
  42.     
  43.     public static class JImagePanel extends JPanel implements MouseMotionListener, MouseListener {

  44.         private static final long serialVersionUID = -4864800644674837029L;
  45.         private Image img;
  46.         private JScrollPane parent;
  47.         
  48.         public JImagePanel(Image img, JScrollPane parent) {
  49.             super();
  50.             this.parent = parent;
  51.             setImage(img);
  52.             setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
  53.             this.addMouseMotionListener(this);
  54.             this.addMouseListener(this);
  55.         }

  56.         public void setImage(Image img) {
  57.             this.img = img;
  58.             repaint();        
  59.             doLayout();
  60.         }
  61.         
  62.         @Override
  63.         public void paintComponent(Graphics g) {
  64.             super.paintComponent(g);
  65.             if (img != null) {
  66.                 Image tmpImage = img.getScaledInstance(parent.getWidth() - 20, -1, Image.SCALE_SMOOTH);
  67.                 Dimension size = new Dimension(tmpImage.getWidth(null), tmpImage.getHeight(null));
  68.                 setPreferredSize(size);
  69.                 setSize(size);
  70.                 g.drawImage(tmpImage, 0, 0, null);
  71.             } else {
  72.                 g.drawString("Welcome", 50, 20);
  73.             }
  74.         }

  75.         int lastY = 0;
  76.         @Override
  77.         public void mouseDragged(MouseEvent e) {
  78.             drag(lastY, e.getY());
  79.         }

  80.         private void drag(int p1, int p2) {
  81.             Point p = parent.getViewport().getViewPosition();
  82.             double y = p.getY() + p1 - p2;
  83.             p.setLocation(p.getX(), y >= 0 ? y : 0);
  84.             parent.getViewport().setViewPosition(p);
  85.         }


  86.         @Override
  87.         public void mousePressed(MouseEvent e) {
  88.             lastY = e.getY();
  89.         }

  90.         public void mouseMoved(MouseEvent e) {}
  91.         public void mouseClicked(MouseEvent e) {}
  92.         public void mouseReleased(MouseEvent e) {}
  93.         public void mouseEntered(MouseEvent e) {}
  94.         public void mouseExited(MouseEvent e) {}        
  95.     }
  96.     
  97.     public PDFSpliterFrame() {
  98.         setSize(960, 720);
  99.         setDefaultCloseOperation(EXIT_ON_CLOSE);
  100.         setTitle("PDF Spliter");
  101.         setLayout(new BorderLayout(5, 5));
  102.         //Top
  103.         JPanel topBar = new JPanel(new FlowLayout());
  104.         fileInput = addSourceFolderInput(topBar);
  105.         addPageInput(topBar);
  106.         addSplitButton(topBar);
  107.         add(topBar, BorderLayout.NORTH);
  108.         
  109.         //Left
  110.         JPanel leftBar = new JPanel();
  111.         leftBar.setBorder(new EmptyBorder(5, 5, 5, 5));
  112.         leftBar.setLayout(new BorderLayout(0, 0));
  113.         leftBar.setPreferredSize(new Dimension(100, 200));
  114.         add(leftBar, BorderLayout.WEST);
  115.         addPdfPagetList(leftBar);
  116.         
  117.         //Center
  118.         JPanel centerBar = new JPanel();
  119.         centerBar.setBorder(new EmptyBorder(5, 5, 5, 5));
  120.         centerBar.setLayout(new BorderLayout(0, 0));
  121.         add(centerBar, BorderLayout.CENTER);
  122.         addPdfView(centerBar);
  123.         
  124.         setVisible(true);
  125. //        openPdf("D:\\Books\\Design\\a.pdf");
  126.         doLayout();
  127.     }
  128.     
  129.     private void addPdfView(JPanel p) {
  130.         JScrollPane scrollPane = new JScrollPane();
  131.         pdfView = new JImagePanel(null, scrollPane);
  132.         scrollPane.setViewportView(pdfView);
  133.         scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  134.         scrollPane.setPreferredSize(new Dimension(400, 480));
  135.         p.add(scrollPane);
  136.     }

  137.     private void addPdfPagetList(JPanel p) {
  138.         pdfPageList = new JList<Integer>();
  139.         pdfPageList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  140.         JScrollPane pane = new JScrollPane(pdfPageList);
  141.         p.add(pane);
  142.         
  143.         pdfPageList.addListSelectionListener(new ListSelectionListener() {
  144.             @Override
  145.             public void valueChanged(ListSelectionEvent e) {
  146.                 displayPage(pdfPageList.getSelectedIndex());
  147.             }
  148.         });
  149.     }

  150.     int currentPage = -1;
  151.     private void displayPage(int page) {
  152.         try {
  153.             if (page < 0 || currentPage == page) return;
  154.             System.out.println("Display: " + page);
  155.             currentPage = page;
  156.             PDFRenderer pdfRenderer = new PDFRenderer(doc);
  157.             BufferedImage img = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
  158.             pdfView.setImage(img);
  159.         } catch (Exception e) {
  160.             e.printStackTrace();
  161.             JOptionPane.showMessageDialog(this, e);
  162.         }
  163.     }

  164.     private void addPageInput(JPanel p) {
  165.         JLabel label = new JLabel("Pages:");
  166.         p.add(label);

  167.         pageInput = new JTextField(6);
  168.         pageInput.setText("16-275");
  169.         p.add(pageInput);
  170.     }

  171.     private void addSplitButton(JPanel p) {
  172.         JButton previewButton = new JButton("Preview");
  173. //        p.add(previewButton);
  174.         previewButton.addActionListener(this);

  175.         JButton splitButton = new JButton("Split");
  176.         p.add(splitButton);
  177.         splitButton.addActionListener(this);
  178.     }

  179.     private JTextField addSourceFolderInput(JPanel p) {
  180.         JLabel label = new JLabel("Source:");
  181.         p.add(label);

  182.         final JTextField input = new JTextField(30);
  183.         input.setText("D:\\Books\\Design\\a.pdf");
  184.         p.add(input);

  185.         JButton button = new JButton("...");
  186.         p.add(button);
  187.         final JFileChooser fileChooser = new JFileChooser();
  188.         fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY | JFileChooser.OPEN_DIALOG);
  189.         fileChooser.setFileFilter(new FileNameExtensionFilter("PDF Document", "pdf"));
  190.         button.addActionListener(new ActionListener() {
  191.             @Override
  192.             public void actionPerformed(ActionEvent e) {
  193.                 int result = fileChooser.showOpenDialog(PDFSpliterFrame.this);
  194.                 if (result == JFileChooser.APPROVE_OPTION) {
  195.                     input.setText(fileChooser.getSelectedFile().getAbsolutePath());
  196.                     openPdf(input.getText());
  197.                 }
  198.             }
  199.         });

  200.         return input;
  201.     }

  202.     public static void main(String[] args) throws Exception {
  203.         new PDFSpliterFrame();
  204.     }

  205.     @Override
  206.     public void actionPerformed(ActionEvent e) {
  207.         if (((JButton) e.getSource()).getText().equals("Split")) {
  208.             split();
  209.         } else if (((JButton) e.getSource()).getText().equals("Preview")) {
  210.             preview();
  211.         }
  212.     }

  213.     private void preview() {
  214.         try {
  215.             String pages = pageInput.getText();

  216.             int firstPage = Integer.MAX_VALUE;
  217.             int lastPage = -1;
  218.             for (String page : pages.split(";|,")) {
  219.                 page = page.trim();
  220.                 if (page.indexOf('-') > 0) {
  221.                     int start = Integer.parseInt(page.split("-")[0]) - 1;
  222.                     int end = Integer.parseInt(page.split("-")[1]) - 1;
  223.                     if (firstPage > start) {
  224.                         firstPage = start;
  225.                     }
  226.                     if (lastPage < end) {
  227.                         lastPage = end;
  228.                     }
  229.                 } else {
  230.                     int p = Integer.parseInt(page) - 1;
  231.                     if (firstPage > p) {
  232.                         firstPage = p;
  233.                     }
  234.                     if (lastPage < p) {
  235.                         lastPage = p;
  236.                     }
  237.                 }
  238.             }
  239.             PDFRenderer pdfRenderer = new PDFRenderer(doc);
  240.             BufferedImage firstImage = pdfRenderer.renderImageWithDPI(firstPage, 300, ImageType.RGB);
  241.             BufferedImage lastImage = pdfRenderer.renderImageWithDPI(lastPage, 300, ImageType.RGB);

  242.             showImage(firstImage, "First Page");
  243.             showImage(lastImage, "Last Page");
  244.         } catch (Exception ex) {
  245.             ex.printStackTrace();
  246.             JOptionPane.showMessageDialog(this, ex);
  247.         }
  248.     }
  249.     

  250.     private void openPdf(String file) {
  251.         DefaultListModel<Integer> pdfPageListModel = new DefaultListModel<Integer>();
  252.         try {
  253.             if (doc != null) {
  254.                 doc.close();
  255.                 currentPage = -1;
  256.             }
  257.             doc = PDDocument.load(new File(file));
  258.             for (int i = 0; i < doc.getNumberOfPages(); i++) {
  259.                 pdfPageListModel.addElement(i + 1);
  260.             }
  261.             displayPage(0);
  262.         } catch (Exception e) {
  263.             JOptionPane.showMessageDialog(this, e);
  264.         }
  265.         pdfPageList.setModel(pdfPageListModel);
  266.     }

  267.     private void showImage(BufferedImage img, String title) {
  268.         JFrame f = new JFrame();
  269.         f.setTitle(title);
  270.         f.setSize(720, 960);
  271.         JPanel contentPane = new JPanel();
  272.         contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  273.         contentPane.setLayout(new BorderLayout(0, 0));
  274.         f.setContentPane(contentPane);
  275.         JScrollPane scrollPane = new JScrollPane();
  276.         contentPane.add(scrollPane,BorderLayout.CENTER);
  277.         f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  278.         scrollPane.setViewportView(new JImagePanel(img, scrollPane));
  279.         scrollPane.setViewportView(new JLabel(
  280.                 new ImageIcon(img.getScaledInstance(600, 800, Image.SCALE_SMOOTH))));

  281.         f.setVisible(true);
  282.     }

  283.     private void split() {
  284.         try {
  285.             String file = fileInput.getText();
  286.             String pages = pageInput.getText();

  287.             PDDocument newDoc = new PDDocument();
  288.             for (String page : pages.split(";|,")) {
  289.                 page = page.trim();
  290.                 if (page.indexOf('-') > 0) {
  291.                     int start = Integer.parseInt(page.split("-")[0]) - 1;
  292.                     int end = Integer.parseInt(page.split("-")[1]);
  293.                     for (int i = start; i < end; i++) {
  294.                         newDoc.addPage(doc.getPage(i));
  295.                     }
  296.                 } else {
  297.                     newDoc.addPage(doc.getPage(Integer.parseInt(page) - 1));
  298.                 }
  299.             }

  300.             newDoc.save(new File(file + ".new.pdf"));
  301.             newDoc.close();
  302.             JOptionPane.showMessageDialog(this, "Split to " + file + ".new.pdf");
  303.         } catch (Exception ex) {
  304.             ex.printStackTrace();
  305.             JOptionPane.showMessageDialog(this, ex);
  306.         }
  307.     }

  308. }

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10742815/viewspace-2130713/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10742815/viewspace-2130713/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值