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.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(); } }