C# 合并多个内存流并通过filestreamresult返回,仅显示最后一个内存流

问题描述 投票:0回答:1

我正在尝试将多个 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 内部似乎还有更多内容?

c# pdf web memorystream filestreamresult
1个回答
0
投票

当您通过串联将两个 PDF 文件合并在一起时,您将得到一个工作文件,但在 acrobat 中它应该被视为第一个文件,因为第一个文件优先并且是一个完整的文件。在合并的文件中,您可以看到它只是一个文件的一页。

这说明了为什么这两个文件有效,但地址 INDEX 是在可能的情况下使用的(如果没有损坏)。

© www.soinside.com 2019 - 2024. All rights reserved.