ITextSharp insert text to an existing pdf
I found a way to do it (dont know if it is the best but it works)
string oldFile = "oldFile.pdf";string newFile = "newFile.pdf";// open the readerPdfReader reader = new PdfReader(oldFile);Rectangle size = reader.GetPageSizeWithRotation(1);Document document = new Document(size);// open the writerFileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write);PdfWriter writer = PdfWriter.GetInstance(document, fs);document.Open();// the pdf contentPdfContentByte cb = writer.DirectContent;// select the font propertiesBaseFont 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 contentcb.BeginText();string text = "Some random blablablabla...";// put the alignment and coordinates herecb.ShowTextAligned(1, text, 520, 640, 0);cb.EndText();cb.BeginText();text = "Other random blabla...";// put the alignment and coordinates herecb.ShowTextAligned(2, text, 100, 200, 0);cb.EndText();// create the new page and add it to the pdfPdfImportedPage 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();
I hope this can be usefull for someone =) (and post here any errors)
In addition to the excellent answers above, the following shows how to add text to each page of a multi-page document:
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(); } }
Here is a method that uses stamper and absolute coordinates showed in the different PDF clients (Adobe, FoxIt and etc. )
public static void AddTextToPdf(string inputPdfPath, string outputPdfPath, string textToAdd, System.Drawing.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); } }