PostScript XPS به PDF و Image C++

در پست قبلی خود، به شما نشان دادم که چقدر آسان است که با استفاده از Aspose.Page برای C++ اسناد PostScript (PS/EPS) و XPS را به صورت برنامه‌نویسی ایجاد یا ویرایش کنید. در این مقاله، نحوه تبدیل اسناد PS/EPS یا XPS به فرمت‌های تصویری PDF یا شطرنجی از جمله PNG، JPEG، TIFF و BMP با استفاده از C++ را نشان خواهم داد. بقیه مقاله از بخش های زیر تشکیل شده است:

قبل از شروع، من فرض می کنم که شما Aspose.Page را برای C++ دانلود کرده اید و در پروژه C++ خود به آن ارجاع داده اید. با این حال، اگر این کار را نکرده‌اید، می‌توانید آن را از NuGet نصب کنید یا بسته کامل را به همراه یک برنامه کنسول plug and play از بخش Downloads دانلود کنید.

یک پست اسکریپت PS/EPS را به PDF در C++ تبدیل کنید

مراحل زیر برای تبدیل یک سند PostScript PS/EPS به PDF آمده است:

  • یک شی FileStream برای فایل PDF خروجی ایجاد کنید.
  • سند پست اسکریپت ورودی را در یک شی FileStream بارگیری کنید.
  • شیء PsDocument را با جریان ورودی ایجاد و مقداردهی اولیه کنید.
  • شیء PdfDevice را با جریان خروجی ایجاد و مقداردهی اولیه کنید.
  • سند را پردازش کرده و با استفاده از روش PsDocument->Save به صورت فایل PDF ذخیره کنید.

نمونه کد زیر نحوه تبدیل یک سند PostScript PS به PDF در C++ را نشان می دهد.

// جریان خروجی PDF را راه اندازی کنید
System::SharedPtr<System::IO::FileStream> pdfStream = System::MakeObject<System::IO::FileStream>(value + u"PStoPDF.pdf", System::IO::FileMode::Create, System::IO::FileAccess::Write);
// جریان ورودی PostScript را راه اندازی کنید
System::SharedPtr<System::IO::FileStream> psStream = System::MakeObject<System::IO::FileStream>(value + u"input.ps", System::IO::FileMode::Open, System::IO::FileAccess::Read);
System::SharedPtr<PsDocument> document = System::MakeObject<PsDocument>(psStream);

// اگر می خواهید فایل Postscript را با وجود خطاهای جزئی تبدیل کنید، این پرچم را تنظیم کنید
bool suppressErrors = true;

// شیء گزینه ها را با پارامترهای لازم مقداردهی کنید.
System::SharedPtr<PdfSaveOptions> options = System::MakeObject<PdfSaveOptions>(suppressErrors);
// اگر می خواهید پوشه خاصی را اضافه کنید که فونت ها در آن ذخیره می شوند. پوشه فونت های پیش فرض در سیستم عامل همیشه گنجانده شده است.
options->set_AdditionalFontsFolders(System::MakeArray<System::String>({ u"{FONT_FOLDER}" }));

// اندازه پیش فرض صفحه 595x842 است و تنظیم آن در PdfDevice الزامی نیست.
System::SharedPtr<Aspose::Page::EPS::Device::PdfDevice> device = System::MakeObject<Aspose::Page::EPS::Device::PdfDevice>(pdfStream);
// اما اگر نیاز به تعیین اندازه و فرمت تصویر دارید از خط زیر استفاده کنید:
// Aspose.Page.EPS.Device.PdfDevice دستگاه = جدید Aspose.Page.EPS.Device.PdfDevice(pdfStream, new System.Drawing.Size(595, 842));
{
	auto __finally_guard_0 = ::System::MakeScopeGuard([&psStream, &pdfStream]()
		{
			psStream->Close();
			pdfStream->Close();
		});

	try
	{
		document->Save(device, options);
	}
	catch (...)
	{
		throw;
	}
}

// بررسی خطاها
if (suppressErrors)
{
	//auto ex_enumerator = (System::DynamicCastEnumerableTo<PsConverterException> (options->get_Exceptions()))->GetEnumerator();
	auto ex_enumerator = (options->get_Exceptions())->GetEnumerator();
	decltype(ex_enumerator->get_Current()) ex;
	while (ex_enumerator->MoveNext() && (ex = ex_enumerator->get_Current(), true))
	{
		System::Console::WriteLine(ex->get_Message());
	}
}

یک پست اسکریپت PS/EPS را به تصویر در C++ تبدیل کنید

در زیر مراحل تبدیل PS/EPS به فرمت تصویر آمده است.

  • برای تنظیم فرمت تصویر خروجی، یعنی PNG، یک شی از ImageFormat ایجاد کنید.
  • سند پست اسکریپت ورودی را در یک شی FileStream بارگیری کنید.
  • شیء PsDocument را با جریان ورودی ایجاد و مقداردهی اولیه کنید.
  • یک شی از ImageDevice ایجاد کنید.
  • سند را پردازش کرده و با استفاده از روش PsDocument->Save آن را به عنوان تصویر ذخیره کنید.

نمونه کد زیر نحوه تبدیل PostScript PS/EPS را به تصویر در C++ نشان می دهد.

// جریان خروجی PDF را راه اندازی کنید
System::SharedPtr<System::Drawing::Imaging::ImageFormat> imageFormat = System::Drawing::Imaging::ImageFormat::get_Png();
// جریان ورودی PostScript را راه اندازی کنید
System::SharedPtr<System::IO::FileStream> psStream = System::MakeObject<System::IO::FileStream>(value + u"inputForImage.ps", System::IO::FileMode::Open, System::IO::FileAccess::Read);

System::SharedPtr<PsDocument> document = System::MakeObject<PsDocument>(psStream);

// اگر می خواهید فایل پست اسکریپت را با وجود خطاهای جزئی تبدیل کنید، این پرچم را تنظیم کنید
bool suppressErrors = true;

// شیء گزینه ها را با پارامترهای لازم مقداردهی کنید.
System::SharedPtr<ImageSaveOptions> options = System::MakeObject<ImageSaveOptions>(suppressErrors);

// اگر می خواهید پوشه خاصی را اضافه کنید که فونت ها در آن ذخیره می شوند. پوشه فونت های پیش فرض در سیستم عامل همیشه گنجانده شده است.
options->set_AdditionalFontsFolders(System::MakeArray<System::String>({ u"{FONT_FOLDER}" }));

// فرمت تصویر پیش فرض PNG است و تنظیم آن در ImageDevice الزامی نیست
// اندازه پیش فرض تصویر 595x842 است و تنظیم آن در ImageDevice الزامی نیست
System::SharedPtr<Aspose::Page::EPS::Device::ImageDevice> device = System::MakeObject<Aspose::Page::EPS::Device::ImageDevice>();
// اما اگر نیاز به تعیین اندازه و فرمت تصویر دارید، از سازنده با پارامترها استفاده کنید
//دستگاه ImageDevice = New ImageDevice(new System.Drawing.Size(595, 842)، System.Drawing.Imaging.ImageFormat.Jpeg);

{
	auto __finally_guard_0 = ::System::MakeScopeGuard([&psStream]()
		{
			psStream->Close();
		});

	try
	{
		document->Save(device, options);
	}
	catch (...)
	{
		throw;
	}
}

System::ArrayPtr<System::ArrayPtr<uint8_t>> imagesBytes = device->get_ImagesBytes();

int32_t i = 0;
{
	for (System::ArrayPtr<uint8_t> imageBytes : imagesBytes)
	{
		System::String imagePath = System::IO::Path::GetFullPath(value + System::String(u"out_image") + System::Convert::ToString(i) + u"." + System::ObjectExt::ToString(imageFormat).ToLower());
		{
			System::SharedPtr<System::IO::FileStream> fs = System::MakeObject<System::IO::FileStream>(imagePath, System::IO::FileMode::Create, System::IO::FileAccess::Write);
			// پاک کردن منابع تحت عبارت «استفاده»
			System::Details::DisposeGuard<1> __dispose_guard_1({ fs });
			try
			{
				fs->Write(imageBytes, 0, imageBytes->get_Length());
			}
			catch (...)
			{
				__dispose_guard_1.SetCurrentException(std::current_exception());
			}
		}
		i++;
	}
}

// بررسی خطاها
if (suppressErrors)
{
	//auto ex_enumerator = (System::DynamicCastEnumerableTo<PsConverterException> (options->get_Exceptions()))->GetEnumerator();
	//decltype(ex_enumerator->get_Current()) ex;
	//while (ex_enumerator->MoveNext() && (ex = ex_enumerator->get_Current()، true))
	//{
	//	سیستم::کنسول::WriteLine(ex->get_Message());
	//}
}

XPS را به PDF در C++ تبدیل کنید

مراحل زیر برای تبدیل یک سند XPS به PDF آمده است:

  • اشیاء FileStream را برای ورودی XPS و خروجی فایل‌های PDF ایجاد کنید.
  • جریان سند XPS را در یک شیء XpsDocument بارگیری کنید.
  • یک شی از کلاس PdfDevice ایجاد کنید و آن را با جریان خروجی مقداردهی اولیه کنید.
  • با استفاده از روش XpsDocument->Save سند XPS را به PDF تبدیل کنید.

نمونه کد زیر نحوه تبدیل سند XPS به PDF در C++ را نشان می دهد.

System::SharedPtr<System::IO::Stream> pdfStream = System::IO::File::Open(u"XPStoPDF.pdf", System::IO::FileMode::Create, System::IO::FileAccess::Write);
// پاک کردن منابع در بیانیه "استفاده".
System::Details::DisposeGuard<1> __dispose_guard_1({ pdfStream });

try {
	System::SharedPtr<System::IO::Stream> xpsStream = System::IO::File::Open(u"input.xps", System::IO::FileMode::Open, System::IO::FileAccess::Read);
	// پاک کردن منابع در بیانیه "استفاده".
	System::Details::DisposeGuard<1> __dispose_guard_0({ xpsStream });
	try
	{
		// سند XPS را از جریان بارگیری کنید
		System::SharedPtr<XpsDocument> document = System::MakeObject<XpsDocument>(xpsStream, System::MakeObject<XpsLoadOptions>());
		// یا سند XPS را مستقیماً از فایل بارگیری کنید. در این صورت نیازی به xpsStream نیست.
		// سند XpsDocument = XpsDocument جدید (inputFileName, new XpsLoadOptions());

		// شیء گزینه ها را با پارامترهای لازم مقداردهی کنید.
		System::SharedPtr<Aspose::Page::XPS::Presentation::Pdf::PdfSaveOptions> options = [&] { auto tmp_0 = System::MakeObject<Aspose::Page::XPS::Presentation::Pdf::PdfSaveOptions>(); tmp_0->set_JpegQualityLevel(100); tmp_0->set_ImageCompression(Aspose::Page::XPS::Presentation::Pdf::PdfImageCompression::Jpeg); tmp_0->set_TextCompression(Aspose::Page::XPS::Presentation::Pdf::PdfTextCompression::Flate); tmp_0->set_PageNumbers(System::MakeArray<int32_t>({ 1, 2, 6 })); return tmp_0; }();

		// ایجاد دستگاه رندر برای فرمت PDF
		System::SharedPtr<Aspose::Page::XPS::Presentation::Pdf::PdfDevice> device = System::MakeObject<Aspose::Page::XPS::Presentation::Pdf::PdfDevice>(pdfStream);

		document->Save(device, options);
	}
	catch (...)
	{
		__dispose_guard_0.SetCurrentException(std::current_exception());
	}
}
catch (...)
{
	__dispose_guard_1.SetCurrentException(std::current_exception());
}

XPS را به تصویر در C++ تبدیل کنید

مراحل زیر برای تبدیل یک سند XPS به فرمت های تصویر شطرنجی است:

  • سند ورودی XPS را در یک شی FileStream بارگیری کنید.
  • یک شی از XpsDocument ایجاد کنید و آن را با شی جریان ورودی مقداردهی اولیه کنید.
  • با ایجاد یک شی از کلاس PngSaveOptions گزینه های ذخیره را تنظیم کنید.
  • XPS را با استفاده از روش XpsDocument->Save به تصویر تبدیل کنید.

نمونه کد زیر نحوه تبدیل XPS به تصویر PNG در C++ را نشان می دهد.

// فایل ورودی
System::String inputFileName =  u"input.xps";
// فایل خروجی 
System::String outputFileName =  u"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 = XpsDocument جدید (inputFileName, new XpsLoadOptions());

		// شیء گزینه ها را با پارامترهای لازم مقداردهی کنید.
		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; }();

		// ایجاد دستگاه رندر برای فرمت PDF
		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());
	}
}

برای تبدیل سند XPS به BMP، TIFF و JPEG، لطفاً به مقاله زیر مراجعه کنید.

درباره Aspose.Page برای C++ بیشتر بدانید

در این مقاله نحوه تبدیل سند PS، EPS و XPS به PDF، PNG، JPEG، TIFF و BMP با استفاده از ++C را مشاهده کرده اید. می‌توانید با استفاده از مستندات و نمونه‌های کد منبع درباره Aspose.Page برای C++ اطلاعات بیشتری کسب کنید.

همچنین ببینید