iTextSharp正在生成一个损坏的PDF

下面的代码片段返回一个损坏的PDF文档,但是如果我返回mergedDocument,它总是返回一个有效的PDF。 mergedDocument基于我使用Word创建的PDF文件,而完成的文档完全以编程方式生成。 代码“有效”,因为它不会引发exception。 为什么iTextSharp会创建损坏的PDF?

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; 

您需要关闭documentcopy对象以刷新PDF写入缓冲区。 但是,当尝试将流读入数组时,这会导致一些问题。 解决方法是使用MemoryStreamToArray()方法,该方法仍适用于封闭流。 我所做的改变对他们有所评论。

  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's 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; 

还要确保您的html在将html转换为pdf时不包含hr标记

 hdnEditorText.Value.Replace("\"", "'").Replace("
", "").Replace("
", "")