Converta XPS, OXPS para JPG ou PNG usando C++

Os documentos XPS e OXPS são semelhantes aos arquivos PDF e definem o layout, a aparência e as informações de impressão de um documento. Pode haver cenários em que você precise converter documentos XPS e OXPS para os formatos de imagem JPG e PNG. Para isso, este artigo ensinará como converter documentos XPS e OXPS para o formato de imagem JPG e PNG usando C++.

API C++ para converter arquivos XPS, OXPS para o formato JPG ou PNG

Aspose.Page for C++ é uma biblioteca C++ para renderização e manipulação de arquivos XPS e PostScript. Permite criar, ler e atualizar documentos XPS. Além disso, a API suporta a conversão de documentos XPS e OXPS para os formatos de imagem JPG e PNG. Você pode instalar a API por meio do NuGet ou baixá-la diretamente da seção downloads.

PM> Install-Package Aspose.Page.Cpp

Converter documentos XPS/OXPS para o formato JPG

A seguir estão as etapas para converter documentos XPS e OXPS para o formato JPG.

O código de exemplo a seguir mostra como converter documentos XPS/OXPS para o formato JPG usando C++.

// Arquivo de entrada
System::String inputFileName = u"SourceDirectory\\sample.xps";
//Arquivo de saída 
System::String outputFileName = u"OutputDirectory\\XPStoImage_out.jpeg";
// Inicializar o fluxo de entrada XPS
{
	System::SharedPtr<System::IO::Stream> xpsStream = System::IO::File::Open(inputFileName, System::IO::FileMode::Open, System::IO::FileAccess::Read);
	// Limpando recursos sob a instrução 'usando'
	System::Details::DisposeGuard<1> __dispose_guard_1({ xpsStream });
	// ------------------------------------------

	try
	{
		// Carregar documento XPS do stream
		System::SharedPtr<XpsDocument> document = System::MakeObject<XpsDocument>(xpsStream, System::MakeObject<XpsLoadOptions>());
		// ou carregue o documento XPS diretamente do arquivo. Nenhum xpsStream é necessário então.
		// Documento XpsDocument = new XpsDocument(inputFileName, new XpsLoadOptions());

		// Inicialize o objeto JpegSaveOptions com os parâmetros necessários.
		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; 
		}();

		// Criar dispositivo de renderização para o formato JPG
		System::SharedPtr<ImageDevice> device = System::MakeObject<ImageDevice>();

		document->Save(device, options);

		// Iterar através de partições de documentos (documentos fixos, em termos 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++)
			{
				// Inicializar o fluxo de saída de imagem
				{
					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);
					// Limpando recursos sob a instrução 'usando'
					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());
	}
}
Imagem JPG gerada pelo código de amostra

Imagem JPG gerada pelo código de amostra

Converter documentos XPS/OXPS para o formato PNG

A seguir estão as etapas para converter documentos XPS e OXPS para o formato PNG.

O código de exemplo a seguir mostra como converter documentos XPS/OXPS para o formato PNG usando C++.

// Arquivo de entrada
System::String inputFileName = u"SourceDirectory\\sample.xps";
//Arquivo de saída 
System::String outputFileName = u"OutputDirectory\\XPStoImage_out.png";
// Inicializar o fluxo de entrada XPS
{
	System::SharedPtr<System::IO::Stream> xpsStream = System::IO::File::Open(inputFileName, System::IO::FileMode::Open, System::IO::FileAccess::Read);
	// Limpando recursos sob a instrução 'usando'
	System::Details::DisposeGuard<1> __dispose_guard_1({ xpsStream });
	// ------------------------------------------

	try
	{
		// Carregar documento XPS do stream
		System::SharedPtr<XpsDocument> document = System::MakeObject<XpsDocument>(xpsStream, System::MakeObject<XpsLoadOptions>());
		// ou carregue o documento XPS diretamente do arquivo. Nenhum xpsStream é necessário então.
		// Documento XpsDocument = new XpsDocument(inputFileName, new XpsLoadOptions());

		// Inicialize o objeto PngSaveOptions com os parâmetros necessários.
		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; 
		}();

		// Criar dispositivo de renderização para o formato PNG
		System::SharedPtr<ImageDevice> device = System::MakeObject<ImageDevice>();

		document->Save(device, options);

		// Iterar através de partições de documentos (documentos fixos, em termos 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++)
			{
				// Inicializar o fluxo de saída de imagem
				{
					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);
					// Limpando recursos sob a instrução 'usando'
					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());
	}
}
Imagem PNG gerada pelo código de amostra

Imagem PNG gerada pelo código de amostra

Obtenha uma licença gratuita

Você pode experimentar a API sem limitações de avaliação solicitando uma licença temporária gratuita.

Conclusão

Neste artigo, você aprendeu como converter documentos XPS e OXPS em formatos de imagem JPG e PNG usando C++. Além disso, Aspose.Page for C++ API fornece vários formatos adicionais para você usar. Você pode explorar a API em detalhes visitando a documentação oficial. Em caso de dúvidas, sinta-se à vontade para entrar em contato conosco em nosso fórum de suporte gratuito.

Veja também