2010年8月17日 星期二

使用RSClientPrint直接列印RS報表

使用RSClientPrint直接列印RS報表


一般而言,當我們想要列印RS報表時,
都是先將報表另存下來後,再開啟檔案列印的。

原來,Report Services早就幫我們想好這點了,
它提供了一個叫「RSClientPrint」的cab元件,
直接執行JavaScript就可以列印報表了!!

雖然在很早以前就以前提供了,但這時候,也需特別注意環境,
也就是SQL Server的版本,在這邊,以SQL 2005為例。
在SQL 2005最初版來說,有被攻擊的危險,
所以,在某次系統安全性更新後,該功能會被拿掉,必須再去升級才行使用。
當然,如果允許的話,建議將其升級為最新版本的最好囉。(目前為SP3)

以目前來說,至少需為SQL Server 2005 SP2 的版本才能列印,
至少必須確定
C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\ReportServer\bin\RSClientPrint.cab
2008/8/5之後的版本才行。
若不是的話,可能是有些更新沒有裝到。試著安裝此更新

環境都確定好後,就可以開始實作了。

程式碼參考如下:(其實這段,網路上一堆,到處都可以copy的到)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="RSClientPrint.aspx.cs" Inherits="RSClientPrint" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>未命名頁面</title>

<script type="text/javascript" language="javascript">
function Print()
{
alert('進入列印');

if (typeof RSClientPrint.Print == "undefined") 
{
   alert("Unable to load client print control.");
   return;
}
//邊界
RSClientPrint.MarginLeft = 0;
RSClientPrint.MarginTop = 0;
RSClientPrint.MarginRight = 0;
RSClientPrint.MarginBottom = 0;

//繁體中文
RSClientPrint.Culture = 2052;
RSClientPrint.UICulture = 2052;

//預設為A4
//如果 PageWidth 大於 PageHeight,列印方向就會設定為 [橫向]。 否則,就會設定為 [縱向]。
RSClientPrint.PageHeight = 297;
RSClientPrint.PageWidth = 210;

RSClientPrint.Authenticate = true;

RSClientPrint.Print('http://localhost/ReportServer', '/TestPage', 'TestPage')
}
</script>

</head>
<body>
    <object style="display: none;" id="RSClientPrint" classid="CLSID:0D221D00-A6ED-477C-8A91-41F3B660A832"
        codebase="RSClientPrint.cab#Version=2005,90,4053,00" VIEWASTEXT>
    </object>
    <form id="form1" runat="server">
        <div>
                 <asp:Button ID="Button1" runat="server" Text="列印" OnClientClick ="Print();return false;" />
        </div>
    </form>
</body>
</html>



有個地方需要注意一下。classid 及 codebase 這邊:
  1. Version」也請參考該元件裡的RSClientPrint.inf內的版次。(不過,有測試過,就算拿掉也可以用)
  2. CLSID:0D221D00-A6ED-477C-8A91-41F3B660A832」也請參考RSClientPrint.inf的資料
  3. codebase」將指向該元件檔案的位置,由於這邊我是將網頁及元件放在同個目錄下。請配合調整。
如果值亂改的話,會導致元件安裝不正常。如下圖


倘若設定都正常的話,執行該網頁,則會看到以下畫面:

想用的話,當然只能選擇「安裝」
安裝完後,按下列印,即會彈出列印方塊。按下「確定」就可以列印囉~~
或者可以點選「預覽」功能。(我的測試報表字好像有點小)

微軟的說明文件:在自訂應用程式中使用 RSClientPrint 控制項
另外,此方法…只能支援IE瀏覽器。