2010-11-17 4 views
3

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

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

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

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

<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> 

Любые идеи?

+0

В качестве обходного пути на данный момент у меня есть кнопка на моем модуле, которая открывает отчет в новом, пустом окне для версии для печати. Я бы хотел напечатать прямо из модального. – Josh

ответ

3

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

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

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

SQL Reporting Services - Print Button not shown in Mozilla

2

Пожалуйста, найти код для отчета 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> 
+1

Хотя это может отображать значок, функция печати - это ActiveX, поэтому он по-прежнему НЕ работает ... –

4

Вот что Я сделал, чтобы создать кнопку псевдопечати, которая эмулирует функцию печати 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. Добавьте раздел, в котором будет отображаться ваш 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 замечания

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

+0

Это не сработало для меня - FF v46.0. Программа НЕ перескакивает в printReport(); вызов. Он передает его. – Fandango68

+0

Это не рабочий чувак. –

0

Я внес некоторые изменения в отношении вышеизложенного, и он хорошо работает для меня как в 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(); 
     } 
    } 
} 
+0

это тоже не работает –

+0

Можете ли вы поделиться своим кодом? –

+0

http://stackoverflow.com/a/43953958/870561 это работает для меня –

Смежные вопросы