Skip to content

PDF 生成模板编辑器

开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。

查看 GitHub

执行文档压缩

基本压缩示例

使用 WriteOptimizeToFilePath() 方法执行压缩并保存文档:

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

// 配置优化选项
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);

// 配置图像压缩
optimizeOption.SetImageQuality(60.0f);

// 执行压缩并保存
// 参数 fontSubset: true 表示启用字体子集化
bool success = document.WriteOptimizeToFilePath("output_optimized.pdf", true);

if (success)
{
    Console.WriteLine("文档压缩成功");
}

带进度回调的压缩

使用 SetGetPageIndexDelegate() 设置进度回调委托:

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

// 配置优化标志
optimizeOption.SetFlag(
    CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_BCOMPRESSIMAGE |
    CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_OPTIMIZEPAGECONTENT
);

// 设置进度回调
optimizeOption.SetGetPageIndexDelegate((pageIndex) =>
{
    int totalPages = document.PageCount;
    int currentPage = pageIndex + 1;
    double progress = (double)currentPage / totalPages * 100;
    Console.WriteLine($"正在处理第 {currentPage}/{totalPages} 页 ({progress:F1}%)");
    return 0;
});

// 执行压缩
bool success = document.WriteOptimizeToFilePath("output_with_progress.pdf", true);

取消压缩操作

在压缩过程中可以调用 OptimizeCancel() 取消操作:

c#
// 在另一个线程或异步操作中取消压缩
bool cancelled = optimizeOption.OptimizeCancel();
if (cancelled)
{
    Console.WriteLine("压缩操作已取消");
}

综合压缩示例

以下是一个完整的文档压缩示例,展示如何组合使用各种优化选项:

c#
public void CompressDocument(string inputPath, string outputPath)
{
    // 打开文档
    CPDFDocument document = CPDFDocument.InitWithFilePath(inputPath);
    if (document == null || document.IsLocked)
    {
        Console.WriteLine("无法打开文档");
        return;
    }

    // 获取原始文件大小
    FileInfo originalFile = new FileInfo(inputPath);
    long originalSize = originalFile.Length;

    // 获取优化选项
    CPDFOptimizeOption optimizeOption = document.GetOptimizeOption();
    if (!optimizeOption.IsValid())
    {
        Console.WriteLine("无法获取优化选项");
        return;
    }

    // 配置优化标志 - 综合优化
    CPDF_OPTIMIZE_FLAG flags = 
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_RMNOTUSE |           // 移除未使用资源
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_RMEPTOBJ |           // 移除空对象
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_BCOMPRESSIMAGE |     // 启用图像压缩
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_RMDOCINFO |          // 移除文档信息
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_RMMEDTADATA |        // 移除元数据
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_USEFLATE |           // 使用 Flate 压缩
        CPDF_OPTIMIZE_FLAG.OPTIMIZE_FLAG_OPTIMIZEPAGECONTENT; // 优化页面内容
    optimizeOption.SetFlag(flags);

    // 配置图像压缩选项
    CPDFOptimizeImageOption imageOption = new CPDFOptimizeImageOption();
    imageOption.UperPpi = 225;
    imageOption.TargetPpi = 150;
    imageOption.CompAlg = CPDF_COMP_ALG.COMP_ALG_JPEG;
    imageOption.Quality = 50;
    optimizeOption.SetImageOption(imageOption);

    // 设置进度回调
    optimizeOption.SetGetPageIndexDelegate((pageIndex) =>
    {
        Console.WriteLine($"处理进度: {pageIndex + 1}/{document.PageCount}");
        return 0;
    });

    // 执行压缩
    bool success = document.WriteOptimizeToFilePath(outputPath, true);

    if (success)
    {
        // 计算压缩率
        FileInfo compressedFile = new FileInfo(outputPath);
        long compressedSize = compressedFile.Length;
        double compressionRatio = (1 - (double)compressedSize / originalSize) * 100;

        Console.WriteLine($"压缩完成!");
        Console.WriteLine($"原始大小: {originalSize / 1024.0:F2} KB");
        Console.WriteLine($"压缩后大小: {compressedSize / 1024.0:F2} KB");
        Console.WriteLine($"压缩率: {compressionRatio:F1}%");
    }
    else
    {
        Console.WriteLine("压缩失败");
    }

    // 释放资源
    document.Release();
}