我正在尝试将多个 pdf 文件合并到一个内存流中,并将其与 FileStreamResult 一起返回到 Web 应用程序。
我的代码是这样的:
string contentType = "application/pdf";
//---save as fileStream Excel
if (filePath == null)
filePath = new DirectoryInfo(Server.MapPath("~") + ConfigurationManager.AppSettings["SomeTemplate"].ToString()).ToString();
var sumPdfStream = new MemoryStream();
string fileDownloadName = "SomeFile.pdf";
//Generating Excel file for every offer/file, getting each offer through ID from string offerIDs, comma separated values
for (int i = 0; i < offerIDs.Split(',').Length - 1; i++)
{
var pdfStream = new MemoryStream();
var fileStream = new MemoryStream();
var offerID = Convert.ToInt32(offerIDs.Split(',')[i]);
fileStream = GenerateExcel(offerID, ref offerNumber, filePath);
//string fileDownloadName = "Ponudba_" + offerNumber + "_" + DateTime.Now.ToShortDateString().Replace(".", "-").Replace("/", "-") + ".pdf";
Spire.Xls.Workbook workbook = new Spire.Xls.Workbook();
workbook.LoadFromStream(fileStream, ExcelVersion.Version2013);
workbook.SaveToStream(pdfStream, Spire.Xls.FileFormat.PDF);
pdfStream.CopyTo(sumPdfStream);
pdfStream.Close();
pdfStream.Dispose();
fileStream.Close();
fileStream.Dispose();
//sumPdfStream.Write(pdfStream.GetBuffer(), (int)sumPdfStream.Position, (int)pdfStream.Length);
}
//sumPdfStream.Seek(0, 0);
sumPdfStream.Position = 0;
var fsr = new FileStreamResult(sumPdfStream, contentType);
//sumPdfStream.Close();
fsr.FileDownloadName = fileDownloadName;
//fsr.FileStream.Seek(0, 0);
return fsr;
基本上,我试图调用一些代码来为每个 Offer 生成 Excel 文件(从数据库获取数据),然后使用 Spire 许可证将 Excel 转换为 PDF 并将其写入 MemoryStream。由于可能有 X 个优惠/PDF 文件,我正在尝试使用 CopyTo 方法将它们合并为一个。
当我调试代码并在 pdfStream.CopyTo(sumPdfStream) 行设置断点时,我可以看到我的 sumPdfStream 对象(用于保存所有 PDF)正在增长。
最后,我创建 FileStreamResult 并将 sumPdfStream 和所有 PDF 复制到其中。同样,当我调试代码时,一切似乎都正常(FileStreamResult 大于一个 PDF),但是当我将 FileStreamResult 返回到 Web 应用程序时,只显示最后一个 PDF。
我做错了什么?为什么 FileStreamResult 只显示最后一个 PDF,尽管 FileStreamResult 内部似乎还有更多内容?