Skip to content
ComPDF
DemoSampleAPI ReferenceFAQ

PDF Generation Template Editor

Open-source visual PDF generation engine with customizable templates and developer-friendly APIs.

View on GitHub
Guides

Execute Document Compression

Basic Compression Example

Use the WriteOptimizeToFilePath() method to execute compression and save the document:

c#
CPDFDocument document = CPDFDocument.InitWithFilePath("input.pdf");
CPDFOptimizeOption optimizeOption = document.GetOptimizeOption();

// Configure optimization options
CPDF_OPTIMIZE_FLAG flags = 
    CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_RMNOTUSE |
    CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_BCOMPRESSIMAGE |
    CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_USEFLATE;
optimizeOption.SetFlag(flags);

// Configure image compression
optimizeOption.SetImageQuality(60.0f);

// Execute compression and save
// Parameter fontSubset: true means enable font subsetting
bool success = document.WriteOptimizeToFilePath("output_optimized.pdf", true);

if (success)
{
    Console.WriteLine("Document compression successful");
}

Compression with Progress Callback

Use SetGetPageIndexDelegate() to set a progress callback delegate:

c#
CPDFDocument document = CPDFDocument.InitWithFilePath("input.pdf");
CPDFOptimizeOption optimizeOption = document.GetOptimizeOption();

// Configure optimization flags
optimizeOption.SetFlag(
    CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_BCOMPRESSIMAGE |
    CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_OPTIMIZEPAGECONTENT
);

// Set progress callback
optimizeOption.SetGetPageIndexDelegate((pageIndex) =>
{
    int totalPages = document.PageCount;
    int currentPage = pageIndex + 1;
    double progress = (double)currentPage / totalPages * 100;
    Console.WriteLine($"Processing page {currentPage}/{totalPages} ({progress:F1}%)");
    return 0;
});

// Execute compression
bool success = document.WriteOptimizeToFilePath("output_with_progress.pdf", true);

Cancel Compression Operation

You can call OptimizeCancel() to cancel the operation during compression:

c#
// Cancel compression in another thread or async operation
bool cancelled = optimizeOption.OptimizeCancel();
if (cancelled)
{
    Console.WriteLine("Compression operation cancelled");
}

Comprehensive Compression Example

Here is a complete document compression example showing how to combine various optimization options:

c#
public void CompressDocument(string inputPath, string outputPath)
{
    // Open document
    CPDFDocument document = CPDFDocument.InitWithFilePath(inputPath);
    if (document == null || document.IsLocked)
    {
        Console.WriteLine("Cannot open document");
        return;
    }

    // Get original file size
    FileInfo originalFile = new FileInfo(inputPath);
    long originalSize = originalFile.Length;

    // Get optimization options
    CPDFOptimizeOption optimizeOption = document.GetOptimizeOption();
    if (!optimizeOption.IsValid())
    {
        Console.WriteLine("Cannot get optimization options");
        return;
    }

    // Configure optimization flags - comprehensive optimization
    CPDF_OPTIMIZE_FLAG flags = 
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_RMNOTUSE |           // Remove unused resources
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_RMEPTOBJ |           // Remove empty objects
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_BCOMPRESSIMAGE |     // Enable image compression
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_RMDOCINFO |          // Remove document info
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_RMMEDTADATA |        // Remove metadata
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_USEFLATE |           // Use Flate compression
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_OPTIMIZEPAGECONTENT; // Optimize page content
    optimizeOption.SetFlag(flags);

    // Configure image compression options
    CPDFOptimizeImageOption imageOption = new CPDFOptimizeImageOption();
    imageOption.UperPpi = 225;
    imageOption.TargetPpi = 150;
    imageOption.CompAlg = CPDF_COMP_ALG.COMP_ALG_JPEG;
    imageOption.Quality = 50;
    optimizeOption.SetImageOption(imageOption);

    // Set progress callback
    optimizeOption.SetGetPageIndexDelegate((pageIndex) =>
    {
        Console.WriteLine($"Processing progress: {pageIndex + 1}/{document.PageCount}");
        return 0;
    });

    // Execute compression
    bool success = document.WriteOptimizeToFilePath(outputPath, true);

    if (success)
    {
        // Calculate compression ratio
        FileInfo compressedFile = new FileInfo(outputPath);
        long compressedSize = compressedFile.Length;
        double compressionRatio = (1 - (double)compressedSize / originalSize) * 100;

        Console.WriteLine($"Compression complete!");
        Console.WriteLine($"Original size: {originalSize / 1024.0:F2} KB");
        Console.WriteLine($"Compressed size: {compressedSize / 1024.0:F2} KB");
        Console.WriteLine($"Compression ratio: {compressionRatio:F1}%");
    }
    else
    {
        Console.WriteLine("Compression failed");
    }

    // Release resources
    document.Release();
}