2010-10-21 16 views

risposta

84

ho trovato un modo per farlo (non so se è il migliore, ma funziona)

string oldFile = "oldFile.pdf"; 
string newFile = "newFile.pdf"; 

// open the reader 
PdfReader reader = new PdfReader(oldFile); 
Rectangle size = reader.GetPageSizeWithRotation(1); 
Document document = new Document(size); 

// open the writer 
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write); 
PdfWriter writer = PdfWriter.GetInstance(document, fs); 
document.Open(); 

// the pdf content 
PdfContentByte cb = writer.DirectContent; 

// select the font properties 
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252,BaseFont.NOT_EMBEDDED); 
cb.SetColorFill(BaseColor.DARK_GRAY); 
cb.SetFontAndSize(bf, 8); 

// write the text in the pdf content 
cb.BeginText(); 
string text = "Some random blablablabla..."; 
// put the alignment and coordinates here 
cb.ShowTextAligned(1, text, 520, 640, 0); 
cb.EndText(); 
cb.BeginText(); 
text = "Other random blabla..."; 
// put the alignment and coordinates here 
cb.ShowTextAligned(2, text, 100, 200, 0); 
cb.EndText(); 

// create the new page and add it to the pdf 
PdfImportedPage page = writer.GetImportedPage(reader, 1); 
cb.AddTemplate(page, 0, 0); 

// close the streams and voilá the file should be changed :) 
document.Close(); 
fs.Close(); 
writer.Close(); 
reader.Close(); 

Spero che questo può essere utile per qualcuno =) (e post qui eventuali errori)

+0

Si salva il mio duro lavoro, grazie – dev

+6

Alcuni blablablabla casuale - come musica per le mie orecchie! – Pinch

+2

my oldfile.pdf contiene 2 pagine, ma newfile.pdf contiene solo la prima pagina di oldfile.pdf. Allora, dov'è la seconda pagina ?? – Nurlan

10

Questo ha funzionato per me e include l'utilizzo di OutputStream:

PdfReader reader = new PdfReader(new RandomAccessFileOrArray(Request.MapPath("Template.pdf")), null); 
    Rectangle size = reader.GetPageSizeWithRotation(1); 
    using (Stream outStream = Response.OutputStream) 
    { 
     Document document = new Document(size); 
     PdfWriter writer = PdfWriter.GetInstance(document, outStream); 

     document.Open(); 
     try 
     { 
      PdfContentByte cb = writer.DirectContent; 

      cb.BeginText(); 
      try 
      { 
       cb.SetFontAndSize(BaseFont.CreateFont(), 12); 
       cb.SetTextMatrix(110, 110); 
       cb.ShowText("aaa"); 
      } 
      finally 
      { 
       cb.EndText(); 
      } 

       PdfImportedPage page = writer.GetImportedPage(reader, 1); 
       cb.AddTemplate(page, 0, 0); 

     } 
     finally 
     { 
      document.Close(); 
      writer.Close(); 
      reader.Close(); 
     } 
    } 
+1

vecchio file pdf contiene 2 pagine, ma il nuovo pdf generato contiene solo la prima pagina del vecchio file pdf. Allora, dov'è la seconda pagina ?? – Nurlan

+0

La parte di AddTemplate dovrebbe occuparsi della rotazione, se ce n'è una nel documento di origine - vedere [qui] (http://stackoverflow.com/a/13943059/444469) – Matthieu

+0

In quale libreria sono "Richiesta" e "Risposta "situato? – tmighty

13

Inoltre alle ottime risposte di cui sopra, il seguente mostra come aggiungere testo a ogni pagina di un documento di più pagine:

using (var reader = new PdfReader(@"C:\Input.pdf")) 
{ 
    using (var fileStream = new FileStream(@"C:\Output.pdf", FileMode.Create, FileAccess.Write)) 
    { 
     var document = new Document(reader.GetPageSizeWithRotation(1)); 
     var writer = PdfWriter.GetInstance(document, fileStream); 

     document.Open(); 

     for (var i = 1; i <= reader.NumberOfPages; i++) 
     { 
      document.NewPage(); 

      var baseFont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
      var importedPage = writer.GetImportedPage(reader, i); 

      var contentByte = writer.DirectContent; 
      contentByte.BeginText(); 
      contentByte.SetFontAndSize(baseFont, 12); 

      var multiLineString = "Hello,\r\nWorld!".Split('\n'); 

      foreach (var line in multiLineString) 
      { 
      contentByte.ShowTextAligned(PdfContentByte.ALIGN_LEFT, line, 200, 200, 0); 
      } 

      contentByte.EndText(); 
      contentByte.AddTemplate(importedPage, 0, 0); 
     } 

     document.Close(); 
     writer.Close(); 
    } 
} 
+0

La parte di AddTemplate dovrebbe occuparsi della rotazione, se ce n'è una nel documento di origine: vedere [qui] (http://stackoverflow.com/a/13943059/444469) – Matthieu

+1

Che tipo di riferimenti stai facendo per quelli? – Si8

+1

questo in realtà gestisce più pagine –

5

Ecco un metodo che utilizza matrice e coordinate assolute hanno mostrato nei diversi clienti PDF (Adobe , Foxit e così via)

public static void AddTextToPdf(string inputPdfPath, string outputPdfPath, string textToAdd, Point point) 
    { 
     //variables 
     string pathin = inputPdfPath; 
     string pathout = outputPdfPath; 

     //create PdfReader object to read from the existing document 
     using (PdfReader reader = new PdfReader(pathin)) 
     //create PdfStamper object to write to get the pages from reader 
     using (PdfStamper stamper = new PdfStamper(reader, new FileStream(pathout, FileMode.Create))) 
     { 
      //select two pages from the original document 
      reader.SelectPages("1-2"); 

      //gettins the page size in order to substract from the iTextSharp coordinates 
      var pageSize = reader.GetPageSize(1); 

      // PdfContentByte from stamper to add content to the pages over the original content 
      PdfContentByte pbover = stamper.GetOverContent(1); 

      //add content to the page using ColumnText 
      Font font = new Font(); 
      font.Size = 45; 

      //setting up the X and Y coordinates of the document 
      int x = point.X; 
      int y = point.Y; 

      y = (int) (pageSize.Height - y); 

      ColumnText.ShowTextAligned(pbover, Element.ALIGN_CENTER, new Phrase(textToAdd, font), x, y, 0); 
     } 
    } 
Problemi correlati