由 1 个 PDF 模板创建的多页 PDF

Multiple page PDF created by 1 PDF template

这是我的情况,我有一个数据模型列表,它将把给定的 PDF 模板填充到一个大的 pdf 中,并显示在网页上供客户打印文件。 (没有本地副本)。我使用 kuujinbo 的示例 但由于某些原因,当我要在页面上显示 pdf 时,我不能让内存流绑定。 (错误是无法读取关闭的内存流。)我的系统环境是 MVC 5 使用最新的 itextsharp。

20151107 Updated:Find原因。整体代码是正确的,但在循环结束时我应该把 byteInfo = Masterstream.ToArray();在 smartcopy 外部使用但在文档内部使用。并稍后创建一个新的内存字符串以将字节信息和 return 抓取到视图中。

List<Datamodel> PrintList = ( List<Datamodel> )Session["GetDAta"];
         BaseFont baseChineseFont = BaseFont.CreateFont(@"~~~~~~~~~",
            BaseFont.IDENTITY_H,  BaseFont.NOT_EMBEDDED);
         MemoryStream Masterstream = new MemoryStream();
         byte[] byteInfo;
         using (Document document = new Document())
         {                
             using (PdfSmartCopy copy = new PdfSmartCopy(document, Masterstream))
             {
                 document.Open();
                 foreach (Datamodel childnode in PrintList)
                 {
                     PdfReader pdfReader = new PdfReader(Request.MapPath("~/Content/try 1.pdf"));
                     using (MemoryStream ms = new MemoryStream())
                     {
                         using (PdfStamper stamper = new PdfStamper(pdfReader, ms))
                         {
                             // do stuff      //
                               AcroFields pdfForm = stamper.AcroFields;
                             #region[input data]

                             pdfForm.AddSubstitutionFont(baseChineseFont);//加font

                             pdfForm.SetField("XXXXXXXX", childnode.XXXXXX);

                             #endregion                                                     
                             stamper.FormFlattening = true;
                         }
                         pdfReader = new PdfReader(ms.ToArray());
                         copy.AddPage(copy.GetImportedPage(pdfReader, 1));

                     }

                 }
                 byteInfo = Masterstream.ToArray();
             }                
         }                         
         Masterstream.Write(byteInfo, 0, byteInfo.Length);
         Masterstream.Position = 0;
         return new FileStreamResult(Masterstream, "application/pdf");

正确结果

 }///smartcopy end using
byteInfo = Masterstream.ToArray();
         }         //document   end using 
        MemoryStream finalyresult= new  MemoryStream(byteInfo);
        finalyresult.Write(byteInfo, 0, byteInfo.Length);
        finalyresult.Position = 0;
         return new FileStreamResult(finalyresult, "application/pdf");
 using (Document document = new Document())
     {                
         using (PdfSmartCopy copy = new PdfSmartCopy(document, Masterstream))
         {
             document.Open();
             foreach (Datamodel childnode in PrintList)
             {
                 PdfReader pdfReader = new PdfReader(Request.MapPath("~/Content/try 1.pdf"));
                 using (MemoryStream ms = new MemoryStream())
                 {
                     using (PdfStamper stamper = new PdfStamper(pdfReader, ms))
                     {
                         // do stuff      //
                           AcroFields pdfForm = stamper.AcroFields;
                         #region[input data]

                         pdfForm.AddSubstitutionFont(baseChineseFont);//加font

                         pdfForm.SetField("XXXXXXXX", childnode.XXXXXX);

                         #endregion                                                     
                         stamper.FormFlattening = true;
                     }
                     pdfReader = new PdfReader(ms.ToArray());
                     copy.AddPage(copy.GetImportedPage(pdfReader, 1));

                 }

             }
               }///smartcopy end using
           byteInfo = Masterstream.ToArray();
     }         //document   end using 
    MemoryStream finalyresult= new  MemoryStream(byteInfo);
    finalyresult.Write(byteInfo, 0, byteInfo.Length);
    finalyresult.Position = 0;
     return new FileStreamResult(finalyresult, "application/pdf");