如何将多个流复制到1个供客户端下载?

How do I copy multiple streams into 1 for the client to download?

我正在使用 c# 和 asp 核心 3,现在就可以使用。

string templatePath = Path.Combine(_webHostEnvironment.WebRootPath, @"templates\pdf\test.pdf");
Stream finalStream = new MemoryStream();

foreach (Info p in list)
{
    Stream pdfInputStream = new FileStream(path: templatePath, mode: FileMode.Open);
    Stream outStream = PdfService.FillForm(pdfInputStream, p);
    outStream.Position = 0;
    outStream.CopyTo(finalStream);
    outStream.Dispose();
    pdfInputStream.Dispose();
}

finalStream.Position = 0;
return File(finalStream, "application/pdf", "test.pdf"));

现在我只得到第一个 PDF,而应该有 3. 如何将循环中创建的所有流 (PDF) 合并为一个 PDF?我正在使用 iTextSharp 并将其用作生成 FillForm 代码的指南。

https://medium.com/@taithienbo/fill-out-a-pdf-form-using-itextsharp-for-net-core-4b323cb58459

您不能通过将 PDF 添加到单个流中来组合 PDF :-)

您可以将每个 PDF 流添加到一个数组并请求 ITextSharp 将它们组合起来,然后返回新创建的流。

List<Stream> pdfStreams = new List<Stream>();

foreach(var item in list)
{
   // Open PDF + fill form
   pdfStreams.Add(outstream);
}

var newStream = Merge(pdfStreams);

return File(newStream)

我不知道 ITextSharp,但您似乎可以合并 PDF:https://weblogs.sqlteam.com/mladenp/2014/01/10/simple-merging-of-pdf-documents-with-itextsharp-5-4-5/

编辑 顺便说一句,您可以使用 "using" statement for stream(您不必自己调用 dispose)而且我不知道您的 PDF 有多重,但您应该考虑使用“.CopyToAsync”。