2015-11-06 3 views
0

Вот моя ситуация. У меня есть список моделей данных, которые заполнят данный PDF-шаблон в один большой PDF-файл и отображают на веб-странице клиент для печати файла. (без локальной копии). Я использую пример kuujinbo https://stackoverflow.com/a/8525007/5533303, но по какой-то причине я не могу позволить потоку памяти связываться, когда я собираюсь отобразить pdf на странице. (ошибка не может прочитать закрытый поток памяти.) Моя системная среда - MVC 5 с последним itextsharp.Многостраничный PDF-файл, созданный с помощью 1 шаблона PDF

20151107 Обновлено: Найдите причину. Общий код верен, но в конце цикла я должен поместить byteInfo = Masterstream.ToArray(); вне использования smartcopy, но внутри используемого документа. и создайте новую строку памяти позже, чтобы краб byteinfo и вернуться к представлению.

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"); 
+0

После нахождения удовлетворительного решения для вашего вопроса, пожалуйста подправить это решение как ответ в своем собственном праве. – mkl

ответ

0
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"); 
Смежные вопросы