Rotar Páginas de PDF Usando C++

Este tema describe cómo actualizar o cambiar la orientación de las páginas en un archivo PDF existente de manera programática con C++.

Cambiar Orientación de Página

Aspose.PDF para C++ te permite cambiar la orientación de la página de horizontal a vertical y viceversa. Para cambiar la orientación de la página, establece el MediaBox de la página usando el siguiente fragmento de código. También puedes cambiar la orientación de la página estableciendo el ángulo de rotación usando el método Rotate().

void ChangePageOrientation() {

    String _dataDir("C:\\Samples\\");
    String inputFileName("ChangeOrientation.pdf");
    String outputFileName("ChangeOrientation_out.pdf");
    // Abrir documento
    auto document = MakeObject<Document>(_dataDir + inputFileName);

    for (auto page : document->get_Pages())
    {

        auto r = page->get_MediaBox();
        double newHeight = r->get_Width();
        double newWidth = r->get_Height();
        double newLLX = r->get_LLX();

        // Debemos mover la página hacia arriba para compensar el cambio de tamaño de la página
        // (el borde inferior de la página es 0,0 y la información generalmente se coloca desde la
        // parte superior de la página. Por eso movemos el borde inferior hacia arriba en la diferencia entre
        // la altura antigua y la nueva.

        double newLLY = r->get_LLY() + (r->get_Height() - newHeight);
        page->set_MediaBox(MakeObject<Rectangle>(newLLX, newLLY, newLLX + newWidth, newLLY + newHeight));
        // A veces también necesitamos establecer el CropBox (si estaba establecido en el archivo original)
        page->set_CropBox(MakeObject<Rectangle>(newLLX, newLLY, newLLX + newWidth, newLLY + newHeight));

        // Estableciendo el ángulo de rotación de la página
        page->set_Rotate(Rotation::on90);
    }

    // Guardar archivo de salida
    document->Save(_dataDir + outputFileName);
}

Ajustar el Contenido de la Página a la Nueva Orientación de la Página

Tenga en cuenta que al usar el fragmento de código anterior, parte del contenido del documento podría cortarse porque la altura de la página se reduce. Para evitar esto, aumente el ancho proporcionalmente y deje la altura intacta. Ejemplo de cálculos:

void FittingPageContentToNewPageOrientation()
{
    String _dataDir("C:\\Samples\\");
    String inputFileName("ChangeOrientation.pdf");
    String outputFileName("ChangeOrientation_out.pdf");
    // Open document
    auto document = MakeObject<Document>(_dataDir + inputFileName);

    for (auto page : document->get_Pages())
    {
        auto r = page->get_MediaBox();
        // New height the same
        double newHeight = r->get_Height();
        // New width is expanded proportionally to make orientation landscape
        // (we assume that previous orientation is portrait)
        double newWidth = r->get_Height() * r->get_Height() / r->get_Width();

        // ...

    }
}

Además del enfoque anterior, considere usar la fachada PdfPageEditor, que puede aplicar zoom al contenido de la página.

void ZoomPageContent()
{

    String _dataDir("C:\\Samples\\");
    String inputFileName("ZoomToPageContents.pdf");
    String outputFileName("ZoomToPageContents_out.pdf");

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

    // Obtener región rectangular de la primera página del PDF
    auto rect = document->get_Pages()->idx_get(1)->get_Rect();

    // Instanciar instancia de PdfPageEditor
    auto ppe = MakeObject<Aspose::Pdf::Facades::PdfPageEditor>();
    // Vincular PDF de origen
    ppe->BindPdf(_dataDir + inputFileName);
    // Establecer coeficiente de zoom
    ppe->set_Zoom ((float)(rect->get_Width() / rect->get_Height()));
    // Actualizar tamaño de página
    ppe->set_PageSize(MakeObject<PageSize>((float)rect->get_Height(), (float)rect->get_Width()));

    // Guardar archivo de salida
    document->Save(_dataDir + outputFileName);
}