Java tutorial
/* * 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); // } // } }