2017-01-09 16 views
0

Я работаю над сервисом, который тянет несколько файлов PDF, хранящихся в базе данных, как varbinary и объединяет их в один файл, используя Aspose - PDF. Затем объединенный файл преобразуется в Memory Stream, а затем в blob, а затем отправляется на веб-страницу.Aspose PDF Merge PDF from byte [] []

Вот моя служба:

public MemoryStream GetPrintContent(List<ConfirmationRequestNoticeViewModel> models) 
    { 
     // Instantiate Pdf instance by calling its empty constructor 
     Document pdf1 = new Document(); 

     byte[][] bytes = new byte[models.Count][]; 

     for (int i = 0; i < models.Count; i++) 
     { 
      ConfirmationRequestNoticeViewModel model = models[i]; 
      byte[] fileContent = _dataService.GetPrintContent(model.ConfirmationRequestId); 
      bytes[i] = fileContent; 

     } 
     MemoryStream stream = new MemoryStream(); 
     List<Document> documents = GeneratePdfs(bytes, stream); 
     stream = ConcatenatePdf(documents); 
     return stream; 
    } 

    private MemoryStream ConcatenatePdf(List<Document> documents) 
    { 
     MemoryStream stream = new MemoryStream(); 
     Document mergedPdf = documents[0]; 
     for(int index = 1; index < documents.Count; index++) 
     { 
      for (int i = 0; i < documents[index].Pages.Count; i++) 
      { 
       mergedPdf.Pages.Add(documents[index].Pages[i + 1]); 
      } 
     } 
     mergedPdf.Save(stream); 
     return stream; 
    } 

    private List<Document> GeneratePdfs(byte[][] content, MemoryStream stream) 
    { 
     List<Document> documents = new List<Document>(); 
     Document pdf = new Document(); 
     foreach (byte[] fileContent in content) 
     { 
      using (MemoryStream fileStream = new MemoryStream(fileContent)) 
      { 
       pdf = new Document(fileStream); 
       pdf.Save(stream); 
       documents.Add(pdf); 
      } 
     } 
     return documents; 
    } 

Все работает отлично подходит для линии mergedPdf.Save(stream);, которая возвращает ошибку Не удается получить доступ к закрытой поток за исключением.

Я работаю над этим и не могу понять, почему поток памяти был закрыт. Кто-нибудь еще столкнулся с этой проблемой?

Edit:

Я нашел этот вопрос в список here

ответ

0

Я не мог решить проблему с закрытым MemoryStreams с текущей реализацией, поэтому мне пришлось реорганизовать полностью.

Вместо этого я пошел с методом PdfFileEditor.Concatenate()explained in this forum post.

Моя реализация выглядит следующим образом:

public byte[] GetPrintContent(List<ConfirmationRequestNoticeViewModel> models) 
    { 
     PdfFileEditor pdfEditor = new PdfFileEditor(); 

     MemoryStream[] inputStreams = new MemoryStream[models.Count]; 
     MemoryStream fileStream = new MemoryStream(); ; 


     using (MemoryStream outputStream = new MemoryStream()) 
     { 
      for (int i = 0; i < models.Count; i++) 
      { 
       ConfirmationRequestNoticeViewModel model = models[i]; 
       byte[] fileContent = _dataService.GetPrintContent(model.ConfirmationRequestId); 

       fileStream = new MemoryStream(fileContent); 

       inputStreams[i] = fileStream; 

      } 
      bool success = pdfEditor.Concatenate(inputStreams, outputStream); 
      byte[] data = outputStream.ToArray(); 
      fileStream.Dispose(); 
      return data; 
     } 

    }