C# Aspose PDF合并来自字节[][]的PDF
我正在开发一项服务,该服务将多个PDF文件作为C# Aspose PDF合并来自字节[][]的PDF,c#,pdf,blob,aspose.pdf,C#,Pdf,Blob,Aspose.pdf,我正在开发一项服务,该服务将多个PDF文件作为varbinary存储在数据库中,并使用Aspose-PDF将它们合并到一个文件中。然后,合并的文件被转换为内存流,然后转换为blob,然后发送到网页 这是我的服务: public MemoryStream GetPrintContent(List<ConfirmationRequestNoticeViewModel> models) { // Instantiate Pdf instance by cal
varbinary
存储在数据库中,并使用Aspose-PDF
将它们合并到一个文件中。然后,合并的文件被转换为内存流
,然后转换为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;
}
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;
}
}
公共内存流GetPrintContent(列表模型)
{
//通过调用其空构造函数实例化Pdf实例
文档pdf1=新文档();
字节[][]字节=新字节[models.Count][];
对于(int i=0;i
除了行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;
}
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;
}
}
我发现了列出的问题我无法用当前实现解决封闭内存流的问题,因此我必须完全重构
相反,我使用了PdfFileEditor.Concatenate()
方法
我的实现如下:
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;
}
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;
}
}
public byte[]GetPrintContent(列表模型)
{
PdfFileEditor pdfEditor=新的PdfFileEditor();
MemoryStream[]inputStreams=新的MemoryStream[models.Count];
MemoryStream fileStream=新的MemoryStream();
使用(MemoryStream outputStream=new MemoryStream())
{
对于(int i=0;i