A simple implementation of the library to open a PDF document, optimize it and save it to a new file using Qoppa’s java library jPDFOptimizer.

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import com.qoppa.pdfOptimizer.ImageHandler;
import com.qoppa.pdfOptimizer.ImageInfo;
import com.qoppa.pdfOptimizer.ImageOutput;
import com.qoppa.pdfOptimizer.OptSettings;
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 SimpleOptimizer 
 * implements com.qoppa.pdfOptimizer.ImageHandler and PropertyListener
 */
public class SimpleOptimizer implements ImageHandler, PropertyChangeListener
{
    public static void main (String [] args)
    {
        try
        {
            // Load a document
            PDFOptimizer pdfOptimize = new PDFOptimizer("C:\\myfile.pdf", null);
 
            // set optimization options
            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);
           options.setCompressObjectsIntoStreams(true);
 
	   // create and set the image handler
	   // This class SimpleOptimizer extends ImageHandler 
	   // and implements method convertImage (see below)
           SimpleOptimizer mySimpleOptimizer = new SimpleOptimizer();
           options.setImageHandler(mySimpleOptimizer);
 
            // add property change listener to get progress notifications
            // SimpleOptimizer extends PropertyChangeListener
            pdfOptimize.addPropertyChangeListener(mySimpleOptimizer);
 
            // Save the optimized document
            pdfOptimize.optimize(options, "C:\\myfile_opt.pdf");
 
            // 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
                // and use a quality of 0.5
		if(imageInfo.isColor())
		{
			imageoutput.setCompression(ImageOutput.CO_JPEG2000);
			imageoutput.setCompressionQuality(0.5f);
		}
 
		// 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(newWidth);
			imageoutput.setImageHeight(newHeight);
		}
 
		// return the new image output
		return imageoutput;
	}
 
	// write progress
	public void propertyChange(PropertyChangeEvent evt)
	{
		System.out.println("IN PROGRESS " + (String)evt.getNewValue() + "...");
	}
}