PDF.PDFEditor.java Source code

Java tutorial

Introduction

Here is the source code for PDF.PDFEditor.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package PDF;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg;
import Utilities.GlobalVar;

/**
 *
 * @author bob
 */
public class PDFEditor {
    /**
     * @param args the command line arguments
     */
    private JRadioButton voidButton;
    private JRadioButton selectButton;
    private JRadioButton skipButton;
    private ButtonGroup statusButtonGroup;
    private JLabel seqText;
    private Boolean[][] statusArray;
    private JButton submitPDFButton;

    // numbering only
    public PDFEditor(String fileName, Boolean numberOnly) {
        this(fileName, null, numberOnly);
    }

    // use current date for date stamp
    public PDFEditor(String fileName) {
        this(fileName, null, false);
    }

    public PDFEditor(String fileName, String date) {
        this(fileName, date, false);
    }

    public PDFEditor(String pdfFileName, String date, Boolean numberOnly) {
        if (!numberOnly) {
            if (date == null || date.equalsIgnoreCase("")) {
                GregorianCalendar today = new GregorianCalendar();
                date = today.getTime().toString();
            } else {
                date = "Received on " + date + " JBLM DMPO";
            }
        } else {
            date = "";
        }

        initComponent(pdfFileName, date);

        SwingSimpleController controller = new SwingSimpleController(statusButtonGroup, seqText, statusArray);
        controller.openDocument(pdfFileName); // show the component 
        int pageNum = controller.getDocument().getNumberOfPages();

        System.out.println(controller.getDocument().getNumberOfPages());

        SwingViewSimpleBuilder factory = new SwingViewSimpleBuilder(controller, statusButtonGroup, seqText,
                submitPDFButton, statusArray);

        JPanel viewerComponentPanel = factory.buildViewerPanel();
        // add interactive mouse link annotation support via callback 
        //        controller.getDocumentViewController().setAnnotationCallback(
        //                new org.icepdf.ri.common.MyAnnotationCallback(controller.getDocumentViewController())); 

        JFrame applicationFrame = new JFrame();
        applicationFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        applicationFrame.getContentPane().add(viewerComponentPanel); // Now that the GUI is all in place, we can try opening a PDF 
        //        controller.openDocument(filePath); // show the component 
        //        System.out.println(controller.getDocument().getNumberOfPages());
        applicationFrame.pack();
        applicationFrame.setVisible(true);
    }

    private void initComponent(final String pdfFileName, final String date) {
        voidButton = new JRadioButton();
        selectButton = new JRadioButton();
        skipButton = new JRadioButton();

        voidButton.setText("Delete");
        skipButton.setText("Skip");
        selectButton.setText("Select");

        statusButtonGroup = new ButtonGroup();
        statusButtonGroup.add(voidButton);
        statusButtonGroup.add(skipButton);
        statusButtonGroup.add(selectButton);

        seqText = new JLabel();
        seqText.setText("----");
        seqText.setSize(new Dimension(500, 20));
        //Icon ic = new ImageIcon("heart.gif");
        // seqText.setIcon(new ImageIcon("heart.gif"));
        seqText.setIcon(new ImageIcon(getClass().getResource("heart.gif")));
        statusArray = new Boolean[GlobalVar.NUM_BUTTON][GlobalVar.MAX_NUM_PAGES];

        for (int i = 0; i < GlobalVar.NUM_BUTTON; i++) {
            for (int j = 0; j < GlobalVar.MAX_NUM_PAGES; j++) {
                statusArray[i][j] = false;
            }
        }

        for (int j = 0; j < GlobalVar.MAX_NUM_PAGES; j++) {
            statusArray[GlobalVar.SELECT_BUTTON_INDEX][j] = true;
        }

        submitPDFButton = new JButton();
        submitPDFButton.setText("Generate PDF");
        //Icon ic4 = new ImageIcon("signup.gif");
        // this.setIconImage(new ImageIcon(getClass().getResource(GlobalVar.ICON_NAME)).getImage());
        //submitPDFButton.setIcon(new ImageIcon("signup.gif"));   
        submitPDFButton.setIcon(new ImageIcon(getClass().getResource("signup.gif")));
        submitPDFButton.setSize(500, 200);
        //submitPDFButton.setBorder(BorderFactory.createLineBorder(Color.black, 5, true));
        submitPDFButton.setBorder(BorderFactory.createRaisedBevelBorder());
        submitPDFButton.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {

                // System.out.println("PDF is pressed");
                String cycle = JOptionPane.showInputDialog(null, "Please enter a cycle number");
                // System.out.println("The cycle number is " + cycle);
                try {
                    generatePDFFile(date, pdfFileName, statusArray, cycle);
                    JOptionPane.showMessageDialog(null,
                            "Two PDFs (*_forAudit.pdf and *_forReject.pdf) are created successfully.");
                } catch (IOException ex) {
                    Logger.getLogger(PDFEditor.class.getName()).log(Level.SEVERE, null, ex);
                } catch (COSVisitorException ex) {
                    Logger.getLogger(PDFEditor.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    // given the original pdf file, date stamp every page, sequence selected pages and
    // output two pdf files, one for audit, the other for reject 
    public void generatePDFFile(String date, String pdfFileName, Boolean[][] statusArray, String cycle)
            throws IOException, COSVisitorException {
        PDDocument pdf = PDDocument.load(pdfFileName);
        PDDocument blanPdf = new PDDocument();

        List pages = pdf.getDocumentCatalog().getAllPages();
        Iterator<PDPage> iter = pages.iterator();
        int pageNum = 0; // 0 based
        int sequenceNum = 1; // start from 0001
        while (iter.hasNext()) {
            PDPage page = iter.next();
            PDPageContentStream stream = new PDPageContentStream(pdf, page, true, false);

            // == date stamp
            stream.beginText();
            stream.setFont(PDType1Font.HELVETICA, 20);
            stream.moveTextPositionByAmount(200, 20);
            stream.drawString(date); //date stamp 
            stream.endText();
            // == end of date stamp

            //             // == void stamp
            //            if (statusArray[GlobalVar.VOID_BUTTON_INDEX][pageNum]) {
            //                stream.drawImage(voidMark, 0, 0);
            //            }
            // == end of void stamp

            // == seq stamp
            if (statusArray[GlobalVar.SELECT_BUTTON_INDEX][pageNum]) {
                stream.beginText();
                stream.setFont(PDType1Font.HELVETICA, 24);
                stream.moveTextPositionByAmount(600, 400);
                stream.setTextRotation(3.14 / 2, 600, 400); // rotate text 90 degree at x = 600, y = 400

                stream.drawString(cycle + "/" + GlobalVar.globalCountGenerator5Digit(sequenceNum));
                sequenceNum++;
                stream.endText();
            }
            // == end of seq stamp

            stream.close();
            pageNum++;
        }
        // out put two pdf files: one for audit, the other for reject
        String rejectPdfFileName = pdfFileName.replace(".pdf", "_forReject.pdf");
        String auditPdfFileName = pdfFileName.replace(".pdf", "_forAudit.pdf");
        extractGoodBadPdf(pdf, auditPdfFileName, rejectPdfFileName, statusArray);

        pdf.close();
    }

    // given date and 
    //    public static String dateStampPDFFile(String date, String pdfFileName) throws IOException, COSVisitorException {
    //        PDDocument pdf = PDDocument.load(pdfFileName);
    //        //String[] names = pdfFileName.split("\\.");
    //        String targetFile = "";
    //        if (pdfFileName.contains(".pdf")) {  //doesn't contain surfix
    //            targetFile = pdfFileName.replace(".pdf", "_DS.pdf");
    //        } else {
    //            targetFile = pdfFileName + "_DS.pdf";
    //        }
    ////        String imageName = "void.jpg";
    ////        String fileName = "res.pdf"     
    //        
    //        List pages = pdf.getDocumentCatalog().getAllPages();
    //        Iterator<PDPage> iter = pages.iterator();
    //        int pageNum = 0;
    //        while(iter.hasNext()) {
    //            PDPage page = iter.next();
    //            PDPageContentStream stream = new PDPageContentStream(pdf, page, true, false);
    //            
    //            // == date stamp
    //            stream.beginText();
    //            stream.setFont(PDType1Font.HELVETICA, 24);
    //            stream.moveTextPositionByAmount(100, 300);                   
    //            stream.drawString(date);            
    //            stream.endText();
    //            // == end of date stamp
    //            
    //           
    //            stream.close();
    //        }
    //        pdf.save(targetFile);
    //        pdf.close();
    //        return targetFile;
    //    }

    // given the page number(1 based), and void stamp on the given pdf file
    //    public static String voidStamp(List<Integer> pageNums, String pdfFileName) throws IOException, COSVisitorException {
    //        PDDocument pdf = PDDocument.load(pdfFileName);
    //        String targetFile = "";
    //        if (pdfFileName.contains(".pdf")) {  //doesn't contain surfix
    //            targetFile = pdfFileName.replace(".pdf", "_VS.pdf");
    //        } else {
    //            targetFile = pdfFileName + "_VS.pdf";
    //        }
    //        
    //        String imageName = "void.jpg";
    //
    //        
    //        BufferedImage buffered = ImageIO.read(new File(imageName));
    //        PDJpeg voidMark = new PDJpeg(pdf, buffered);
    ////        String imageName = "void.jpg";
    ////        String fileName = "res.pdf"     
    //        
    //        List pages = pdf.getDocumentCatalog().getAllPages();
    //        Iterator<PDPage> iter = pages.iterator();
    //        int pageCount = 1; // page number is 1 based
    //        while(iter.hasNext()) {
    //            PDPage page = iter.next();
    //            if (pageNums.contains(pageCount)){
    //                PDPageContentStream stream = new PDPageContentStream(pdf, page, true, false);
    //                stream.drawImage(voidMark, 100, 200);
    //                stream.close();
    //            }
    //            pageCount++;
    //        }
    //        pdf.save(targetFile);
    //        pdf.close();
    //        return targetFile;
    //    
    //    }

    // given the page number that skips incrementing the seq number, the page number list should contain void page list
    // write the sequence on the right middle of the file    
    //    public static String sequenceStampPDFFile(List<Integer> pageNums, String pdfFileName) throws IOException, COSVisitorException {
    //        PDDocument pdf = PDDocument.load(pdfFileName);
    //        String targetFile = "";
    //        if (pdfFileName.contains(".pdf")) {  //doesn't contain surfix
    //            targetFile = pdfFileName.replace(".pdf", "_SS.pdf");
    //        } else {
    //            targetFile = pdfFileName + "_SS.pdf";
    //        }
    ////        String imageName = "void.jpg";
    ////        String fileName = "res.pdf"     
    //        
    //        List pages = pdf.getDocumentCatalog().getAllPages();
    //        Iterator<PDPage> iter = pages.iterator();
    //        int sequenceNum = 1;
    //        int pageCount = 1;
    //        while(iter.hasNext()) {
    //            PDPage page = iter.next();
    //            PDPageContentStream stream = new PDPageContentStream(pdf, page, true, false);
    //            if(!pageNums.contains(pageCount)){
    //                stream.beginText();
    //                stream.setFont(PDType1Font.HELVETICA, 24);
    //                stream.moveTextPositionByAmount(600, 400);
    //                stream.setTextRotation(3.14/2, 600, 400); // rotate text 90 degree at x = 600, y = 400
    //
    //                stream.drawString(GlobalVar.globalCountGenerator(sequenceNum));
    //                sequenceNum++;
    //                stream.endText();
    //            }
    //            stream.close();
    //            pageCount++;
    //            
    //        }
    //        pdf.save(targetFile);
    //        pdf.close();
    //        return targetFile;
    //    }

    //given the date stamped, sequenced pdf file, audit pdf filename, reject pdf file name, and status array,
    // output two pdf files: one for audit, the other for reject
    private void extractGoodBadPdf(PDDocument pdf, String auditPdfFileName, String rejectPdfFileName,
            Boolean[][] statusArray) throws COSVisitorException, IOException {
        PDDocument rejectPdf = new PDDocument();
        PDDocument auditPdf = new PDDocument();
        int pageNum = pdf.getNumberOfPages();

        // add reject page into rejectPdf
        for (int i = 0; i < pageNum; i++) {
            PDPage page = (PDPage) pdf.getDocumentCatalog().getAllPages().get(i);
            if (statusArray[GlobalVar.VOID_BUTTON_INDEX][i]) {
                rejectPdf.addPage(page);
            } else {
                auditPdf.addPage(page);
            }
        }

        rejectPdf.save(rejectPdfFileName);
        rejectPdf.close();

        auditPdf.save(auditPdfFileName);
        auditPdf.close();
    }
}