2010-08-26 3 views
9

Я использую следующую функцию, чтобы разделить PDF на два.Вращение PDF в C# с помощью iTextSharp

Несмотря на то, что он разделяет pdf-файл, содержимое отображается вверх ногами. Как повернуть его на 180 градусов.

Пожалуйста, помогите. ниже приведен код для того же

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(); 
     } 
    } 

ответ

2

Я пробовал ваш код, и он отлично работал для меня; разделенные страницы сохраняли свою первоначальную ориентацию.

Обходной способ может заключаться в том, чтобы явно вращать ваши страницы на 180 градусов.

Заменить:

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

С:

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

Если вызов inputPdf.GetPageRotation(i) возвращается сети 180, то вы можете справиться с этим в if заявлении, которое следует (с помощью моего предложил код для вращения == 180).

6

Вы должны попробовать это. Это сработало для меня:

   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); 
       } 
17

Я нашел, что приведенные выше ответы не вращаются правильно для всех 4 основных оборотов.

Ниже мой код для правильной обработки 0, 90, 180 и 270. Это было проверено с помощью PDF, повернутого в каждом из этих направлений.

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)); 
} 
+2

Могу ли я использовать его с таким же кодом –

+2

+1: Очевидно, что «случай 0:» может быть сокращен до 'writer.DirectContent.AddTemplate (importedPage, 0, 0);' Ваш ответ только помог мне решить проблему вращать существующий PDF на дополнительные 90, 180 или 270 градусов :) Было бы здорово, если бы эти параметры были где-то задокументированы, поскольку я понимаю, что они являются матричным преобразованием (?). Большое спасибо. –

+0

Существует дополнительная проблема с вращением уже повернутых страниц. Я использовал ваш ответ и добавил один с дополнительными размерами страниц/поворотными манипуляциями, чтобы разрешить вращение уже повернутых страниц. –

0

Небольшое изменение в приведенный выше код старый код

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

новый код

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

Это позволит устранить проблему с вращением 270 градусов

+0

выше код отлично работает с iTextSharp v 5.5. – Matthieu

2

@TimS "ответ был очень близко к совершенству, и при условии, что правильные параметры равны AddTemplate, но мне нужно было сделать несколько дополнений, чтобы обеспечить 90, 180, 270 вращения PDF, где страницы уже вращения 0, 90, 180 или 270: передаются

Предполагая, что параметр RotateFlipType rotateFlipType функции, чтобы указать поворота (удобно перечислимую от вызова GDI + RotateFlip):

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; 
    } 
} 

Надеюсь, это поможет кому-то еще, желая исправить вращение входящих PDF-файлов. Принял меня 2 дня, чтобы улучшить его.

+1

Ваш код работает как шарм. Большое спасибо. Ты спас свой день. – RolandDeschain

+0

@RolandDeschain: Рад, что это помогло :) –

Смежные вопросы