16

I am using the below function to split the pdf into two.

Though it is spliting the pdf, the content is appearing upside down. How do I rotate it by 180 degrees.

Please help. below is the code for the same

private static void ExtractPages(string inputFile, string outputFile,
  int start, int end)
     {
         // get input document
         PdfReader inputPdf = new PdfReader(inputFile);

         // retrieve the total number of pages
         int pageCount = inputPdf.NumberOfPages;

         if (end < start || end > pageCount)
         {
             end = pageCount;
         }

         // load the input document
         Document inputDoc =
             new Document(inputPdf.GetPageSizeWithRotation(1));

         // create the filestream
         using (FileStream fs = new FileStream(outputFile, FileMode.Create))
         {
             // create the output writer
             PdfWriter outputWriter = PdfWriter.GetInstance(inputDoc, fs);
             inputDoc.Open();

             PdfContentByte cb1 = outputWriter.DirectContent;

             // copy pages from input to output document
             for (int i = start; i <= end; i++)
             {
                 inputDoc.SetPageSize(inputPdf.GetPageSizeWithRotation(1));
                 inputDoc.NewPage();

                 PdfImportedPage page =
                     outputWriter.GetImportedPage(inputPdf, i);
                 int rotation = inputPdf.GetPageRotation(i);


                 if (rotation == 90 || rotation == 270)
                 {
                     cb1.AddTemplate(page, 0, -1f, 1f, 0, 0,
                         inputPdf.GetPageSizeWithRotation(i).Height);

                 }
                 else
                 {
                     cb1.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                 }

             }

             inputDoc.Close();
         }
     }
acadia
  • 2,301
  • 10
  • 40
  • 57

5 Answers5

30

I have found the above answers do not rotate correctly for all 4 of the main rotations.

Below is my code to handle 0, 90, 180 and 270 correctly. This has been tested with a PDF rotated in each of these directions.

var pageRotation = reader.GetPageRotation(currentPageIndex);
var pageWidth = reader.GetPageSizeWithRotation(currentPageIndex).Width;
var pageHeight = reader.GetPageSizeWithRotation(currentPageIndex).Height;
switch (pageRotation)
{
    case 0:
        writer.DirectContent.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0);
        break;

    case 90:
        writer.DirectContent.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, pageHeight);
        break;

    case 180:
        writer.DirectContent.AddTemplate(importedPage, -1f, 0, 0, -1f, pageWidth, pageHeight);
        break;

    case 270:
        writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageWidth, 0);
        break;

    default:
        throw new InvalidOperationException(string.Format("Unexpected page rotation: [{0}].", pageRotation));
}
TimS
  • 2,085
  • 20
  • 31
  • 3
    +1: Apparently `case 0:` can be shortened to `writer.DirectContent.AddTemplate(importedPage, 0, 0);` Your answer has just helped me solve a problem of rotating an existing PDF by an additional 90, 180 or 270 degrees :) It would be great if those parameters were documented somewhere, as I gather they are a matrix transform(?). Many thanks. – iCollect.it Ltd Oct 28 '14 at 09:51
  • 1
    There is an additional issue with rotation of already rotated pages. I used your answer and added one with the additional page size/rotation manipulations to allow for rotation of already rotated pages. – iCollect.it Ltd Oct 28 '14 at 12:06
6

@TimS' answer was very close to perfect, and provided the correct parameters to AddTemplate, but I needed to make a few additions to allow for 90, 180, 270 rotation of a PDF where the pages already have rotation of 0, 90, 180 or 270:

Assuming a parameter of RotateFlipType rotateFlipType is passed to the function to specify the rotation (the handy enum from the GDI+ RotateFlip call):

iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
iTextSharp.text.pdf.PdfImportedPage page;
int rotation;
int i = 0;
while (i < pageCount)
{
    i++;
    var pageSize = reader.GetPageSizeWithRotation(i);

    // Pull in the page from the reader
    page = writer.GetImportedPage(reader, i);

    // Get current page rotation in degrees
    rotation = pageSize.Rotation;

    // Default to the current page size
    iTextSharp.text.Rectangle newPageSize = null;

    // Apply our additional requested rotation (switch height and width as required)
    switch (rotateFlipType)
    {
        case RotateFlipType.RotateNoneFlipNone:
            newPageSize = new iTextSharp.text.Rectangle(pageSize);
            break;
        case RotateFlipType.Rotate90FlipNone:
            rotation += 90;
            newPageSize = new iTextSharp.text.Rectangle(pageSize.Height, pageSize.Width, rotation);
            break;
        case RotateFlipType.Rotate180FlipNone:
            rotation += 180;
            newPageSize = new iTextSharp.text.Rectangle(pageSize.Width, pageSize.Height, rotation);
            break;
        case RotateFlipType.Rotate270FlipNone:
            rotation += 270;
            newPageSize = new iTextSharp.text.Rectangle(pageSize.Height, pageSize.Width, rotation);
            break;
    }

    // Cap rotation into the 0-359 range for subsequent check
    rotation %= 360;

    document.SetPageSize(newPageSize);
    document.NewPage();

    // based on the rotation write out the page dimensions
    switch (rotation)
    {
        case 0:
            cb.AddTemplate(page, 0, 0);
            break;
        case 90:
            cb.AddTemplate(page, 0, -1f, 1f, 0, 0, newPageSize.Height);
            break;
        case 180:
            cb.AddTemplate(page, -1f, 0, 0, -1f, newPageSize.Width, newPageSize.Height);
            break;
        case 270:
            cb.AddTemplate(page, 0, 1f, -1f, 0, newPageSize.Width, 0);
            break;
        default:
            throw new System.Exception(string.Format("Unexpected rotation of {0} degrees", rotation));
            break;
    }
}

Hopefully this will help someone else wishing to correct the rotation of incoming PDFs. Took me 2 days to perfect it.

iCollect.it Ltd
  • 92,391
  • 25
  • 181
  • 202
6

You should try this. It worked for me:

                if (rotation == 90 || rotation == 270)
                {

                    if (rotation == 90)
                    {
                        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pagenumber).Height);
                    }
                    if (rotation == 270)
                    {
                        cb.AddTemplate(page, 0, 1.0F, -1.0F, 0, reader.GetPageSizeWithRotation(pagenumber).Width, 0);

                    }

                }
                else
                {
                    cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                }
Jorge
  • 61
  • 1
  • 2
4

I tried your code and it worked fine for me; split pages kept their original orientation.

A workaround might be to explicitly rotate your pages 180 degrees.

Replace:

cb1.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 

With:

cb1.AddTemplate(page, -1f, 0, 0, -1f, 
                inputPdf.GetPageSizeWithRotation(i).Width, 
                inputPdf.GetPageSizeWithRotation(i).Height);

If your call to inputPdf.GetPageRotation(i) returns 180 then you can handle this in the if statement that follows (using my suggested code for rotation == 180).

Jay Riggs
  • 53,046
  • 9
  • 139
  • 151
0

A little change in above code old code

case 270:
    writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageWidth, 0);

new code

case 270:
    writer.DirectContent.AddTemplate(importedPage, 0, 1f, -1f, 0, pageHeight, 0);

This will fix the issue with 270 degree rotation

Eli Gassert
  • 9,745
  • 3
  • 30
  • 39