Web打印
从网上找了一些关于asp.net打印的资料,参考“关于Web打印”,参考
最后选择了使用ReportViewer实现打印功能
arcgis silverlight内容的打印
实现思路:
silveilight程序中把页面中需要打印的对象转换成图形base64编码的字符流,提交到服务端
服务端处理程序把这些二进制字符流邦定到ReportViewer控件上,然后由ReportViewer实现打印的展现功能,具体如下:
HOST silverlight的页面
<div style="visibility:hidden"> <form action="Rpt/print.aspx" method="post" enctype="application/x-www-form-urlencoded" target="_blank"> <input type="text" id="prText" name="prText" /> <input type="submit" id="prBtn" /> </form> </div>
SilverLight提交打印请求
private void Button_Click(object sender, RoutedEventArgs e) { WriteableBitmap bitmap = new WriteableBitmap(this.gridTest, new TranslateTransform()); EditableImage image = new EditableImage(bitmap.PixelWidth, bitmap.PixelHeight); for (int i = 0; i < bitmap.PixelHeight; i++) { for (int j = 0; j < bitmap.PixelWidth; j++) { int num3 = bitmap.Pixels[(bitmap.PixelWidth * i) + j]; image.SetPixel(j, i, (byte) ((num3 >> 0x10) & 0xff), (byte) ((num3 >> 8) & 0xff), (byte) (num3 & 0xff), (byte) ((num3 >> 0x18) & 0xff)); } } Stream stream = image.GetStream(); byte[] buffer = new byte[stream.Length]; long num4 = stream.Read(buffer, 0, (int) stream.Length); string str = Convert.ToBase64String(buffer, 0, buffer.Length); HtmlPage.Document.GetElementById("prText").SetProperty("value", str); HtmlPage.Document.GetElementById("prBtn").Invoke("click", null); }
打印页面和处理逻辑:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="print.aspx.cs" Inherits="GisSite.Rpt.PrintPreview" %> <%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" namespace="Microsoft.Reporting.WebForms" tagprefix="rsweb" %> <!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> </head> <body> <form id="form1" runat="server"> <rsweb:ReportViewer ID="ReportViewer1" runat="server" Width="100%" Height="600px"> </rsweb:ReportViewer> </form> </body> </html> // Methods
private void FillReport(string bytes64)
{
byte[] imageBytes = Convert.FromBase64String(bytes64);
printImg.ImageDataDataTable dt = new printImg.ImageDataDataTable();
dt.AddImageDataRow(0, "print", imageBytes);
this.ReportViewer1.LocalReport.ReportPath ="Rpt/print.rdlc";
ReportDataSource src = new ReportDataSource("DSReportPrintImage_ImageData", dt);
this.ReportViewer1.LocalReport.DataSources.Add(src);
this.ReportViewer1.LocalReport.Refresh();
}
protected void Page_Load(object sender, EventArgs e)
{
if (!this.Page.IsPostBack)
{
string bytes64 = base.Request["prText"];
if (!string.IsNullOrEmpty(bytes64))
{
this.FillReport(bytes64);
}
}
}
print .RDLC文件
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<DataSources>
<DataSource Name="DummyDataSource">
<rd:DataSourceID>6dde20a2-6fdf-4054-a23d-0135e6a9e8a4</rd:DataSourceID>
<ConnectionProperties>
<DataProvider>SQL</DataProvider>
<ConnectString />
</ConnectionProperties>
</DataSource>
</DataSources>
<InteractiveHeight>11in</InteractiveHeight>
<rd:DrawGrid>true</rd:DrawGrid>
<InteractiveWidth>8.5in</InteractiveWidth>
<rd:SnapToGrid>true</rd:SnapToGrid>
<RightMargin>1in</RightMargin>
<LeftMargin>1in</LeftMargin>
<BottomMargin>1in</BottomMargin>
<rd:ReportID>66b0e21f-4a8d-4b4e-b652-d28cb44e05e4</rd:ReportID>
<DataSets>
<DataSet Name="DSReportPrintImage_ImageData">
<Fields>
<Field Name="ImageId">
<DataField>ImageId</DataField>
<rd:TypeName>System.Int32</rd:TypeName>
</Field>
<Field Name="ImageName">
<DataField>ImageName</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
<Field Name="ImageBytes">
<DataField>ImageBytes</DataField>
<rd:TypeName>System.Byte[]</rd:TypeName>
</Field>
</Fields>
<Query>
<DataSourceName>DummyDataSource</DataSourceName>
<CommandText />
<rd:UseGenericDesigner>true</rd:UseGenericDesigner>
</Query>
<rd:DataSetInfo>
<rd:DataSetName>DSReportPrintImage</rd:DataSetName>
<rd:TableName>ImageData</rd:TableName>
</rd:DataSetInfo>
</DataSet>
</DataSets>
<Width>6.5in</Width>
<Body>
<ReportItems>
<List Name="list1">
<Left>0.125in</Left>
<DataSetName>DSReportPrintImage_ImageData</DataSetName>
<ReportItems>
<Image Name="image1">
<Sizing>AutoSize</Sizing>
<Top>0.125in</Top>
<Width>5.875in</Width>
<MIMEType>image/png</MIMEType>
<Source>Database</Source>
<Style />
<Left>0.125in</Left>
<Height>1.625in</Height>
<Value>=Fields!ImageBytes.Value</Value>
</Image>
</ReportItems>
<Width>6.125in</Width>
<Height>1.875in</Height>
</List>
</ReportItems>
<Height>2in</Height>
</Body>
<Language>en-US</Language>
<TopMargin>1in</TopMargin>
</Report>