Aspose PDF 从 byte[][] 合并 PDF
Aspose PDF Merge PDF from byte[][]
我正在开发一项服务,可以将存储在数据库中的多个 PDF 文件提取为 varbinary
,然后使用 Aspose - PDF
将它们合并为一个文件。然后将合并后的文件转换为Memory Stream
,再转换为blob
,然后发送到网页。
这是我的服务:
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);
行外,一切正常,returns 错误 无法访问已关闭的流。
我一直在处理这个问题,但似乎无法理解为什么内存流已关闭。还有其他人遇到过这个问题吗?
编辑:
我发现问题已列出 here
我无法用当前的实现解决关闭 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;
}
}
对于关闭的内存流问题,您应该删除 using()
,因为它在从 {}
出来时处理流。它会很好地工作。
我正在开发一项服务,可以将存储在数据库中的多个 PDF 文件提取为 varbinary
,然后使用 Aspose - PDF
将它们合并为一个文件。然后将合并后的文件转换为Memory Stream
,再转换为blob
,然后发送到网页。
这是我的服务:
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);
行外,一切正常,returns 错误 无法访问已关闭的流。
我一直在处理这个问题,但似乎无法理解为什么内存流已关闭。还有其他人遇到过这个问题吗?
编辑:
我发现问题已列出 here
我无法用当前的实现解决关闭 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;
}
}
对于关闭的内存流问题,您应该删除 using()
,因为它在从 {}
出来时处理流。它会很好地工作。