Вот что я сделал, чтобы создать кнопку псевдопечати, которая эмулирует функцию печати Report Viewer в Internet Explorer для других браузеров.
Обратите внимание, что для решения ниже требуется JQuery. Установка ActiveX не требуется.
Вот шаги.
Шаг 1. Добавьте кнопку печати на страницу, где находится средство просмотра отчетов.
<input id="PrintButton" title="Print" style="width: 16px; height: 16px;" type="image" alt="Print" runat="server" src="~/Reserved.ReportViewerWebControl.axd?OpType=Resource&Version=11.0.3442.2&Name=Microsoft.Reporting.WebForms.Icons.Print.gif" />
Обязательно измените номер версии на версию RS. Если у вас возникли проблемы с HTML-кодом, вы можете открыть страницу с помощью Internet Explorer, проверить элемент печати и скопировать его.
Шаг 2. Добавьте div, где будет отображаться ваш PDF.
<div class="pdf">
</div>
Шаг 3. Добавить скрипт.
$(document).ready(function () {
// Check if the current browser is IE (MSIE is not used since IE 11)
var isIE = /MSIE/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent);
function printReport() {
var reportViewerName = 'ReportViewer'; //Name attribute of report viewer control.
var src_url = $find(reportViewerName)._getInternalViewer().ExportUrlBase + 'PDF';
var contentDisposition = 'AlwaysInline'; //Content Disposition instructs the server to either return the PDF being requested as an attachment or a viewable report.
var src_new = src_url.replace(/(ContentDisposition=).*?(&)/, '$1' + contentDisposition + '$2');
var iframe = $('<iframe>', {
src: src_new,
id: 'pdfDocument',
frameborder: 0,
scrolling: 'no'
}).hide().load(function () {
var PDF = document.getElementById('pdfDocument');
PDF.focus();
try {
PDF.contentWindow.print();
}
catch (ex) {
//If all else fails, we want to inform the user that it is impossible to directly print the document with the current browser.
//Instead, let's give them the option to export the pdf so that they can print it themselves with a 3rd party PDF reader application.
if (confirm("ActiveX and PDF Native Print support is not supported in your browser. The system is unable to print your document directly. Would you like to download the PDF version instead? You may print the document by opening the PDF using your PDF reader application.")) {
window.open($find(reportViewerName)._getInternalViewer().ExportUrlBase + 'PDF');
}
}
})
//Bind the iframe we created to an invisible div.
$('.pdf').html(iframe);
}
// 2. Add Print button for non-IE browsers
if (!isIE) {
$('#PrintButton').click(function (e) {
e.preventDefault();
printReport();
})
}
});
Объяснение кода:
Сначала мы создали переменную, которая определяет, является ли браузер IE или нет.
Используя метод _getInternalViewer () в Reserved.ReportViewerWebControl.axd, мы можем запросить PDF-версию отчета в виде запроса, который первоначально был получен после нажатия кнопки экспорта.
Затем мы присвоили переменную contentDisposition AlwaysInline, потому что мы хотим запросить отчет как PDF, не как вложение, а как PDF, который мы можем отобразить в HTML-элементе.
https://msdn.microsoft.com/en-us/library/microsoft.reporting.webforms.reportviewer.exportcontentdisposition.aspx
Переменная src_new заменяет запрос на размещение содержимого кнопки EXPORT по умолчанию (который по умолчанию установлен в AlwaysAttachment) нашим новым запросом AlwaysInline.
Затем мы устанавливаем src iframe для нашего нового URL, который при загрузке будет отображать наш отчет из Reportviewer в формате PDF.
Связанные команды в iframe включают в себя скрытие элемента pdf, его рендеринг и печать сразу после завершения загрузки pdf.
Конечные замечания
Я надеюсь, что кто-то найдет этот код полезным, потому что мне было трудно найти достойное решение в Интернете, и это то, что я придумал после проведения некоторых исследований.