Рендеринг нескольких PDF в браузер с Report VIewer - ASP.NET - PullRequest
2 голосов
/ 15 июля 2011

Текущая ситуация

У меня есть веб-приложение ASP.NET, которое отображает PDF для пользователей, использующих MS Report Viewer. PDF отображается с помощью этого метода:

    Byte pdfByte = Byte();
    pdfByte = ReportViewer.LocalReport.Render("PDF", Nothing, mimeType, encoding, extensions, stream, warning)

и отправить в браузер в виде вложения с объектом ответа:

    Response.Clear()
    Response.ContentType = mimeType
    Response.AddHeader("content-disposition", "attachment; filename=myfile." + extension)
    Response.BinaryWrite(pdfByte)
    Response.Flush()
    Response.End()

Это прекрасно работает! Пользовательский браузер получит PDF-файл как загружаемое вложение.

Чего я пытаюсь достичь

Рендеринг нескольких PDF-файлов и отправка всех их отдельно в браузер пользователя. Пользователь получит отдельные документы в формате PDF. Не имеет значения, получат ли они их все сразу или по одному.

Проблема

Проблема в том, что после Response.End() следующая строка кода не выполняется. Я пытался сохранить объект pdfByte в сеансе, проходя через него и отправляя их в браузер пользователя с объектом Response, но после отправки первого PDF-файла он останавливается. Я также попытался удалить Response.End(), думая, что код продолжит работать, но все же он остановится после первой отправки PDF.

Пожалуйста, советуйте любые обходные пути или советы. Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Вы не можете отправлять несколько файлов (как отдельные объекты) в одном HTTP-ответе (протокол не поддерживает его. Однако вы можете заархивировать все файлы вместе и отправить этот один zip-архив (или любой другой формат, который вам нужен)) клиенту.

Вы можете использовать библиотеки, такие как DotNetZip / SharpZipLib , чтобы объединять (и сжимать) файлы вместе. На основе API библиотеки вам может потребоватьсясохраните PDF-файлы на диск перед добавлением в zip-файл. Также не забудьте изменить тип содержимого, соответствующий отправке zip-файла клиенту.

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

1 голос
/ 15 июля 2011

Конечно, метод, который я использую, выглядит не очень элегантно, но вот что я делаю:

  • создайте по одному IFRAME на странице для каждого документа, который вы хотите отправитьклиенту (возможно, создать IFRAME динамически в коде на стороне сервера, если число документов является переменным);

  • создать HttpHandler, который генерирует документы PDF, в зависимости от параметра, который вы 'повторяется через QueryString, как вы делали выше;

  • установить src для всех IFRAMES на URL-адрес HttpHandler с соответствующими параметрами.

Конечно, HttpHandler должен реализоватьлогика безопасности, если требуется.

Это работает довольно красиво: если я хочу отправить 3 документа, я создаю 3 IFRAME, устанавливаю их src, и пользователь увидит 3 диалоговых окна «Сохранить как ...».

...