Кнопка печати SSRS в Chrome и Firefox - PullRequest
3 голосов
/ 17 ноября 2010

У меня есть отчеты в SSRS 2005. Я использую удаленные отчеты. В IE кнопка печати отображается, но в Firefox и Chrome кнопка печати не отображается.

Мои отчеты отображаются в диалоговых окнах jquery UI, поэтому я не могу просто сделать window.print. Мои отчеты хорошо отображаются в модальных зонах.

Мне нужно иметь возможность выдавать команду печати для средства просмотра отчетов так же, как это делается внутри элемента управления, но только в Firefox и Chrome.

Я покопался в разметке для средства просмотра отчетов и нашел этот код. Я попытался вручную вставить его в программу просмотра отчетов, но безуспешно.

<table id="reportViewer_ctl01_ctl07_ctl00_ctl00" onclick="document.getElementById(&#39;reportViewer&#39;).ClientController.LoadPrintControl();return false;" onmouseover="this.Controller.OnHover();" onmouseout="this.Controller.OnNormal();" title="Print" style="display:none;">
                                <script type="text/javascript">
                                    document.getElementById('reportViewer_ctl01_ctl07_ctl00_ctl00').Controller = new ReportViewerHoverButton("reportViewer_ctl01_ctl07_ctl00_ctl00", false, "", "", "", "#ECE9D8", "#DDEEF7", "#99BBE2", "1px #ECE9D8 Solid", "1px #336699 Solid", "1px #336699 Solid");
                                </script><tr>
                                    <td><input type="image" name="reportViewer$ctl01$ctl07$ctl00$ctl00$ctl00" title="Print" src="/Reserved.ReportViewerWebControl.axd?OpType=Resource&amp;Version=9.0.30729.4402&amp;Name=Microsoft.Reporting.WebForms.Icons.Print.gif" alt="Print" style="height:16px;width:16px;padding:2px;" /></td>
                                </tr>
                            </table>

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 26 мая 2016

Вот что я сделал, чтобы создать кнопку псевдопечати, которая эмулирует функцию печати 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&amp;Version=11.0.3442.2&amp;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.

Конечные замечания

Я надеюсь, что кто-то найдет этот код полезным, потому что мне было трудно найти достойное решение в Интернете, и это то, что я придумал после проведения некоторых исследований.

3 голосов
/ 27 февраля 2011

К сожалению, кнопка печати не поддерживается в других браузерах, кроме IE.

Я думаю, что вы поняли это и сделали обходной путь, нам еще предстоит найти достойное решение.Хотя большинство наших пользователей предпочитают печатать из Excel напрямую, поэтому мы разрешаем им экспортировать файл, который они затем печатают.

Этот вопрос SO будет хорошей ссылкой:

Службы отчетов SQL - кнопка печати не отображается в Mozilla

2 голосов
/ 14 февраля 2014

Пожалуйста, найдите код для отчета SSRS, который имеет значок печати с функцией печати для Firefox и Chrome:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Report.aspx.cs" Inherits="DemoMVC.Report.Report" %>


<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>


<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <script src="../Scripts/jquery-1.7.1.js"></script>

    <script type="text/javascript" lang="javascript">

        $(document).ready(function () {

            if ($.browser.mozilla || $.browser.webkit) {

                try {

                    showPrintButton();

                }

                catch (e) { alert(e); }

            }

        });



        function showPrintButton() {

            var table = $("table[title='Refresh']");

            var parentTable = $(table).parents('table');

            var parentDiv = $(parentTable).parents('div').parents('div').first();

            parentDiv.append('<input type="image" style="border-width: 0px; padding: 3px;margin-top:2px; height:16px; width: 16px;" alt="Print" src="/Reserved.ReportViewerWebControl.axd?OpType=Resource&amp;Version=9.0.30729.1&amp;Name=Microsoft.Reporting.WebForms.Icons.Print.gif";title="Print" onclick="PrintReport();">');



        }

         // Print Report function

        function PrintReport() {



            //get the ReportViewer Id

            var rv1 = $('#MyReportViewer_ctl09');

            var iDoc = rv1.parents('html');



            // Reading the report styles

            var styles = iDoc.find("head style[id$='ReportControl_styles']").html();

            if ((styles == undefined) || (styles == '')) {

                iDoc.find('head script').each(function () {

                    var cnt = $(this).html();

                    var p1 = cnt.indexOf('ReportStyles":"');

                    if (p1 > 0) {

                        p1 += 15;

                        var p2 = cnt.indexOf('"', p1);

                        styles = cnt.substr(p1, p2 - p1);

                    }

                });

            }

            if (styles == '') { alert("Cannot generate styles, Displaying without styles.."); }

            styles = '<style type="text/css">' + styles + "</style>";



           // Reading the report html

            var table = rv1.find("div[id$='_oReportDiv']");

            if (table == undefined) {

                alert("Report source not found.");

                return;

            }



            // Generating a copy of the report in a new window

            var docType = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/loose.dtd">';

            var docCnt = styles + table.parent().html();

            var docHead = '<head><style>body{margin:5;padding:0;}</style></head>';

            var winAttr = "location=yes, statusbar=no, directories=no, menubar=no, titlebar=no, toolbar=no, dependent=no, width=720, height=600, resizable=yes, screenX=200, screenY=200, personalbar=no, scrollbars=yes";;

            var newWin = window.open("", "_blank", winAttr);

            writeDoc = newWin.document;

            writeDoc.open();

            writeDoc.write(docType + '<html>' + docHead + '<body onload="window.print();">' + docCnt + '</body></html>');

            writeDoc.close();

            newWin.focus();

            // uncomment to autoclose the preview window when printing is confirmed or canceled.

            // newWin.close();

        };

    </script>









</head>

<body>

     <form id="form1" runat="server">

    <div>

    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" EnablePartialRendering="False" />

        <rsweb:ReportViewer ID="MyReportViewer" runat="server">

        </rsweb:ReportViewer>

    </div>

    </form>

</body>

</html>
0 голосов
/ 27 декабря 2016

Я внес некоторые изменения в отношении вышесказанного, и он хорошо работает для меня как в Chrome, так и в Firefox.

function PrintReport() {        
    var reportViewerName = 'ReportViewer1';
    var src_url = $find(reportViewerName)._getInternalViewer().ExportUrlBase + 'PDF';

    var contentDisposition = 'AlwaysInline';
    var src_new = src_url.replace(/(ContentDisposition=).*?(&)/, '$1' + contentDisposition + '$2');

    var iframe = $('<iframe>', {
        src: src_new,
        id: 'iframePDF',
        frameborder: 0,
        scrolling: 'no'
    });

    $('#pdfPrint').html(iframe);    //There should be a div named "pdfPrint"

    if (iframe != undefined && iframe.length > 0) {
        var frame = iframe[0];

        if (frame != null || frame != undefined) {
            var contentView = iframe[0].contentWindow;

            contentView.focus();
            contentView.print();
        }
    }
}
...