Converter PDF para formatos de Imagens

Aspose.PDF for C++ usa algumas abordagens para converter PDF em imagem. De modo geral, usamos duas abordagens: conversão usando a abordagem Device e conversão usando SaveOption. Esta seção mostrará como converter documentos PDF em formatos de imagem como BMP, JPEG, PNG, TIFF e SVG usando uma dessas abordagens.

Existem várias classes na biblioteca que permitem usar um dispositivo virtual para transformar imagens. DocumentDevice é orientado para a conversão de todo o documento, mas ImageDevice - para uma página específica.

Converter PDF usando a classe DocumentDevice

Aspose.PDF for C++ torna possível converter Páginas PDF em imagens TIFF.

O TiffDevice (baseado em DocumentDevice) permite que você converta páginas de PDF em imagens TIFF. Esta classe fornece um método chamado Process que permite converter todas as páginas em um arquivo PDF em uma única imagem TIFF.

Converter Páginas de PDF em Uma Imagem TIFF

Aspose.PDF para С++ explica como converter todas as páginas em um arquivo PDF em uma única imagem TIFF:

  1. Abra Documento com MakeObject.
  2. Crie um objeto Resolution.
  3. Crie um objeto TIffSettings.
  4. Crie um dispositivo Tiff com atributos especificados.
  5. Converta uma página específica e salve a imagem em um stream.

O trecho de código a seguir mostra como converter todas as páginas do PDF em uma única imagem TIFF.

void Convert_PDF_To_Images::ConvertPDFtoTIFF()
{
    std::clog << __func__ << ": Start" << std::endl;
    // String para nome do caminho
    String _dataDir("C:\\Samples\\Conversion\\");

    // String para nome do arquivo
    String infilename("PageToTiff.pdf");
    String outfilename("PagesToTIFF_out.tif");

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

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

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

    // Crie um 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);

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

    // Converta as páginas e salve a imagem no stream
    tiffDevice->Process(document, 1, 2, imageStream);
    std::clog << __func__ << ": Finish" << std::endl;
}

Converter uma Página para Imagem TIFF

Aspose.PDF para C++ permite converter uma página específica em um arquivo PDF para uma imagem TIFF, utilizando uma versão sobrecarregada do método Process(..) que recebe um número de página como argumento para a conversão. O trecho de código a seguir mostra como converter a primeira página de um PDF para o formato TIFF.

void Convert_PDF_To_Images::ConvertPDFtoTiffSinglePage()
{
    std::clog << __func__ << ": Start" << std::endl;
    // String para o nome do caminho
    String _dataDir("C:\\Samples\\Conversion\\");

    // String para o nome do arquivo
    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);

    // Criar objeto de Resolução
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

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

    // Converter uma página específica e salvar a imagem no fluxo
    tiffDevice->Process(document, 1, 1, imageStream);
    std::clog << __func__ << ": Finish" << std::endl;
}

Use o algoritmo Bradley durante a conversão

Aspose.PDF para C++ tem suportado o recurso de converter PDF para TIF usando compressão LZW e, em seguida, com o uso de AForge, a binarização pode ser aplicada. No entanto, um dos clientes solicitou que para algumas imagens, eles precisam obter o limiar usando Otsu, então eles também gostariam de usar Bradley.

void Convert_PDF_To_Images::ConvertPDFtoTiffBradleyBinarization()
{
    // String para o nome do caminho
    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";

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

    // Criar 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);

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

    // Converter uma página específica e salvar a imagem no stream
    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);
}

Convert PDF usando a classe ImageDevice

ImageDevice é o antecessor de BmpDevice, JpegDevice, GifDevice, PngDevice e EmfDevice.

  • A classe BmpDevice permite converter páginas de PDF para imagens BMP.

  • A classe EmfDevice permite converter páginas de PDF para imagens EMF.

  • A classe JpegDevice permite converter páginas de PDF para imagens JPEG.

  • A classe PngDevice permite converter páginas de PDF para imagens PNG.

  • A classe GifDevice permite converter páginas de PDF para imagens GIF.

Vamos dar uma olhada em como converter uma página PDF em uma imagem.

A classe BmpDevice fornece um método chamado Process que permite converter uma página específica do arquivo PDF para o formato de imagem BMP. As outras classes têm o mesmo método. Portanto, se precisarmos converter uma página PDF em uma imagem, basta instanciar a classe necessária.

O trecho de código a seguir mostra essa possibilidade:

void Convert_PDF_To_Images::ConvertPDFusingImageDevice()
{
    std::clog << __func__ << ": Início" << std::endl;

    // String para nome do caminho
    String _dataDir("C:\\Samples\\Conversion\\");

    // Criar objeto de Resolução            
    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__ << ": Fim" << std::endl;

}

void Convert_PDF_To_Images::ConvertPDFtoImage(
 System::SmartPtr<Aspose::Pdf::Devices::ImageDevice> imageDevice,
 String ext, System::SmartPtr<Document> document)
{
    // String para nome do caminho
    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);

    // Criar objeto de Resolução
    auto resolution = MakeObject<Aspose::Pdf::Devices::Resolution>(300);

    // Converter uma página específica e salvar a imagem no stream
    imageDevice->Process(document->get_Pages()->idx_get(pageCount), imageStream);

    // Fechar stream
    imageStream->Close();
    }
}

Converter PDF usando a classe SaveOptions

Esta parte do artigo mostra como converter PDF para SVG usando C++ e a classe SaveOptions.

Para converter PDF para SVG, o Aspose.PDF para CPP oferece o método Save da classe Document. Você precisa passar o caminho de saída e o enum SaveFormat:: svg para o método Save para converter PDF para SVG. O trecho de código a seguir mostra como converter PDF para SVG:

Este artigo ensina como converter PDF para SVG usando C++.

Gráficos Vetoriais Escaláveis (SVG) é uma família de especificações de um formato de arquivo baseado em XML para gráficos vetoriais bidimensionais, tanto estáticos quanto dinâmicos (interativos ou animados). A especificação SVG é um padrão aberto que está em desenvolvimento pelo World Wide Web Consortium (W3C) desde 1999.

As imagens SVG e seus comportamentos são definidos em arquivos de texto XML. Isso significa que eles podem ser pesquisados, indexados, scriptados e, se necessário, comprimidos. Como arquivos XML, imagens SVG podem ser criadas e editadas com qualquer editor de texto, mas geralmente é mais conveniente criá-las com programas de desenho, como o Inkscape.

Aspose.PDF para C++ suporta o recurso de converter imagem SVG para o formato PDF e também oferece a capacidade de converter arquivos PDF para o formato SVG. Para realizar essa exigência, a classe SvgSaveOptions foi introduzida no namespace Aspose.PDF. Instancie um objeto de SvgSaveOptions e passe-o como um segundo argumento para o método Save.

O seguinte trecho de código mostra as etapas para converter um arquivo PDF para o formato SVG com C++.

void Convert_PDF_To_Images::ConvertPDFtoSvgSinglePage()
{
    std::clog << __func__ << ": Start" << std::endl;
    // String para nome do caminho
    String _dataDir("C:\\Samples\\Conversion\\");

    // String para nome do arquivo
    String infilename("PageToSvg.pdf");
    String outfilename("PageToSvg_out.svg");

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

    // Instanciar um objeto de SvgSaveOptions
    auto saveOptions = MakeObject<SvgSaveOptions>();
    // Não comprimir imagem SVG para arquivo Zip
    saveOptions->CompressOutputToZipArchive = false;

    try {
    // Salvar a saída em arquivos SVG
    document->Save(_dataDir + outfilename, saveOptions);
    }
    catch (Exception ex) {
    std::cerr << ex->get_Message();
    }

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