Below is a snippet of code that returns a damaged PDF document, but if I return mergedDocument, it always returns a valid PDF file. mergedDocument is based on a PDF file that I created using Word, while the completed document is fully programmatically generated. The code "works" in that it does not exclude any exceptions. Why is iTextSharp creating a damaged PDF file?
byte[] completedDocument = null; using (MemoryStream streamCompleted = new MemoryStream()) { using (Document document = new Document()) { PdfCopy copy = new PdfCopy(document, streamCompleted); document.Open(); copy.Open(); foreach (var item in eventItems) { byte[] mergedDocument = null; PdfReader reader = new PdfReader(pdfTemplates[item.DataTokens[NotifyTokenType.OrganisationID]]); using (MemoryStream streamTemplate = new MemoryStream()) { using (PdfStamper stamper = new PdfStamper(reader, streamTemplate)) { foreach (var token in item.DataTokens) { if (stamper.AcroFields.Fields.Any(fld => fld.Key == token.Key.ToString())) { stamper.AcroFields.SetField(token.Key.ToString(), token.Value); } } stamper.FormFlattening = true; stamper.Writer.CloseStream = false; } mergedDocument = new byte[streamTemplate.Length]; streamTemplate.Position = 0; streamTemplate.Read(mergedDocument, 0, (int)streamTemplate.Length); } reader = new PdfReader(mergedDocument); for (int i = 1; i <= reader.NumberOfPages; i++) { document.SetPageSize(PageSize.A4); copy.AddPage(copy.GetImportedPage(reader, i)); } } completedDocument = new byte[streamCompleted.Length]; streamCompleted.Position = 0; streamCompleted.Read(completedDocument, 0, (int)streamCompleted.Length); } } return completedDocument;
source share