Как скопировать несколько потоков в один, чтобы клиент мог их загрузить? - PullRequest
1 голос
/ 18 июня 2020

Я использую 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), созданные в формате l oop, в 1 PDF? Я использую iTextSharp и использую его как руководство для создания кода FillForm.

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

1 Ответ

3 голосов
/ 18 июня 2020

Вы не можете просто объединить 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/

Edit Кстати, вы мог бы использовать оператор using для потока (вам не нужно было бы вызывать dispose самостоятельно), и я не знаю, насколько тяжелы ваши PDF-файлы, но вам, возможно, стоит подумать об использовании «.CopyToAsyn c».

...