Trong bài đăng trước của tôi, tôi đã chỉ cho bạn thấy việc tạo hoặc chỉnh sửa các tài liệu PostScript (PS/EPS) và XPS theo cách lập trình bằng Aspose.Page for C++ dễ dàng như thế nào. Trong bài viết này, tôi sẽ trình bày cách chuyển đổi tài liệu PS/EPS hoặc XPS sang PDF hoặc định dạng hình ảnh raster bao gồm PNG, JPEG, TIFF và BMP bằng C++. Phần còn lại của bài viết bao gồm các phần sau:
- Chuyển đổi PostScript PS/EPS thành PDF trong C++
- Chuyển đổi PostScript PS/EPS thành Hình ảnh trong C++
- Chuyển đổi XPS sang PDF trong C++
- Chuyển đổi XPS thành hình ảnh trong C++
Trước khi bắt đầu, tôi giả định rằng bạn đã tải xuống Aspose.Page for C++ và tham chiếu nó trong dự án C++ của bạn. Tuy nhiên, nếu chưa có, bạn có thể cài đặt nó từ NuGet hoặc tải xuống gói hoàn chỉnh cùng với ứng dụng bảng điều khiển plug and play từ phần Tải xuống.
Chuyển đổi PostScript PS/EPS thành PDF trong C++
Sau đây là các bước để chuyển đổi tài liệu PostScript PS/EPS sang PDF:
- Tạo đối tượng FileStream cho tệp PDF đầu ra.
- Tải tài liệu PostScript đầu vào trong đối tượng FileStream.
- Tạo và khởi tạo đối tượng PsDocument với luồng đầu vào.
- Tạo và khởi tạo đối tượng PdfDevice với luồng đầu ra.
- Xử lý tài liệu và lưu dưới dạng tệp PDF bằng phương pháp PsDocument->Save.
Mẫu mã sau đây cho biết cách chuyển đổi tài liệu PostScript PS thành PDF trong C++.
// Khởi tạo luồng đầu ra PDF
System::SharedPtr<System::IO::FileStream> pdfStream = System::MakeObject<System::IO::FileStream>(value + u"PStoPDF.pdf", System::IO::FileMode::Create, System::IO::FileAccess::Write);
// Khởi tạo luồng đầu vào 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);
// Nếu bạn muốn chuyển đổi tệp Postscript mặc dù có lỗi nhỏ, hãy đặt cờ này
bool suppressErrors = true;
// Khởi tạo đối tượng tùy chọn với các tham số cần thiết.
System::SharedPtr<PdfSaveOptions> options = System::MakeObject<PdfSaveOptions>(suppressErrors);
// Nếu bạn muốn thêm thư mục đặc biệt nơi lưu trữ phông chữ. Thư mục phông chữ mặc định trong hệ điều hành luôn được bao gồm.
options->set_AdditionalFontsFolders(System::MakeArray<System::String>({ u"{FONT_FOLDER}" }));
// Kích thước trang mặc định là 595x842 và không bắt buộc phải đặt nó trong PdfDevice
System::SharedPtr<Aspose::Page::EPS::Device::PdfDevice> device = System::MakeObject<Aspose::Page::EPS::Device::PdfDevice>(pdfStream);
// Nhưng nếu bạn cần chỉ định kích thước và định dạng hình ảnh, hãy sử dụng dòng sau:
// Thiết bị Aspose.Page.EPS.Device.PdfDevice = new 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;
}
}
// Xem lại lỗi
if (suppressErrors)
{
//auto ex_enumerator = (Hệ thống::DynamicCastEnumerableTo<PsConverterException> (tùy chọn->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());
}
}
Chuyển đổi PostScript PS/EPS thành Hình ảnh trong C++
Sau đây là các bước để chuyển đổi PS/EPS sang định dạng hình ảnh.
- Tạo một đối tượng ImageFormat để đặt định dạng của hình ảnh đầu ra, tức là PNG.
- Tải tài liệu PostScript đầu vào trong đối tượng FileStream.
- Tạo và khởi tạo đối tượng PsDocument với luồng đầu vào.
- Tạo một đối tượng của ImageDevice.
- Xử lý tài liệu và lưu dưới dạng hình ảnh bằng phương pháp PsDocument->Save.
Mẫu mã sau đây cho biết cách chuyển đổi PostScript PS/EPS thành hình ảnh trong C++.
// Khởi tạo luồng đầu ra PDF
System::SharedPtr<System::Drawing::Imaging::ImageFormat> imageFormat = System::Drawing::Imaging::ImageFormat::get_Png();
// Khởi tạo luồng đầu vào 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);
// Nếu bạn muốn chuyển đổi tệp PostScript mặc dù có lỗi nhỏ, hãy đặt cờ này
bool suppressErrors = true;
// Khởi tạo đối tượng tùy chọn với các tham số cần thiết.
System::SharedPtr<ImageSaveOptions> options = System::MakeObject<ImageSaveOptions>(suppressErrors);
// Nếu bạn muốn thêm thư mục đặc biệt nơi lưu trữ phông chữ. Thư mục phông chữ mặc định trong hệ điều hành luôn được bao gồm.
options->set_AdditionalFontsFolders(System::MakeArray<System::String>({ u"{FONT_FOLDER}" }));
// Định dạng hình ảnh mặc định là PNG và không bắt buộc phải đặt nó trong ImageDevice
// Kích thước hình ảnh mặc định là 595x842 và không bắt buộc phải đặt nó trong ImageDevice
System::SharedPtr<Aspose::Page::EPS::Device::ImageDevice> device = System::MakeObject<Aspose::Page::EPS::Device::ImageDevice>();
// Nhưng nếu bạn cần chỉ định kích thước và định dạng hình ảnh, hãy sử dụng hàm tạo có tham số
//Thiết bị ImageDevice = ImageDevice mới(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);
// Xóa tài nguyên trong câu lệnh 'đang sử dụng'
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++;
}
}
// Xem lại lỗi
if (suppressErrors)
{
//auto ex_enumerator = (Hệ thống::DynamicCastEnumerableTo<PsConverterException> (tùy chọn->get_Exceptions()))->GetEnumerator();
//decltype(ex_enumerator->get_Current()) cũ;
//trong khi (ex_enumerator->MoveNext() && (ex = ex_enumerator->get_Current(), true))
//{
// Hệ thống::Bảng điều khiển::WriteLine(ex->get_Message());
//}
}
Chuyển đổi XPS sang PDF trong C++
Sau đây là các bước để chuyển đổi tài liệu XPS sang PDF:
- Tạo các đối tượng FileStream cho các tệp XPS đầu vào và đầu ra PDF.
- Tải luồng tài liệu XPS vào đối tượng XpsDocument.
- Tạo một đối tượng của lớp PdfDevice và khởi tạo nó với luồng đầu ra.
- Chuyển đổi tài liệu XPS sang PDF bằng phương pháp XpsDocument->Save.
Mẫu mã sau đây cho biết cách chuyển đổi tài liệu XPS sang PDF trong C++.
System::SharedPtr<System::IO::Stream> pdfStream = System::IO::File::Open(u"XPStoPDF.pdf", System::IO::FileMode::Create, System::IO::FileAccess::Write);
// Xóa tài nguyên trong câu lệnh 'đang sử dụng'
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);
// Xóa tài nguyên trong câu lệnh 'đang sử dụng'
System::Details::DisposeGuard<1> __dispose_guard_0({ xpsStream });
try
{
// Tải tài liệu XPS dưới dạng luồng
System::SharedPtr<XpsDocument> document = System::MakeObject<XpsDocument>(xpsStream, System::MakeObject<XpsLoadOptions>());
// hoặc tải tài liệu XPS trực tiếp từ tệp. Khi đó không cần xpsStream.
// Tài liệu XpsDocument = new XpsDocument(inputFileName, new XpsLoadOptions());
// Khởi tạo đối tượng tùy chọn với các tham số cần thiết.
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; }();
// Tạo thiết bị kết xuất cho định dạng 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());
}
Chuyển đổi XPS thành hình ảnh trong C++
Sau đây là các bước để chuyển đổi tài liệu XPS sang định dạng hình ảnh raster:
- Tải tài liệu XPS đầu vào vào đối tượng FileStream.
- Tạo đối tượng XpsDocument và khởi tạo nó với đối tượng luồng đầu vào.
- Đặt các tùy chọn lưu bằng cách tạo một đối tượng thuộc lớp PngSaveOptions.
- Chuyển đổi XPS sang hình ảnh bằng phương pháp XpsDocument->Save.
Mẫu mã sau đây cho biết cách chuyển đổi hình ảnh XPS sang PNG trong C++.
// tập tin đầu vào
System::String inputFileName = u"input.xps";
// tập tin đầu ra
System::String outputFileName = u"XPStoImage_out.png";
// Khởi tạo luồng đầu vào XPS
{
System::SharedPtr<System::IO::Stream> xpsStream = System::IO::File::Open(inputFileName, System::IO::FileMode::Open, System::IO::FileAccess::Read);
// Xóa tài nguyên trong câu lệnh 'đang sử dụng'
System::Details::DisposeGuard<1> __dispose_guard_1({ xpsStream });
try
{
// Tải tài liệu XPS dưới dạng luồng
System::SharedPtr<XpsDocument> document = System::MakeObject<XpsDocument>(xpsStream, System::MakeObject<XpsLoadOptions>());
// hoặc tải tài liệu XPS trực tiếp từ tệp. Khi đó không cần xpsStream.
// Tài liệu XpsDocument = new XpsDocument(inputFileName, new XpsLoadOptions());
// Khởi tạo đối tượng tùy chọn với các tham số cần thiết.
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; }();
// Tạo thiết bị kết xuất cho định dạng PDF
System::SharedPtr<ImageDevice> device = System::MakeObject<ImageDevice>();
document->Save(device, options);
// Lặp lại qua các phân vùng tài liệu (tài liệu cố định, theo thuật ngữ 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++)
{
// Khởi tạo luồng đầu ra hình ảnh
{
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);
// Xóa tài nguyên trong câu lệnh 'đang sử dụng'
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());
}
}
Để chuyển đổi tài liệu XPS sang BMP, TIFF và JPEG, vui lòng truy cập bài viết sau.
Tìm hiểu thêm về Aspose.Page for C++
Trong bài viết này, bạn đã biết cách chuyển đổi tài liệu PS, EPS và XPS sang PDF, PNG, JPEG, TIFF và BMP bằng C++. Bạn có thể tìm hiểu thêm về Aspose.Page for C++ bằng cách sử dụng tài liệu và ví dụ mã nguồn.