jPDFOptimizer Developer Guide

jPDFOptimizer Developer Guide

Contents

javalogo
Introduction
Getting Started
Optimize Images
Removing Unnecessary Objects
Other Advanced Optimization Options
Distribution and JAR files

Javadoc API
Source Code Samples

Introduction

jPDFOptimizer is a Java library to optimize PDF documents. jPDFOptimizer provides the following functions:

  • Modify image resolution, compression and color spaces.
  • Detect duplicate images and fonts and merge them.
  • Remove unused objects
  • Save to the file system or to Java output streams

Like all of our libraries, jPDFOptimizer is built on top of Qoppa’s proprietary technology and so does not require any third party software or drivers.

Getting Started

// Create the PDF Optimizer object with the path of the file to optimize
pdfOptimizer = new PDFOptimizer("C:\myfile.pdf", null);
 
// Set optimization settings
OptSettings options = new OptSettings();
// ... see below for ways to set optimization settings
// ....
 
// run the optimizer and save
pdfOptimizer.optimize(options, "C:\myfile_opt.pdf");

Optimizing Images

Optimizing images is done using an ImageHandler interface.

options.setImageHandler(new MyImageHandler());

MyImageHandler extends the ImageHanlder interface which declares the convertImage() method. This method gives developers all the flexibility to optimize images based on their own criteria, on a per image basis.

public class MyImageHandler extends ImageHandler
{
// 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.setImageHeight(newWidth);
imageoutput.setImageWidth(newHeight);
}
 
// return expected image output
return imageoutput;
}
}

Read more about PDF image optimization.

Removing Unnecessary Objects

OptSettings options = new OptSettings();
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);

Read more about optimizing a PDF by removing unnecessary objects.

Other Advanced Optimization Options

OptSettings options = new OptSettings();
options.setClearSignatures(true);
options.setFlattenAnnotations(true); /* if option to remove annotations is set, this option is ignored */
options.setFlattenFormFields(true); /* if option to remove fields is set, this option is ignored */
options.setFlateUncompressedStreams(true); 
options.setMergeDuplicateFonts(true);
options.setMergeDuplicateImages(true);

Read more about optimizing a PDF using  advanced optimization settings.

Distribution and JAR Files

jPDFOptimizer.jar – This is the main jar file for the component, it is always required.

cmykProfile.jar – This jar file contains a CMYK profile used to accurately convert CMYK colors to RGB for display.

jai_imageio.jar – This jar file contains Java’s ImageIO image decoders, including a decoder for JPEG 2000 images.  This is only used when a document contains JPEG 2000 images.

 

Javadoc API
Source Code Samples