package jPDFOptimizerSamples; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.FileOutputStream; import com.qoppa.pdfOptimizer.ImageHandler; import com.qoppa.pdfOptimizer.ImageInfo; import com.qoppa.pdfOptimizer.ImageOutput; import com.qoppa.pdfOptimizer.OptSettings; import com.qoppa.pdfOptimizer.OptimizeResults; import com.qoppa.pdfOptimizer.PDFOptimizer; /** * * SimpleOptimize is a sample program to demonstrate the capabilities of * Qoppa's PDF Library jPDFOptimizer. This is the simplest implementation * it to open a PDF document, optimize it and save it to a new file. * Note that the main class SimpleOptimize implements com.qoppa.pdfOptimizer.ImageHandler. * * * @author Qoppa Software * */ public class SimpleOptimize implements ImageHandler, PropertyChangeListener { public static void main (String [] args) { try { // Load a document PDFOptimizer pdfOptimize = new PDFOptimizer("C:\\test\\test.pdf", null); SimpleOptimize mySimpleOptimize = new SimpleOptimize(); // add property change listener to get progress notifications // SimpleOptimize extends PropertyChangeListener pdfOptimize.addPropertyChangeListener(mySimpleOptimize); OptSettings options = new OptSettings(); // Options to remove objects options.setDiscardAltImages(true); options.setDiscardAnnotations(true); options.setDiscardBookmarks(true); options.setDiscardDocumentInfo(true); options.setDiscardFileAttachments(true); options.setDiscardFormFields(true); options.setDiscardJSActions(true); options.setDiscardPageThumbnails(true); options.setDiscardXMPData(true); options.setDiscardUnusedResources(true); options.setDiscardLinks(true); // Other optimizing options options.setClearSignatures(true); options.setFlateUncompressedStreams(true); options.setMergeDuplicateFonts(true); options.setMergeDuplicateImages(true); // set the image handler // SimpleOptimizer extends ImageHandler options.setImageHandler(mySimpleOptimize); // Save the merged document OptimizeResults optimizeResults = pdfOptimize.optimize(options, "C:\\test\\test_opt.pdf"); // Write the optimize results to a file FileOutputStream optOut = new FileOutputStream("c:\\test\\test_opt.xml"); optimizeResults.writeXml(optOut); optOut.flush(); optOut.close(); // indicate that the file is done writing System.out.print("Done!"); } catch (Throwable t) { t.printStackTrace(); } } // this is the method where you can implement any image conversion / optimization public ImageOutput convertImage(ImageInfo imageInfo) { // construct an image output that by default retains the same image properties as the image input ImageOutput imageoutput = new ImageOutput(ImageOutput.CO_RETAIN, ImageOutput.CS_RETAIN, imageInfo.getImageWidth(), imageInfo.getImageHeight()); // for gray or black and white images, use JBIG2 compressions if(imageInfo.isGray() || imageInfo.isMonochrome()) { imageoutput.setCompression(ImageOutput.CO_JBIG2); imageoutput.setColorSpace(ImageOutput.CS_BW); } // for color images, use JPEG 2000 compression if(imageInfo.isColor()) { imageoutput.setCompression(ImageOutput.CO_JPEG2000); imageoutput.setCompressionQuality(0.8f); } // downgrade image resolution to 200DPI if it's higher if (imageInfo.getDPIX() > 200 || imageInfo.getDPIY() > 200) { // Calculate new dimensions to match DPI float scale = Math.min(200 / imageInfo.getDPIX(), 200 / imageInfo.getDPIY()); int newWidth = (int)(imageInfo.getImageWidth() * scale + 0.5); int newHeight = (int)(imageInfo.getImageHeight() * scale + 0.5); imageoutput.setImageWidth(Math.max(newWidth, 1)); imageoutput.setImageHeight(Math.max(newHeight, 1)); } // return the new image output return imageoutput; } // write progress public void propertyChange(PropertyChangeEvent evt) { System.out.println("IN PROGRESS " + (String)evt.getNewValue() + "..."); } }