Вот что Я сделал, чтобы создать кнопку псевдопечати, которая эмулирует функцию печати 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. Добавьте раздел, в котором будет отображаться ваш 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.
Переменная src_new заменяет стандартный запрос на размещение содержимого кнопки EXPORT (который по умолчанию установлен на AlwaysAttachment) с нашим новым запросом «AlwaysInline».
Затем мы устанавливаем src iframe на наш новый url, который при загрузке покажет наш отчет от reportviewer как PDF.
Прикованные команды в iframe включают в себя скрытие элемента pdf, его рендеринг и печать сразу после завершения загрузки PDF-файла.
Ending замечания
Я надеюсь, что кто-то найдет этот код полезным, потому что у меня было трудное время найти достойное решение в Интернете, и это то, что я придумал после того, как делают некоторые исследования.
В качестве обходного пути на данный момент у меня есть кнопка на моем модуле, которая открывает отчет в новом, пустом окне для версии для печати. Я бы хотел напечатать прямо из модального. – Josh