Optimizer Options

This guide will show you how to optimize a PDF document by using various options provided by UniPDF.

Before you begin

You should get your API key from your UniCloud account.

If this is your first time using UniPDF SDK, follow this guide to set up a local development environment.

Clone the project repository

In your terminal, clone the examples repository. It contains the Go code we will be using for this guide.

git clone https://github.com/unidoc/unipdf-examples.git

Navigate to the compress folder in the unipdf-examples directory.

cd unipdf-examples/compress

How it works

/*
* PDF optimization (compression) example.
*
* Run as: go run pdf_optimize.go <input.pdf> <output.pdf>
*/
package main
import (
"fmt"
"log"
"os"
"time"
"github.com/unidoc/unipdf/v4/common/license"
"github.com/unidoc/unipdf/v4/model"
"github.com/unidoc/unipdf/v4/model/optimize"
)
func init() {
// Make sure to load your metered License API key prior to using the library.
// If you need a key, you can sign up and create a free one at https://cloud.unidoc.io
err := license.SetMeteredKey(os.Getenv(`UNIDOC_LICENSE_API_KEY`))
if err != nil {
panic(err)
}
}
func main() {
args := os.Args
if len(args) < 3 {
fmt.Printf("Usage: %s INPUT_PDF_PATH OUTPUT_PDF_PATH\n", os.Args[0])
return
}
inputPath := args[1]
outputPath := args[2]
// Initialize starting time.
start := time.Now()
// Get input file stat.
inputFileInfo, err := os.Stat(inputPath)
if err != nil {
log.Fatalf("Fail: %v\n", err)
}
// Create reader.
inputFile, err := os.Open(inputPath)
if err != nil {
log.Fatalf("Fail: %v\n", err)
}
defer inputFile.Close()
reader, err := model.NewPdfReader(inputFile)
if err != nil {
log.Fatalf("Fail: %v\n", err)
}
// Generate a PDFWriter from PDFReader.
pdfWriter, err := reader.ToWriter(nil)
if err != nil {
log.Fatalf("Fail: %v\n", err)
}
// Set optimizer.
pdfWriter.SetOptimizer(optimize.New(optimize.Options{
CombineDuplicateDirectObjects: true,
CombineIdenticalIndirectObjects: true,
CombineDuplicateStreams: true,
CompressStreams: true,
UseObjectStreams: true,
ImageQuality: 80,
ImageUpperPPI: 100,
CleanUnusedResources: true,
}))
// Create output file.
err = pdfWriter.WriteToFile(outputPath)
if err != nil {
log.Fatalf("Fail: %v\n", err)
}
// Get output file stat.
outputFileInfo, err := os.Stat(outputPath)
if err != nil {
log.Fatalf("Fail: %v\n", err)
}
// Print basic optimization statistics.
inputSize := inputFileInfo.Size()
outputSize := outputFileInfo.Size()
ratio := 100.0 - (float64(outputSize) / float64(inputSize) * 100.0)
duration := float64(time.Since(start)) / float64(time.Millisecond)
fmt.Printf("Original file: %s\n", inputPath)
fmt.Printf("Original size: %d bytes\n", inputSize)
fmt.Printf("Optimized file: %s\n", outputPath)
fmt.Printf("Optimized size: %d bytes\n", outputSize)
fmt.Printf("Compression ratio: %.2f%%\n", ratio)
fmt.Printf("Processing time: %.2f ms\n", duration)
}

Lines 9-18 import the UniPDF packages and other required dependencies.

The init function in lines 20-27 authenticates your request with your UNIDOC_LICENSE_API_KEY.

The main function in lines 32-89 is just like any other function when we want to create a regular PDF file, one difference would be on line 66-74 where we use various options available to help reduce PDF document size.

Run the code

Run this command to add a line annotation to the specified page in a PDF. This will also get all the required dependencies to run the program.

go run pdf_optimize.go input.pdf output.pdf

Sample output

Running the code example will show you some info on how much compression is made, similar like the following.

Original file: input.pdf
Original size: 266845 bytes
Optimized file: output.pdf
Optimized size: 207347 bytes
Compression ratio: 22.30%
Processing time: 53.17 ms

Got any Questions?

We're here to help you.