PDF 是通过 Internet 共享文档的标准格式。其全球支持和一致的布局使其成为此类场景的理想选择。但是,有时 PDF 文件的大小会因图像、绘图等内容而增大。在这种情况下,您可以轻松优化或压缩 PDF 文件以减小其大小,而不会影响其质量。为此,本文将教您使用 C++ 压缩和优化 PDF 文件以减小其大小的不同技术。

用于压缩和优化 PDF 文件的 C++ API

Aspose.PDF for C++ 是一个 C++ 库,允许您创建、阅读和更新 PDF 文档。您可以使用此 API 压缩和优化大型 PDF 文件以减小其大小,同时仍保持其质量。您可以通过 NuGet 安装 API,也可以直接从 下载 部分下载。

PM> Install-Package Aspose.PDF.Cpp

使用 C++ 优化 Web 的 PDF 文档

如果您想在 Web 上显示 PDF 文档,优化它们将提高它们的加载速度,从而增强用户体验。为了优化 PDF 文档,请按照以下步骤操作。

以下示例代码展示了如何使用 C++ 为 Web 优化 PDF 文档。

// 打开 PDF 文档
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Sample 4.pdf");

// 优化PDF文档
pdfDocument->Optimize();

// 保存 PDF 文档
pdfDocument->Save(u"OutputDirectory\\Optimized_output.pdf");

使用 C++ 压缩 PDF 文件中的图像并调整其大小

如果 PDF 文件包含大量图像,则可能会导致文件过大。在此类文件中,图像在增加其大小方面起着重要作用。在这些文件中压缩和调整图像大小会导致它们的大小显着减小。以下是在 PDF 文件中压缩和调整图像大小的步骤。

以下示例代码演示了如何使用 C++ 压缩和调整图像大小以减小 PDF 文件大小。

// 打开 PDF 文档
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Sample 4.pdf");

// 创建 OptimizationOptions 类的实例
System::SharedPtr<Aspose::Pdf::Optimization::OptimizationOptions> options = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();

// 压缩和调整图像大小并设置它们的质量和分辨率
options->get_ImageCompressionOptions()->set_CompressImages(true);
options->get_ImageCompressionOptions()->set_ImageQuality(10);
options->get_ImageCompressionOptions()->set_MaxResolution(150);
options->get_ImageCompressionOptions()->set_ResizeImages(true);

// 优化文档中的资源
pdfDocument->OptimizeResources(options);

// 保存 PDF 文档
pdfDocument->Save(u"OutputDirectory\\Compressed_PDF_With_Images.pdf");

要进一步减小文件大小,您还可以从文件中删除嵌入的字体。删除嵌入字体有两种策略;第一个是您删除所有嵌入的字体,第二个是您只删除未使用字体的子集。此外,您还可以删除未使用的流并链接重复的流以减少额外的大小。以下是将先前讨论的更改应用于 PDF 文件的步骤。

以下示例代码展示了如何使用 C++ 通过取消嵌入字体和删除未使用的流和对象来减小 PDF 文件大小。

// 打开 PDF 文档
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Sample 4.pdf");

// 创建 OptimizationOptions 类的实例
System::SharedPtr<Aspose::Pdf::Optimization::OptimizationOptions> options = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();

// 任何一个
// 取消嵌入 PDF 中的所有字体
options->set_UnembedFonts(true);

// 或者
// 仅保留已使用字符的嵌入字体
options->set_SubsetFonts(true);

// 链接重复的流
options->set_LinkDuplcateStreams(false);

// 删除未使用的流
options->set_RemoveUnusedStreams(false);

// 删除未使用的对象
options->set_RemoveUnusedObjects(false);

// 优化文档中的资源
pdfDocument->OptimizeResources(options);

// 保存 PDF 文档
pdfDocument->Save(u"OutputDirectory\\Remove_Embedded_Fonts_Output.pdf");

使用 C++ 删除或展平注释

PDF 文件中可能有多个注释,例如文本、形状等,这会增加文件大小。如果不再需要这些注释,则可以删除它们,如果不需要进一步更改,可以将它们展平。这样做会减小 PDF 文件的大小。以下是从 PDF 文件中删除或展平注释的步骤。

以下示例代码展示了如何使用 C++ 删除或展平 PDF 文件中的注释。

// 创建 PdfAnnotationEditor 类的实例
System::SharedPtr<Aspose::Pdf::Facades::PdfAnnotationEditor> annotationEditor = System::MakeObject<Aspose::Pdf::Facades::PdfAnnotationEditor>();

// 加载示例 PDF 文件
annotationEditor->BindPdf(u"SourceDirectory\\PDF\\AnnotationSample.pdf");

// 任何一个
// 展平注释
annotationEditor->FlatteningAnnotations();

// 或者
// 删除注释
//annotationEditor->DeleteAnnotations();

// 保存 PDF 文档
annotationEditor->Save(u"OutputDirectory\\Remove_Annotations_Output.pdf");

使用 C++ 从 PDF 文件中删除表单域

当您需要收集数据时,表单字段是必需的。如果不再需要数据收集,您可以展平表单域以减小 PDF 文件大小。以下是在 PDF 文件中展平表单域的步骤。

以下示例代码显示了如何使用 C++ 展平 PDF 文件中的表单域。

// 打开 PDF 文档
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Fillable_PDF_Form.pdf");

if (pdfDocument->get_Form()->get_Fields()->get_Length() > 0)
{
	// 遍历表单字段
	for (System::SharedPtr<Field> field : pdfDocument->get_Form()->get_Fields())
	{
		// 展平场
		field->Flatten();
	}
}

// 保存 PDF 文档
pdfDocument->Save(u"OutputDirectory\\Flatten_Form_Fields.pdf");

使用 C++ 将 PDF 文件的 RGB 颜色空间转换为灰度

带有文本信息的 PDF 文件可以在灰度色彩空间中很好地表示,因此当减小文件大小是必不可少的时,可以将此类 PDF 文件转换为灰度。此外,假设优先级是归档文件并尽可能减小大小。在这种情况下,带有图像的 PDF 文件也可以转换为灰度,因为主要目标是使文件尽可能小。要将 PDF 文件的颜色空间从 RGB 更改为灰度,请按照以下步骤操作:

以下示例代码展示了如何使用 C++ 将 PDF 文件的颜色空间从 RGB 转换为灰度。

// 打开 PDF 文档
auto pdfDocument = MakeObject<Document>(u"SourceDirectory\\PDF\\Sample 1.pdf");

System::SharedPtr<RgbToDeviceGrayConversionStrategy> strategy = MakeObject<RgbToDeviceGrayConversionStrategy>();

for (int idxPage = 1; idxPage <= pdfDocument->get_Pages()->get_Count(); idxPage++) {
	System::SharedPtr<Page> page = pdfDocument->get_Pages()->idx_get(idxPage);

	// 将每页的色彩空间转换为灰度
	strategy->Convert(page);
}

// 保存 PDF 文档
pdfDocument->Save(u"OutputDirectory\\Grayscale_PDF_Output.pdf");

获得免费许可证

您可以通过请求 免费的临时许可证 来试用该 API,而不受评估限制。

结论

本文的目标是研究压缩和优化 PDF 文件以减小其大小的不同方法。首先,我们研究了如何优化 Web 的 PDF 文件。然后我们看到了如何压缩和调整 PDF 文件中的图像。此外,我们还学习了如何从 PDF 文件中删除嵌入的字体和流。除此之外,我们还学习了如何展平注释和表单域,以及如何将 PDF 文件的色彩空间转换为灰度。我们探索了所有这些方法来减小 PDF 文件的大小而不影响其质量。 Aspose.PDF for C++ 为处理 PDF 文件提供了许多附加功能。您可以通过访问 官方文档 来详细探索 API。如有任何问题,请随时通过我们的 免费支持论坛 与我们联系。

也可以看看