PDF.PDFNumbering.java Source code

Java tutorial

Introduction

Here is the source code for PDF.PDFNumbering.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.Dimension;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdfparser.PDFStreamParser;
import org.apache.pdfbox.pdfwriter.ContentStreamWriter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.util.PDFOperator;
import org.apache.pdfbox.util.PDFTextStripper;
import Utilities.GlobalVar;

/**
 *
 * @author bob
 */
public class PDFNumbering {
    private JRadioButton voidButton;
    private JRadioButton selectButton;
    private JRadioButton skipButton;
    private ButtonGroup statusButtonGroup;
    private JLabel seqText;
    private Boolean[][] statusArray;
    private JButton submitPDFButton;

    public PDFNumbering(String pdfFileName) throws IOException, COSVisitorException {
        String cycle = JOptionPane.showInputDialog(null, "Please enter a cycle number");
        PDDocument pdf = PDDocument.load(pdfFileName);
        List pages = pdf.getDocumentCatalog().getAllPages();
        PDFTextStripper pdfStripper = new PDFTextStripper();
        String res = pdfStripper.getText(pdf);
        //System.out.println(res);
        Boolean isPreProcessed = res.contains(GlobalVar.PRE_PROC_KEY_SYMBOL); // check if the file is pre-processed.
        Boolean isNumbered = res.contains("/0");
        Iterator<PDPage> iter = pages.iterator();
        int sequenceNum = 1; // start from 0001
        if (isPreProcessed && isNumbered) {
            GlobalVar.updateSeqNum(pdf, cycle); // update the sequence number
        } else if (isPreProcessed) { // first time
            int pageNumber = 1;

            while (iter.hasNext()) {
                PDPage page = iter.next();

                pdfStripper.setStartPage(pageNumber);
                pdfStripper.setEndPage(pageNumber);
                res = pdfStripper.getText(pdf);
                // == numbering
                if (res.contains(GlobalVar.PRE_PROC_KEY_SYMBOL)) {
                    PDPageContentStream stream = new PDPageContentStream(pdf, page, true, false);
                    stream.beginText();
                    stream.setFont(PDType1Font.HELVETICA, GlobalVar.SEQ_NUM_FONT_SIZE);
                    stream.moveTextPositionByAmount(GlobalVar.SEQ_NUM_TEXT_X_POSITION,
                            GlobalVar.SEQ_NUM_TEXT_Y_POSITION);
                    stream.setTextRotation(3.14 / 2, GlobalVar.SEQ_NUM_TEXT_X_POSITION,
                            GlobalVar.SEQ_NUM_TEXT_Y_POSITION); // rotate text 90 degree at x = 600, y = 400
                    stream.drawString(cycle + "/" + GlobalVar.globalCountGenerator5Digit(sequenceNum));
                    sequenceNum++;
                    stream.endText();
                    stream.close();
                }
                pageNumber++;
                // end of numbering
            }

        } else { //not pre processed
            while (iter.hasNext()) {
                PDPage page = iter.next();
                PDPageContentStream stream = new PDPageContentStream(pdf, page, true, false);
                // == numbering
                stream.beginText();
                stream.setFont(PDType1Font.HELVETICA, GlobalVar.SEQ_NUM_FONT_SIZE);
                stream.moveTextPositionByAmount(GlobalVar.SEQ_NUM_TEXT_X_POSITION,
                        GlobalVar.SEQ_NUM_TEXT_Y_POSITION);
                stream.setTextRotation(3.14 / 2, GlobalVar.SEQ_NUM_TEXT_X_POSITION,
                        GlobalVar.SEQ_NUM_TEXT_Y_POSITION); // rotate text 90 degree at x = 600, y = 400
                stream.drawString(cycle + "/" + GlobalVar.globalCountGenerator5Digit(sequenceNum));
                sequenceNum++;
                stream.endText();
                stream.close();
            }
        }

        // out put two pdf files: one for audit, the other for reject
        String suffix = "_" + cycle + " Numbered.pdf";
        pdfFileName = pdfFileName.replace(".pdf", suffix);
        pdf.save(pdfFileName);
        pdf.close();
    }

    //    // pre: the pdf file pre-processed and pre-numbered
    //    // post:  re-number the sequence numbers if any
    //    private void updateSeqNum(PDDocument doc, String cycle) throws IOException {           
    //        int sequenceNum = 1;
    //        List pages = doc.getDocumentCatalog().getAllPages();
    //        
    //        for (int i = 0; i < pages.size(); i++)
    //        {
    //            PDPage page = (PDPage) pages.get(i);
    //            PDStream contents = page.getContents();
    //            PDFStreamParser parser = new PDFStreamParser(contents.getStream());
    //            parser.parse();
    //            List tokens = parser.getTokens();
    //            for (int j = 0; j < tokens.size(); j++)
    //            {
    //                Object next = tokens.get(j);
    //                if (next instanceof PDFOperator)
    //                {
    //                    PDFOperator op = (PDFOperator) next;
    //                    // Tj and TJ are the two operators that display strings in a PDF
    //                    if (op.getOperation().equals("Tj"))
    //                    {
    //                        // Tj takes one operator and that is the string
    //                        // to display so lets update that operator
    //                        COSString previous = (COSString) tokens.get(j - 1);
    //                        String string = previous.getString();
    ////                        System.out.println(string);
    ////                        System.out.println(string.charAt(5));
    //                        if (string.contains("/0")){
    //                            String seq = cycle + "/" + GlobalVar.globalCountGenerator5Digit(sequenceNum);
    //                            string = string.replaceFirst(string, seq);
    //                            previous.reset();
    //                            previous.append(string.getBytes("ISO-8859-1"));
    //                            sequenceNum++;
    //                            break;
    //                        }
    //                        //Word you want to change. Currently this code changes word "Solr" to "Solr123"
    //                        previous.reset();
    //                        previous.append(string.getBytes("ISO-8859-1"));
    //
    //                    }
    //                    else if (op.getOperation().equals("TJ"))
    //                    {
    //                        COSArray previous = (COSArray) tokens.get(j - 1);
    //                        for (int k = 0; k < previous.size(); k++)
    //                        {
    //                            Object arrElement = previous.getObject(k);
    //                            if (arrElement instanceof COSString)
    //                            {
    //                                COSString cosString = (COSString) arrElement;
    //                                String string = cosString.getString();
    ////                                System.out.println(string);
    //                                if (string.contains("/00")){
    //                                    String seq = cycle + "/" + GlobalVar.globalCountGenerator5Digit(sequenceNum);
    //                                    string = string.replaceFirst(string, seq);
    //                                    cosString.reset();
    //                                    cosString.append(string.getBytes("ISO-8859-1"));
    //                                    sequenceNum++;
    //                                    break;
    //                                }
    //                                // Currently this code changes word "Solr" to "Solr123"
    //                                cosString.reset();
    //                                cosString.append(string.getBytes("ISO-8859-1"));
    ////                                break;
    //                            }
    //                        }
    //                    }
    //                }
    //            }
    //            // now that the tokens are updated we will replace the page content stream.
    //            PDStream updatedStream = new PDStream(doc);
    //            OutputStream out = updatedStream.createOutputStream();
    //            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
    //            tokenWriter.writeTokens(tokens);
    //            page.setContents(updatedStream);
    //        }
    //    }
}