将 PDF 转换为图像格式

Aspose.PDF for C++ 使用几种方法将 PDF 转换为图像。一般来说,我们使用两种方法:使用 Device 方法进行转换和使用 SaveOption 进行转换。本节将向您展示如何使用这些方法之一将 PDF 文档转换为图像格式,如 BMP、JPEG、PNG、TIFF 和 SVG 格式。

库中有几个类允许您使用虚拟设备来转换图像。DocumentDevice 适用于转换整个文档,而 ImageDevice 适用于特定页面。

使用 DocumentDevice 类转换 PDF

Aspose.PDF for C++ 可以将 PDF 页面转换为 TIFF 图像。

The TiffDevice(基于 DocumentDevice)类允许您将 PDF 页面转换为 TIFF 图像。此类提供了一个名为 Process 的方法,该方法允许您将 PDF 文件中的所有页面转换为单个 TIFF 图像。

将 PDF 页面转换为一个 TIFF 图像

Aspose.PDF for C++ 解释如何将 PDF 文件中的所有页面转换为单个 TIFF 图像:

  1. 打开 Document 与 MakeObject。
  2. 创建 Resolution 对象。
  3. 创建 TIffSettings 对象。
  4. 使用指定的属性创建 Tiff device
  5. 转换特定页面并将图像保存到流。

以下代码片段显示了如何将所有 PDF 页面转换为单个 TIFF 图像。

void Convert_PDF_To_Images::ConvertPDFtoTIFF()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 用于路径名称的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 用于文件名的字符串
    String infilename("PageToTiff.pdf");
    String outfilename("PagesToTIFF_out.tif");

    // 打开文档
    auto document = MakeObject<Document>(_dataDir + infilename);

    auto imageStream = System::IO::File::OpenWrite(_dataDir + outfilename);

    // 创建 Resolution 对象
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

    // 创建 TiffSettings 对象
    auto tiffSettings = MakeObject<Aspose::Pdf::Devices::TiffSettings>();
    tiffSettings->set_Compression(Aspose::Pdf::Devices::CompressionType::None);
    tiffSettings->set_Depth(Aspose::Pdf::Devices::ColorDepth::Default);
    tiffSettings->set_Shape(Aspose::Pdf::Devices::ShapeType::Landscape);
    tiffSettings->set_SkipBlankPages(false);

    // 创建 TIFF 设备
    auto tiffDevice = MakeObject<Aspose::Pdf::Devices::TiffDevice>(resolution, tiffSettings);

    // 转换页面并将图像保存到流
    tiffDevice->Process(document, 1, 2, imageStream);
    std::clog << __func__ << ": Finish" << std::endl;
}

将单页转换为 TIFF 图像

Aspose.PDF for C++ 允许您将 PDF 文件中的特定页面转换为 TIFF 图像,使用 Process(..) 方法的重载版本,该版本接受页码作为转换参数。以下代码片段演示如何将 PDF 的第一页转换为 TIFF 格式。

void Convert_PDF_To_Images::ConvertPDFtoTiffSinglePage()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 路径名称的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 文件名的字符串
    String infilename("PageToTiff.pdf");
    String outfilename("PageToTiff_out.tif");

    // 打开文档
    auto document = MakeObject<Document>(_dataDir + infilename);

    auto imageStream = System::IO::File::OpenWrite(_dataDir + outfilename);

    // 创建 Resolution 对象
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

    // 创建 TIFF 设备
    auto tiffDevice = MakeObject<Aspose::Pdf::Devices::TiffDevice>(resolution);

    // 转换特定页面并将图像保存到流
    tiffDevice->Process(document, 1, 1, imageStream);
    std::clog << __func__ << ": Finish" << std::endl;
}

在转换过程中使用Bradley算法

Aspose.PDF for C++已经支持使用LZW压缩将PDF转换为TIF,然后可以使用AForge应用二值化。然而,有客户要求对于某些图像,他们需要使用Otsu获取阈值,因此他们也希望使用Bradley。

void Convert_PDF_To_Images::ConvertPDFtoTiffBradleyBinarization()
{
    // 路径名称的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 打开文档
    auto pdfDocument = MakeObject<Document>(_dataDir + u"PageToTIFF.pdf");

    String outputImageFile = _dataDir + u"resultant_out.tif";
    String outputBinImageFile = _dataDir + u"37116-bin_out.tif";

    // 创建Resolution对象
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

    // 创建TiffSettings对象
    auto tiffSettings = MakeObject<Aspose::Pdf::Devices::TiffSettings>();
    tiffSettings->set_Compression(Aspose::Pdf::Devices::CompressionType::LZW);
    tiffSettings->set_Depth(Aspose::Pdf::Devices::ColorDepth::Format1bpp);

    // 创建TIFF设备
    auto tiffDevice = MakeObject<Aspose::Pdf::Devices::TiffDevice>(resolution, tiffSettings);
    auto imageStream = System::IO::File::OpenWrite(_dataDir + outputImageFile);

    // 转换特定页面并将图像保存到流中
    tiffDevice->Process(pdfDocument, 1, 2, imageStream);

    imageStream->Close();

    auto inStream = System::IO::File::OpenRead(outputImageFile);
    auto outStream = System::IO::File::OpenWrite(outputBinImageFile);

    tiffDevice->BinarizeBradley(inStream, outStream, 0.1);
}

使用 ImageDevice 类转换 PDF

ImageDeviceBmpDeviceJpegDeviceGifDevicePngDeviceEmfDevice 的祖先。

  • BmpDevice 类允许您将 PDF 页面转换为BMP 图像。

  • EmfDevice 类允许您将 PDF 页面转换为EMF 图像。

  • JpegDevice 类允许您将 PDF 页面转换为 JPEG 图像。

  • PngDevice 类允许您将 PDF 页面转换为PNG 图像。

  • GifDevice 类允许您将 PDF 页面转换为GIF 图像。

让我们看看如何将 PDF 页面转换为图像。

BmpDevice 类提供了一个名为 Process 的方法,该方法允许您将 PDF 文件的特定页面转换为 BMP 图像格式。其他类具有相同的方法。因此,如果我们需要将 PDF 页面转换为图像,我们只需实例化所需的类。

以下代码片段展示了这种可能性:

void Convert_PDF_To_Images::ConvertPDFusingImageDevice()
{
    std::clog << __func__ << ": Start" << std::endl;

    // 路径名称字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 创建分辨率对象            
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300); // 300 dpi

    System::SmartPtr<Aspose::Pdf::Devices::ImageDevice>
    bmpDevice = MakeObject<Aspose::Pdf::Devices::BmpDevice>(resolution);
    System::SmartPtr<Aspose::Pdf::Devices::ImageDevice>
    jpegDevice = MakeObject<Aspose::Pdf::Devices::JpegDevice>(resolution);
    System::SmartPtr<Aspose::Pdf::Devices::ImageDevice>
    gifDevice = MakeObject<Aspose::Pdf::Devices::GifDevice>(resolution);
    System::SmartPtr<Aspose::Pdf::Devices::ImageDevice>
    pngDevice = MakeObject<Aspose::Pdf::Devices::PngDevice>(resolution);
    System::SmartPtr<Aspose::Pdf::Devices::ImageDevice>
    emfDevice = MakeObject<Aspose::Pdf::Devices::EmfDevice>(resolution);

    auto document = MakeObject<Document>(_dataDir + u"ConvertAllPagesToBmp.pdf");

    ConvertPDFtoImage(bmpDevice, u"bmp", document);
    ConvertPDFtoImage(jpegDevice, u"jpeg", document);
    ConvertPDFtoImage(gifDevice, u"gif", document);
    ConvertPDFtoImage(pngDevice, u"png", document);
    ConvertPDFtoImage(emfDevice, u"emf", document);

    std::clog << __func__ << ": Finish" << std::endl;

}

void Convert_PDF_To_Images::ConvertPDFtoImage(
 System::SmartPtr<Aspose::Pdf::Devices::ImageDevice> imageDevice,
 String ext, System::SmartPtr<Document> document)
{
    // 路径名称字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    for (int pageCount = 1; pageCount <= document->get_Pages()->get_Count(); pageCount++)
    {
    String outfilename = String::Format(u"{0}PageToBmp{1}_out.{2}",
    _dataDir, pageCount, ext);

    auto imageStream = System::IO::File::OpenWrite(outfilename);

    // 创建分辨率对象
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

    // 转换特定页面并将图像保存到流中
    imageDevice->Process(document->get_Pages()->idx_get(pageCount), imageStream);

    // 关闭流
    imageStream->Close();
    }
}

使用 SaveOptions 类转换PDF

本文的这一部分向您展示如何使用 C++ 和 SaveOptions 类将PDF转换为SVG

为了将 PDF 转换为 SVG,Aspose.PDF for CPP 提供了 Document 类的 Save 方法。您需要传递输出路径和枚举 SaveFormat::svg 给 Save 方法来将 PDF 转换为 SVG。以下代码片段展示了如何将 PDF 转换为 SVG:

本文教您如何使用 C++ 将 PDF 转换为 SVG

可缩放矢量图形 (SVG) 是一种基于 XML 的二维矢量图形文件格式的规范家族,可以是静态的,也可以是动态的(交互式或动画)。SVG 规范是一个开放标准,自 1999 年以来一直由万维网联盟 (W3C) 开发。

SVG 图像及其行为是在 XML 文本文件中定义的。 这意味着它们可以被搜索、索引、脚本化,并在需要时压缩。作为XML文件,SVG图像可以用任何文本编辑器创建和编辑,但使用诸如Inkscape之类的绘图程序创建它们通常更为方便。

Aspose.PDF for C++支持将SVG图像转换为PDF格式的功能,还提供将PDF文件转换为SVG格式的功能。为了实现这一要求,SvgSaveOptions类已被引入Aspose.PDF命名空间。实例化一个SvgSaveOptions对象并将其作为第二个参数传递给Save方法。

以下代码片段展示了使用C++将PDF文件转换为SVG格式的步骤。

void Convert_PDF_To_Images::ConvertPDFtoSvgSinglePage()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 路径名称的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 文件名称的字符串
    String infilename("PageToSvg.pdf");
    String outfilename("PageToSvg_out.svg");

    // 打开文档
    auto document = MakeObject<Document>(_dataDir + infilename);

    // 实例化SvgSaveOptions对象
    auto saveOptions = MakeObject<SvgSaveOptions>();
    // 不将SVG图像压缩到Zip存档
    saveOptions->CompressOutputToZipArchive = false;

    try {
    // 将输出保存为SVG文件
    document->Save(_dataDir + outfilename, saveOptions);
    }
    catch (Exception ex) {
    std::cerr << ex->get_Message();
    }

    std::clog << __func__ << ": Finish" << std::endl;
}