Convertir PDF a formatos de Imágenes

Aspose.PDF for C++ utiliza pocos enfoques para convertir PDF a imagen. Generalmente hablando, usamos dos enfoques: conversión usando el enfoque Device y conversión usando SaveOption. Esta sección te mostrará cómo convertir documentos PDF a formatos de imagen como BMP, JPEG, PNG, TIFF, y SVG usando uno de esos enfoques.

Hay varias clases en la biblioteca que permiten usar un dispositivo virtual para transformar imágenes. DocumentDevice está orientado a la conversión de todo el documento, pero ImageDevice - para una página en particular.

Convertir PDF usando la clase DocumentDevice

Aspose.PDF for C++ hace posible convertir Páginas PDF a imágenes TIFF.

El TiffDevice (basado en DocumentDevice) permite convertir páginas de PDF a imágenes TIFF. Esta clase proporciona un método llamado Process que te permite convertir todas las páginas en un archivo PDF a una sola imagen TIFF.

Convertir Páginas de PDF a Una Imagen TIFF

Aspose.PDF para C++ explica cómo convertir todas las páginas de un archivo PDF a una sola imagen TIFF:

  1. Abrir Documento con MakeObject.
  2. Crear objeto Resolution.
  3. Crear objeto TIffSettings.
  4. Crear dispositivo Tiff con atributos especificados.
  5. Convertir una página en particular y guardar la imagen en el flujo.

El siguiente fragmento de código muestra cómo convertir todas las páginas de un PDF en una sola imagen TIFF.

void Convert_PDF_To_Images::ConvertPDFtoTIFF()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Cadena para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Cadena para el nombre del archivo
    String infilename("PageToTiff.pdf");
    String outfilename("PagesToTIFF_out.tif");

    // Abrir documento
    auto document = MakeObject<Document>(_dataDir + infilename);

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

    // Crear objeto Resolution
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

    // Crear objeto 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);

    // Crear dispositivo TIFF
    auto tiffDevice = MakeObject<Aspose::Pdf::Devices::TiffDevice>(resolution, tiffSettings);

    // Convertir páginas y guardar la imagen en el flujo
    tiffDevice->Process(document, 1, 2, imageStream);
    std::clog << __func__ << ": Finish" << std::endl;
}

Convertir Una Página a Imagen TIFF

Aspose.PDF para C++ le permite convertir una página particular en un archivo PDF a una imagen TIFF, use una versión sobrecargada del método Process(..) que toma un número de página como argumento para la conversión. El siguiente fragmento de código muestra cómo convertir la primera página de un PDF al formato TIFF.

void Convert_PDF_To_Images::ConvertPDFtoTiffSinglePage()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Cadena para nombre de ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Cadena para nombre de archivo
    String infilename("PageToTiff.pdf");
    String outfilename("PageToTiff_out.tif");

    // Abrir documento
    auto document = MakeObject<Document>(_dataDir + infilename);

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

    // Crear objeto de resolución
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

    // Crear dispositivo TIFF
    auto tiffDevice = MakeObject<Aspose::Pdf::Devices::TiffDevice>(resolution);

    // Convertir una página particular y guardar la imagen en el stream
    tiffDevice->Process(document, 1, 1, imageStream);
    std::clog << __func__ << ": Finish" << std::endl;
}

Usar el algoritmo de Bradley durante la conversión

Aspose.PDF para C++ ha estado apoyando la función para convertir PDF a TIF usando compresión LZW y luego con el uso de AForge, se puede aplicar Binarización. Sin embargo, uno de los clientes solicitó que para algunas imágenes, necesitan obtener el Umbral usando Otsu, por lo que también les gustaría usar Bradley.

void Convert_PDF_To_Images::ConvertPDFtoTiffBradleyBinarization()
{
    // Cadena para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Abrir documento
    auto pdfDocument = MakeObject<Document>(_dataDir + u"PageToTIFF.pdf");

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

    // Crear objeto Resolution 
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

    // Crear objeto TiffSettings
    auto tiffSettings = MakeObject<Aspose::Pdf::Devices::TiffSettings>();
    tiffSettings->set_Compression(Aspose::Pdf::Devices::CompressionType::LZW);
    tiffSettings->set_Depth(Aspose::Pdf::Devices::ColorDepth::Format1bpp);

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

    // Convertir una página en particular y guardar la imagen en el flujo
    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);
}

Convertir PDF usando la clase ImageDevice

ImageDevice es el ancestro de BmpDevice, JpegDevice, GifDevice, PngDevice y EmfDevice.

  • La clase BmpDevice te permite convertir páginas de PDF a imágenes BMP.

  • La clase EmfDevice te permite convertir páginas de PDF a imágenes EMF.

  • La clase JpegDevice te permite convertir páginas de PDF a imágenes JPEG.

  • La clase PngDevice te permite convertir páginas de PDF a imágenes PNG.

  • La clase GifDevice te permite convertir páginas de PDF a imágenes GIF.

Echemos un vistazo a cómo convertir una página PDF en una imagen.

La clase BmpDevice proporciona un método llamado Process que te permite convertir una página particular del archivo PDF al formato de imagen BMP. Las otras clases tienen el mismo método. Entonces, si necesitamos convertir una página PDF en una imagen, simplemente instanciamos la clase requerida.

El siguiente fragmento de código muestra esta posibilidad:

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

    // Cadena para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Crear objeto de resolución            
    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)
{
    // Cadena para el nombre de la ruta
    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);

    // Crear objeto de resolución
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

    // Convertir una página particular y guardar la imagen en el flujo
    imageDevice->Process(document->get_Pages()->idx_get(pageCount), imageStream);

    // Cerrar flujo
    imageStream->Close();
    }
}

Convertir PDF usando la clase SaveOptions

Esta parte del artículo te muestra cómo convertir PDF a SVG usando C++ y la clase SaveOptions.

Para convertir PDF a SVG, Aspose.PDF para CPP ofrece el método Save de la clase Document. Necesita pasar la ruta de salida y el enum SaveFormat:: svg al método Save para convertir PDF a SVG. El siguiente fragmento de código muestra cómo convertir PDF a SVG:

Este artículo te enseña cómo convertir PDF a SVG usando C++.

Gráficos Vectoriales Escalables (SVG) es una familia de especificaciones de un formato de archivo basado en XML para gráficos vectoriales bidimensionales, tanto estáticos como dinámicos (interactivos o animados). La especificación SVG es un estándar abierto que ha estado en desarrollo por el World Wide Web Consortium (W3C) desde 1999.

Las imágenes SVG y sus comportamientos se definen en archivos de texto XML. Esto significa que pueden ser buscados, indexados, programados y, si es necesario, comprimidos. Como archivos XML, las imágenes SVG pueden ser creadas y editadas con cualquier editor de texto, pero a menudo es más conveniente crearlas con programas de dibujo como Inkscape.

Aspose.PDF para C++ admite la función de convertir imágenes SVG a formato PDF y también ofrece la capacidad de convertir archivos PDF a formato SVG. Para cumplir con este requisito, la clase SvgSaveOptions ha sido introducida en el espacio de nombres Aspose.PDF. Instanciar un objeto de SvgSaveOptions y pasarlo como un segundo argumento al método Save.

El siguiente fragmento de código muestra los pasos para convertir un archivo PDF a formato SVG con C++.

void Convert_PDF_To_Images::ConvertPDFtoSvgSinglePage()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Cadena para el nombre del camino
    String _dataDir("C:\\Samples\\Conversion\\");

    // Cadena para el nombre del archivo
    String infilename("PageToSvg.pdf");
    String outfilename("PageToSvg_out.svg");

    // Abrir documento
    auto document = MakeObject<Document>(_dataDir + infilename);

    // Instanciar un objeto de SvgSaveOptions
    auto saveOptions = MakeObject<SvgSaveOptions>();
    // No comprimir la imagen SVG en un archivo Zip
    saveOptions->CompressOutputToZipArchive = false;

    try {
    // Guardar la salida en archivos SVG
    document->Save(_dataDir + outfilename, saveOptions);
    }
    catch (Exception ex) {
    std::cerr << ex->get_Message();
    }

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