Optimizer Options
On this page
Expand Collapse 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 #
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 () {
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 ]
start := time.Now()
inputFileInfo, err := os.Stat(inputPath)
if err != nil {
log.Fatalf("Fail: %v\n" , err)
}
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)
}
pdfWriter, err := reader.ToWriter(nil )
if err != nil {
log.Fatalf("Fail: %v\n" , err)
}
pdfWriter.SetOptimizer(optimize.New(optimize.Options{
CombineDuplicateDirectObjects: true ,
CombineIdenticalIndirectObjects: true ,
CombineDuplicateStreams: true ,
CompressStreams: true ,
UseObjectStreams: true ,
ImageQuality: 80 ,
ImageUpperPPI: 100 ,
CleanUnusedResources: true ,
}))
err = pdfWriter.WriteToFile(outputPath)
if err != nil {
log.Fatalf("Fail: %v\n" , err)
}
outputFileInfo, err := os.Stat(outputPath)
if err != nil {
log.Fatalf("Fail: %v\n" , err)
}
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