2010-11-08 60 views
9

Me gustaría agregar una página a un documento PDF existente que contenga texto simple.Agregar una página al documento PDF con iTextSharp

He probado el siguiente código que he encontrado en internet, pero hasta ahora no he conseguido que funcione:

PdfReader reader = new PdfReader("1.pdf"); 
Document document = new Document(reader.GetPageSize(1)); 
PdfCopy copier = new PdfCopy(doc, new FileStream("2.pdf", FileMode.Create)); 

for (int pageCounter = 1; pageCounter < reader.NumberOfPages + 1; pageCounter++) 
{ 
    //byte[] page = reader.GetPageContent(pageCounter); 
    copier.AddPage(copier.GetImportedPage(reader, pageCounter)); 
} 

copier.NewPage(); 
copier.Add(new Paragraph("This is added text")); 

document.Close(); 
reader.Close(); 

Por favor, hágamelo saber cómo hacer esto correcto?

Respuesta

19
private static string AddCommentsToFile(string fileName, string userComments) 
    { 
     string outputFileName = Path.GetTempFileName(); 
     //Step 1: Create a Docuement-Object 
     Document document = new Document(); 
     try 
     { 
      //Step 2: we create a writer that listens to the document 
      PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFileName, FileMode.Create)); 

      //Step 3: Open the document 
      document.Open(); 

      PdfContentByte cb = writer.DirectContent; 

      //The current file path 
      string filename = fileName; 

      // we create a reader for the document 
      PdfReader reader = new PdfReader(filename); 

      for (int pageNumber = 1; pageNumber < reader.NumberOfPages + 1; pageNumber++) 
      { 
       document.SetPageSize(reader.GetPageSizeWithRotation(1)); 
       document.NewPage(); 

       //Insert to Destination on the first page 
       if (pageNumber == 1) 
       { 
        Chunk fileRef = new Chunk(" "); 
        fileRef.SetLocalDestination(filename); 
        document.Add(fileRef); 
       } 

       PdfImportedPage page = writer.GetImportedPage(reader, pageNumber); 
       int rotation = reader.GetPageRotation(pageNumber); 
       if (rotation == 90 || rotation == 270) 
       { 
        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pageNumber).Height); 
       } 
       else 
       { 
        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
       } 
      } 

      // Add a new page to the pdf file 
      document.NewPage(); 

      Paragraph paragraph = new Paragraph(); 
      Font titleFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA 
             , 15 
             , iTextSharp.text.Font.BOLD 
             , BaseColor.BLACK 
       ); 
      Chunk titleChunk = new Chunk("Comments", titleFont); 
      paragraph.Add(titleChunk); 
      document.Add(paragraph); 

      paragraph = new Paragraph(); 
      Font textFont = new Font(iTextSharp.text.Font.FontFamily.HELVETICA 
            , 12 
            , iTextSharp.text.Font.NORMAL 
            , BaseColor.BLACK 
       ); 
      Chunk textChunk = new Chunk(userComments, textFont); 
      paragraph.Add(textChunk); 

      document.Add(paragraph); 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     finally 
     { 
      document.Close(); 
     } 
     return outputFileName; 
    } 
+0

Hola, mientras estoy usando "document.NewPage();" método para crear una nueva página, se superpondrá mi contenido con el encabezado. Entonces, ¿cómo evitar la superposición con el encabezado al agregar una nueva página? Por favor ayuda. Gracias – Herin

2

No puede usar PdfCopy para agregar páginas. Tendrá que crear un nuevo pdf y agregarlo si necesita hacer eso (PdfCopy es el mejor para combinar pdf).

He añadido un ejemplo de cómo agregar un pie de página también:

PdfReader reader = new PdfReader("1.pdf"); 
Document document = new Document(reader.GetPageSize(1)); 
PdfCopy copier = new PdfCopy(doc, new FileStream("2.pdf", FileMode.Create)); 

for (int pageCounter = 1; pageCounter < reader.NumberOfPages + 1; pageCounter++) 
{ 
    // get page 
    PdfImportedPage page = copier.GetImportedPage(reader, pageCounter) 
    // add content to imported page 
    PageStamp ps = pdfCopy.CreatePageStamp(page); 
    PdfContentByte cb = ps.GetOverContent(); 
    // set color 
    cb.SetColorFill(BaseColor.BLACK); 
    // get font 
    BaseFont baseFont = BaseFont.CreateFont(string.Format("{0}\\Fonts\\arialuni.ttf", Environment.GetEnvironmentVariable("windir"), BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
    cb.SetFontAndSize(baseFont, 12); 
    cb.BeginText(); 
    cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, printLangString, 100f, 40f, 0f); 
    cb.EndText(); 
    // Accept changes      
    ps.AlterContents(); 
    // add page 
    copier.AddPage(page); 
} 

using (var ms = new MemoryStream()) 
{ 
    Document doc = new Document(PageSize.A4); 
    PdfWriter writer = PdfWriter.GetInstance(doc, ms); 
    writer.CloseStream = false; 
    doc.Open(); 
    doc.NewPage(); 
    doc.Add(new Paragraph(error, fontRed)); 
    doc.Close(); 
    writer.Close(); 
    ms.Seek(0, SeekOrigin.Begin); 
    PdfReader rd = new PdfReader(ms); 
    for (int pageCounter = 1; pageCounter < reader.NumberOfPages + 1; pageCounter++) 
    { 
     copier.AddPage(copier.GetImportedPage(rd, pageCounter)); 
    } 
    rd.Close(); 
} 

document.Close(); 
reader.Close(); 
3

Pruebe este código: Se añade una nueva página con PDF existente y añadir texto de la marca a la última página.

private string AddWaterMarkPageToFile(string fileName, string userComments) 
     { 
      string outputFileName = Path.GetTempFileName() + ".pdf"; 
      //Step 1: Create a Docuement-Object 
      Document document = new Document(); 
      try 
      { 
       //Step 2: we create a writer that listens to the document 
       PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFileName, FileMode.Create)); 

       //Step 3: Open the document 
       document.Open(); 

       PdfContentByte cb = writer.DirectContent; 

       //The current file path 
       string filename = fileName; 

       // we create a reader for the document 
       PdfReader reader = new PdfReader(filename); 

       for (int pageNumber = 1; pageNumber < reader.NumberOfPages + 1; pageNumber++) 
       { 
        document.SetPageSize(reader.GetPageSizeWithRotation(1)); 
        document.NewPage(); 

        //Insert to Destination on the first page 
        if (pageNumber == 1) 
        { 
         Chunk fileRef = new Chunk(" "); 
         fileRef.SetLocalDestination(filename); 
         document.Add(fileRef); 
        } 

        PdfImportedPage page = writer.GetImportedPage(reader, pageNumber); 
        int rotation = reader.GetPageRotation(pageNumber); 
        if (rotation == 90 || rotation == 270) 
        { 
         cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pageNumber).Height); 
        } 
        else 
        { 
         cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
        } 
       } 

       // Add a new page to the pdf file 
       document.NewPage(); 

       float fontSize = 80; 
       float xPosition = iTextSharp.text.PageSize.A4.Width/2; 
       float yPosition = (iTextSharp.text.PageSize.A4.Height - 140f)/2; 
       float angle = 45; 

       PdfContentByte under = writer.DirectContentUnder; 
       BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED); 
       under.BeginText(); 
       under.SetColorFill(BaseColor.LIGHT_GRAY); 
       under.SetFontAndSize(baseFont, fontSize); 
       under.ShowTextAligned(PdfContentByte.ALIGN_CENTER, userComments, xPosition, yPosition, angle); 
       under.EndText(); 

      } 
      catch (Exception e) 
      { 
       throw e; 
      } 
      finally 
      { 
       document.Close(); 
      } 
      return outputFileName; 
     } 
Cuestiones relacionadas