package com.aha.pdftools; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.aha.pdftools.transform.PdfTransformation; import com.aha.pdftools.transform.ShrinkImages; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import com.itextpdf.text.pdf.PdfWriter; public class PdfShrinker { private final List<PdfTransformation> transformations; public PdfShrinker() { transformations = new ArrayList<>(); transformations.add(new ShrinkImages()); } public void process(File input, File output) throws IOException, DocumentException { boolean createTempFile = input.equals(output); File outputFile = createTempFile ? FileUtils.createTempFile(output.getAbsolutePath(), PdfPermissionManager.PDF_EXTENSION) : output; PdfReader reader = new PdfReader(input.getAbsolutePath()); PdfPermissionManager.unlockReader(reader); applyTransformations(reader); FileOutputStream fout = new FileOutputStream(outputFile); // set at least version 1.5 to use full compression char version = reader.getPdfVersion() < PdfWriter.VERSION_1_5 ? PdfWriter.VERSION_1_5 : '\0'; PdfStamper stp = new PdfStamper(reader, fout, version); stp.setFullCompression(); stp.close(); if (createTempFile) { FileUtils.moveFile(outputFile, output); } } private void applyTransformations(PdfReader reader) throws IOException { for (PdfTransformation transformation : transformations) { transformation.transform(reader); } } }