iTextSharp comment faire pour tourner/changer la page du paysage au portrait

j'utilise iTextSharp pour fusionner plusieurs fichiers PDF en un seul fichier Pdf. J'ai trouvé un exemple de code ou deux sur le web à la façon d'accomplir cette tâche.

ils fonctionnent tous, sans problèmes apparents, car je suis capable de fusionner plusieurs fichiers PDF en un seul PDF.

la question que j'ai est que je voudrais que toutes les pages soient en PORTRAIT, car certains des fichiers PDF ont des pages en paysage et je voudrais qu'ils soient tournés vers PORTRAIT. Cela ne me dérange pas qu'ils soient à l'envers ou de côté, mais ils doivent tous être en portrait.

en Regardant le code des sections dans les exemples ci:

page = writer.GetImportedPage(reader, i);
rotation = reader.GetPageRotation(i);

renvoie toujours la valeur de rotation de la page comme 0 (zéro) ainsi la section de code

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

ne se fait jamais exécuter (si c'est ce qui est supposé faire, tourner la page).

donc, basé sur le code dans le lien de l'échantillon du 1er code page = writer.GetImportedPage(reader, i) comment je m'y prendrais pour changer la mise en page de l' page de Paysage à Portrait, avant que je l'ajouter à la nouvelle fusionné document PDF avec <!--5?

PS. Pour déterminer si une page est un paysage ou un portrait, j'utilise la pièce suivante de code obtenu à partir de SO (adapté pour l'exemple de code ci-dessus):

float pageXYRatio = page.Width / page.Height;
if (XYRatio > 1f)
{
    //page is landscape
}
else
{
    //page is portrait
}

Toute aide serait appréciée.

Merci

16
demandé sur kuujinbo 2011-03-17 23:47:47

4 réponses

comme vous l'avez trouvé, vous ne pouvez pas toujours compter sur PdfReader.GetPageRotation ().

par exemple, si l'objet Document est créé comme ceci:

Document doc = new Document( new Rectangle(792, 612) );

PdfReader.GetPageRotation()toujours return 0.

vraiment une façon simplifiée de décider si une page est un portrait ou un paysage est de comparer la largeur et la hauteur de chaque page de chaque PDF que vous combinez. si la largeur est plus grande que la hauteur d'un individu page, Ajouter une entrée de dictionnaire à cette page et définir explicitement sa rotation. quelque chose comme ce qui suit gestionnaire HTTP:

<%@ WebHandler Language='C#' Class='LandscapeToPortrait' %>
using System;
using System.IO;
using System.Web;
using iTextSharp.text;
using iTextSharp.text.pdf;

public class LandscapeToPortrait : IHttpHandler {
  public void ProcessRequest (HttpContext context) {
    HttpResponse Response = context.Response;
    Response.ContentType = "application/pdf";
    PdfReader[] readers = {
      new PdfReader(CreateReaderBytes(false)),
      new PdfReader(CreateReaderBytes(true))
    };

    using (Document doc = new Document()) {
      using (PdfCopy copy = new PdfCopy(doc, Response.OutputStream)) {
        doc.Open();
        foreach (PdfReader reader in readers) {
          int n = reader.NumberOfPages;
          for (int page = 0; page < n;) {
            ++page;
            float width = reader.GetPageSize(page).Width;
            float height = reader.GetPageSize(page).Height;
            if (width > height) {
              PdfDictionary pageDict = reader.GetPageN(page);
              pageDict.Put(PdfName.ROTATE, new PdfNumber(90));
            }
            copy.AddPage(copy.GetImportedPage(reader, page));
          }
        }        
      }
    }
  }
  public bool IsReusable {
    get { return false; }
  }
  public byte[] CreateReaderBytes(bool isLandscape) {
    using (MemoryStream ms = new MemoryStream()) {
      Rectangle r = isLandscape
        ? new Rectangle(792, 612)
        : PageSize.LETTER
      ;
      using (Document doc = new Document(r)) {
        PdfWriter.GetInstance(doc, ms);
        doc.Open();
        for (int i = 0; i < 5; ++i) {
          doc.Add(new Phrase("hello world"));
          doc.NewPage();
        }
      }
      return ms.ToArray();
    }
  }
}

regardez Pdfpression class. et voici un bon threadliste de diffusion expliquant comment iText [Sharp] stocke la rotation des pages dans chaque page.

et bien sûr, vous pourriez envisager d'investir dans livre.

6
répondu kuujinbo 2011-03-18 08:36:26

j'ai utilisé quelque chose comme ça.

cb.PdfDocument.NewPage();
PdfImportedPage page1 = writer.GetImportedPage(reader, i);

Rectangle psize = reader.GetPageSizeWithRotation(i);
switch (psize.Rotation)
{
    case 0:
        cb.AddTemplate(page1, 1f, 0, 0, 1f, 0, 0);
        break;
    case 90:
        cb.AddTemplate(page1, 0, -1f, 1f, 0, 0, psize.Height);
        break;
    case 180:
        cb.AddTemplate(page1, -1f, 0, 0, -1f, 0, 0);
        break;
    case 270:
        cb.AddTemplate(page1, 0, 1.0F, -1.0F, 0, psize.Width, 0);
        break;
    default:
        break;
}
11
répondu Guilherme de Jesus Santos 2015-05-08 12:49:25

avec cet exemple http://alex.buayacorp.com/merge-pdf-files-with-itext-and-net.html J'ai ajouté la ligne suivante:

newDocument.SetPageSize(documents[0].GetPageSizeWithRotation(1));*

newDocument = new Document();
PdfWriter pdfWriter = PdfWriter.GetInstance(newDocument, outputStream);

// START PAGE ORIENTATION FROM 1st Document 1st Page
newDocument.SetPageSize(documents[0].GetPageSizeWithRotation(1));
// END PAGE ORIENTATION
newDocument.Open();
PdfContentByte pdfContentByte = pdfWriter.DirectContent;

mes PDF sont construits à partir de SSRS et ils ont la même taille, donc j'utilise la 1ère page du 1er document (je suppose)

3
répondu avalla 2017-04-04 08:00:00
// Instantiate the imported page as an Image

const float HALF_INCH = 36f;
// currentPosY is used to keep track of the current Y position.

PdfImportedPage page = writer.GetImportedPage(reader, j);
float scale = ((currentPosY - HALF_INCH - 10f) / page.Height);
Image imgP = Image.GetInstance(page);

if (page.Width > page.Height) { // Auto-detect landscape
 scale = ((currentPosY - HALF_INCH - 10f) / page.Width);
 imgP.RotationDegrees = 90f;   // could be 270f
}

imgP.ScalePercent(scale * 100f);
imgP.SetAbsolutePosition(HALF_INCH, HALF_INCH);
imgP.CompressionLevel = 9;
imgP.Border = Image.BOX;
imgP.BorderWidth = 1f;

document.Add(imgP);
0
répondu user1945972 2013-01-03 15:40:03