PDF 生成模板编辑器
开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。
使用 WriteOptimizeToFilePath() 方法执行压缩并保存文档:
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() 设置进度回调委托:
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() 取消操作:
// 在另一个线程或异步操作中取消压缩
bool cancelled = optimizeOption.OptimizeCancel();
if (cancelled)
{
Console.WriteLine("压缩操作已取消");
}以下是一个完整的文档压缩示例,展示如何组合使用各种优化选项:
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();
}