2017-01-09 201 views
0

我正在致力于将存储在数据库中的多个PDF文件作为varbinary并使用Aspose - PDF将它们合并到单个文件中。然后将合并的文件转换为Memory Stream,然后转换为blob,然后发送到网页。Aspose PDF合并PDF从字节[] []

这里是我的服务:除了返回错误无法访问已关闭的流mergedPdf.Save(stream);

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; 
    } 

一切是伟大的工作。

我一直在研究这一点,似乎无法理解为什么记忆流已关闭。有其他人遇到过这个问题吗?

编辑:

我已经找到了问题的上市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; 
     } 

    }