You can use this example for iTextSharp to solve your problem:
var output = new MemoryStream(); using (var document = new Document(PageSize.A4, 70f, 70f, 20f, 20f)) { var readers = new List<PdfReader>(); var writer = PdfWriter.GetInstance(document, output); writer.CloseStream = false; document.Open(); const Int32 requiredWidth = 500; const Int32 zeroBottom = 647; const Int32 left = 50; Action<String, Action> inlcudePdfInDocument = (filename, e) => { var reader = new PdfReader(filename); readers.Add(reader); var pageCount = reader.NumberOfPages; for (var i = 0; i < pageCount; i++) { e?.Invoke(); var imp = writer.GetImportedPage(reader, (i + 1)); var scale = requiredWidth / imp.Width; var height = imp.Height * scale; writer.DirectContent.AddTemplate(imp, scale, 0, 0, scale, left, zeroBottom - height); var annots = reader.GetPageN(i + 1).GetAsArray(PdfName.ANNOTS); if (annots != null && annots.Size != 0) { foreach (var a in annots) { var newannot = new PdfAnnotation(writer, new Rectangle(0, 0)); var annotObj = (PdfDictionary) PdfReader.GetPdfObject(a); newannot.PutAll(annotObj); var rect = newannot.GetAsArray(PdfName.RECT); rect[0] = new PdfNumber(((PdfNumber)rect[0]).DoubleValue * scale + left);
This example copies the list of PDF files with annotations to a new pdf file.
Receive data from two PdfReaders at the same time - one for copying a new pdf, and the other for copying annotations from an old pdf.
source share