"Файл не начинается с"% PDF- "." Ошибка при попытке загрузить PDF - ASP. NET MVC - PullRequest
3 голосов
/ 16 января 2020

У меня есть несколько PDF-файлов в форме MemoryStreams, и мне нужно объединить MemoryStreams, чтобы они представляли собой один длинный PDF-файл, и отправить их в браузер.

Я создал следующую функцию с помощью iText7, которая принимает список MemoryStreams, которые предположительно являются PDF-файлами, а вывод представляет собой MemoryStream составных PDF-файлов

    public static MemoryStream PdfCat(List<MemoryStream> pdfs)
        {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            using(PdfDocument applicationPdf = new PdfDocument(new PdfWriter(baos)))
            {

                PdfMerger merger = new PdfMerger(applicationPdf);

                // add every document to the empty pdf
                foreach (MemoryStream pdfMemStream in pdfs)
                {
                    using (PdfDocument pdf = new PdfDocument(new PdfReader(pdfMemStream)))
                    {
                        merger.Merge(pdf, 1, pdf.GetNumberOfPages());
                    }
                }

                baos.Position = 0;
                merger.Close();
            }

            return new MemoryStream(baos.ToArray());
        }

Я пытаюсь отправить PDF-файл в браузер в контроллере с помощью следующего:

    MemoryStream application = FileUtils.PdfCat(applicationPdfs);
    return new FileStreamResult(application, "application/pdf");

Где applicationPdfs - это List<MemoryStream>.

Кнопка в моем HTML выглядит следующим образом:

<a href="~/Report/Index/@Model.id" target="_blank">View all attachments</a>

Проблема заключается в том, что, когда я нажимаю "Просмотр кнопку "все вложения", я получаю в браузере следующую ошибку: Image of error in browser

Мне удалось сохранить PDF-файл локально и просмотреть его таким образом, поэтому PDF-файл корректно объединяется. Кто-нибудь знает, что означает ошибка и как я могу это исправить?

Обновление : похоже, это работает только тогда, когда я использую FireFox в качестве браузера. По какой-то причине ошибка возникает только с IE и Chrome.

1 Ответ

3 голосов
/ 17 января 2020

Удалить строку

baos.Position = 0;

или хотя бы переместить ее после блока using(PdfDocument...) {...}.

При закрытии слияния или базового документа все еще некоторые данные записываются в выходной поток, и, изменяя позицию потока перед закрытием, вы заставляете эти данные перезаписывать начало вывода (где %PDF-... заголовок) вместо добавления в конце.

...