ITextSharp creates a damaged PDF file

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; 
+6
source share
2 answers

You need to close the document and copy objects to clear the buffer of the PDF record. This, however, causes some problems when trying to read a stream into an array. To ToArray() this, use the ToArray() method for a MemoryStream that still works in private threads. The changes I made contain comments on them.

  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; } //Copy the stream bytes mergedDocument = streamTemplate.ToArray(); } reader = new PdfReader(mergedDocument); for (int i = 1; i <= reader.NumberOfPages; i++) { document.SetPageSize(PageSize.A4); copy.AddPage(copy.GetImportedPage(reader, i)); } //Close the document and the copy document.Close(); copy.Close(); } //ToArray() can operate on closed streams completedDocument = streamCompleted.ToArray(); } } return completedDocument; 
+20
source

Also make sure your html does not contain an hr tag when converting html to pdf

 hdnEditorText.Value.Replace("\"", "'").Replace("<hr />", "").Replace("<hr/>", "") 
0
source

Source: https://habr.com/ru/post/890690/


All Articles