使用 C++ 將 XPS、OXPS 轉換為 JPG 或 PNG 圖像

XPSOXPS 文檔類似於 PDF 文件,它們定義文檔的佈局、外觀和打印信息。在某些情況下,您可能需要將 XPS 和 OXPS 文檔轉換為 JPGPNG 圖像格式。為此,本文將教您如何使用 C++ 將 XPS 和 OXPS 文檔轉換為 JPG 和 PNG 圖像格式。

用於將 XPS、OXPS 文件轉換為 JPG 或 PNG 格式的 C++ API

Aspose.Page for C++ 是一個用於呈現和操作 XPS 和 PostScript 文件的 C++ 庫。它允許您創建、讀取和更新 XPS 文檔。此外,API 支持將 XPS 和 OXPS 文檔轉換為 JPG 和 PNG 圖像格式。您可以通過 NuGet 安裝 API 或直接從 下載 部分下載。

PM> Install-Package Aspose.Page.Cpp

將 XPS/OXPS 文檔轉換為 JPG 格式

以下是將 XPS 和 OXPS 文檔轉換為 JPG 格式的步驟。

  • 使用源 XPS/OXPS 文件初始化流。
  • 使用 XPS/OXPS 流創建 XpsDocument 類的實例。
  • 創建 JpegSaveOptions 類的實例。
  • 指定 SmoothingModeResolution 等選項。
  • 創建 ImageDevice 類的實例。
  • 使用 [XpsDocument->Save(System::SharedPtr) 將 XPS/OXPS 文檔保存到 ImageDevice設備,系統::SharedPtr選項)]15 方法。
  • 遍歷文檔分區。
  • 初始化輸出流並保存 JPG 圖像。

以下示例代碼顯示瞭如何使用 C++ 將 XPS/OXPS 文檔轉換為 JPG 格式。

// 輸入文件
System::String inputFileName = u"SourceDirectory\\sample.xps";
//輸出文件 
System::String outputFileName = u"OutputDirectory\\XPStoImage_out.jpeg";
// 初始化 XPS 輸入流
{
	System::SharedPtr<System::IO::Stream> xpsStream = System::IO::File::Open(inputFileName, System::IO::FileMode::Open, System::IO::FileAccess::Read);
	// 清除“正在使用”語句下的資源
	System::Details::DisposeGuard<1> __dispose_guard_1({ xpsStream });
	// ------------------------------------------

	try
	{
		// 從流中加載 XPS 文檔
		System::SharedPtr<XpsDocument> document = System::MakeObject<XpsDocument>(xpsStream, System::MakeObject<XpsLoadOptions>());
		// 或直接從文件加載 XPS 文檔。那麼就不需要 xpsStream 了。
		// XpsDocument 文檔 = new XpsDocument(inputFileName, new XpsLoadOptions());

		// 使用必要的參數初始化 JpegSaveOptions 對象。
		System::SharedPtr<JpegSaveOptions> options = [&] { 
			auto tmp_0 = System::MakeObject<JpegSaveOptions>(); 
			tmp_0->set_SmoothingMode(System::Drawing::Drawing2D::SmoothingMode::HighQuality); 
			tmp_0->set_Resolution(300); 
			tmp_0->set_PageNumbers(System::MakeArray<int32_t>({ 1, 2, 6 })); 
			return tmp_0; 
		}();

		// 為JPG格式創建渲染器
		System::SharedPtr<ImageDevice> device = System::MakeObject<ImageDevice>();

		document->Save(device, options);

		// 遍歷文檔分區(固定文檔,在 XPS 術語中)
		for (int32_t i = 0; i < device->get_Result()->get_Length(); i++)
		{
			for (int32_t j = 0; j < device->get_Result()[i]->get_Length(); j++)
			{
				// 初始化圖像輸出流
				{
					System::SharedPtr<System::IO::Stream> imageStream = System::IO::File::Open(System::IO::Path::GetDirectoryName(outputFileName) + u"\\" + System::IO::Path::GetFileNameWithoutExtension(outputFileName) + u"_" + (i + 1) + u"_" + (j + 1) + System::IO::Path::GetExtension(outputFileName), System::IO::FileMode::Create, System::IO::FileAccess::Write);
					// 清除“正在使用”語句下的資源
					System::Details::DisposeGuard<1> __dispose_guard_0({ imageStream });
					// ------------------------------------------

					try
					{
						imageStream->Write(device->get_Result()[i][j], 0, device->get_Result()[i][j]->get_Length());
					}
					catch (...)
					{
						__dispose_guard_0.SetCurrentException(std::current_exception());
					}
				}
			}
		}
	}
	catch (...)
	{
		__dispose_guard_1.SetCurrentException(std::current_exception());
	}
}
示例代碼生成的JPG圖片

示例代碼生成的JPG圖片

將 XPS/OXPS 文檔轉換為 PNG 格式

以下是將 XPS 和 OXPS 文檔轉換為 PNG 格式的步驟。

  • 使用源 XPS/OXPS 文件初始化流。
  • 使用 XPS/OXPS 流創建 XpsDocument 類的實例。
  • 創建 PngSaveOptions 類的實例。
  • 指定 SmoothingModeResolution 等選項。
  • 創建 ImageDevice 類的實例。
  • 使用 [XpsDocument->Save(System::SharedPtr) 將 XPS/OXPS 文檔保存到 ImageDevice設備,系統::SharedPtr選項)]22 方法。
  • 遍歷文檔分區。
  • 初始化輸出流並保存 PNG 圖像。

以下示例代碼顯示瞭如何使用 C++ 將 XPS/OXPS 文檔轉換為 PNG 格式。

// 輸入文件
System::String inputFileName = u"SourceDirectory\\sample.xps";
//輸出文件 
System::String outputFileName = u"OutputDirectory\\XPStoImage_out.png";
// 初始化 XPS 輸入流
{
	System::SharedPtr<System::IO::Stream> xpsStream = System::IO::File::Open(inputFileName, System::IO::FileMode::Open, System::IO::FileAccess::Read);
	// 清除“正在使用”語句下的資源
	System::Details::DisposeGuard<1> __dispose_guard_1({ xpsStream });
	// ------------------------------------------

	try
	{
		// 從流中加載 XPS 文檔
		System::SharedPtr<XpsDocument> document = System::MakeObject<XpsDocument>(xpsStream, System::MakeObject<XpsLoadOptions>());
		// 或直接從文件加載 XPS 文檔。那麼就不需要 xpsStream 了。
		// XpsDocument 文檔 = new XpsDocument(inputFileName, new XpsLoadOptions());

		// 使用必要的參數初始化 PngSaveOptions 對象。
		System::SharedPtr<PngSaveOptions> options = [&] { 
			auto tmp_0 = System::MakeObject<PngSaveOptions>(); 
			tmp_0->set_SmoothingMode(System::Drawing::Drawing2D::SmoothingMode::HighQuality); 
			tmp_0->set_Resolution(300); 
			tmp_0->set_PageNumbers(System::MakeArray<int32_t>({ 1, 2, 6 })); 
			return tmp_0; 
		}();

		// 為PNG格式創建渲染設備
		System::SharedPtr<ImageDevice> device = System::MakeObject<ImageDevice>();

		document->Save(device, options);

		// 遍歷文檔分區(固定文檔,在 XPS 術語中)
		for (int32_t i = 0; i < device->get_Result()->get_Length(); i++)
		{
			for (int32_t j = 0; j < device->get_Result()[i]->get_Length(); j++)
			{
				// 初始化圖像輸出流
				{
					System::SharedPtr<System::IO::Stream> imageStream = System::IO::File::Open(System::IO::Path::GetDirectoryName(outputFileName) + u"\\" + System::IO::Path::GetFileNameWithoutExtension(outputFileName) + u"_" + (i + 1) + u"_" + (j + 1) + System::IO::Path::GetExtension(outputFileName), System::IO::FileMode::Create, System::IO::FileAccess::Write);
					// 清除“正在使用”語句下的資源
					System::Details::DisposeGuard<1> __dispose_guard_0({ imageStream });
					// ------------------------------------------

					try
					{
						imageStream->Write(device->get_Result()[i][j], 0, device->get_Result()[i][j]->get_Length());
					}
					catch (...)
					{
						__dispose_guard_0.SetCurrentException(std::current_exception());
					}
				}
			}
		}
	}
	catch (...)
	{
		__dispose_guard_1.SetCurrentException(std::current_exception());
	}
}
示例代碼生成的PNG圖片

示例代碼生成的PNG圖片

獲得免費許可證

您可以通過申請 免費的臨時許可證 來試用沒有評估限制的 API。

結論

在本文中,您學習瞭如何使用 C++ 將 XPS 和 OXPS 文檔轉換為 JPG 和 PNG 圖像格式。此外,Aspose.Page for C++ API 提供了多種附加格式供您使用。您可以通過訪問 官方文檔 來詳細探索 API。如有任何疑問,請隨時通過我們的 免費支持論壇 與我們聯繫。

也可以看看