VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!

时间:2022-07-09 20:15:02
VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!
其实reportviewer是有打印按钮的,但是,现在要求做自定义打印的按钮。我在网上找了直接打印rdlc的代码,但是,现在,页面显示的效果和打印出来的效果完全不一样。求解。
正确图如下: VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!
现在的预览错误图如下: VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!
代码如下:

#region 打印
        private PrintDocument printDocument1 = new PrintDocument();//打印窗体
        string ktitle = string.Empty;

        //声明一个Stream对象的列表用来保存报表的输出数据
        //LocalReport对象的Render方法会将报表按页输出为多个Stream对象。
        private List<Stream> m_streams = new List<Stream>();
        //用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。
        private Stream CreateStream(string name, string fileNameExtension,
           Encoding encoding, string mimeType, bool willSeek)
        {
            //如果需要将报表输出的数据保存为文件,请使用FileStream对象。
            Stream stream = new MemoryStream();
            m_streams.Add(stream);
            return stream;
        }

        protected void btnPrint_Click1(object sender, EventArgs e)
        {
            try
            {
                //LocalReport report = new LocalReport();
                //设置需要打印的报表的文件名称。
                //report.ReportPath = @"Print/reportOrderPrint.rdlc";
                //创建要打印的数据源
                //ReportDataSource source = new ReportDataSource("OrderDataset", ObjectDataSource1);
                //report.DataSources.Add(source);
                //刷新报表中的需要呈现的数据
                //report.Refresh();
                LocalReport report = this.rvOrderPrint.LocalReport;
                string deviceInfo =
                     "<DeviceInfo>" +
                    "  <OutputFormat>EMF</OutputFormat>" +
                     "  <PageWidth>29.7cm</PageWidth>" +
                    "  <PageHeight>21cm</PageHeight>" +
                    "  <MarginTop>0.5cm</MarginTop>" +
                    "  <MarginLeft>0.5cm</MarginLeft>" +
                      "  <MarginRight>0.5cm</MarginRight>" +
                     "  <MarginBottom>0.5cm</MarginBottom>" +
                   "</DeviceInfo>";
                Warning[] warnings;
                //将报表的内容按照deviceInfo指定的格式输出到CreateStream函数提供的Stream中。
                report.Render("Image", deviceInfo, CreateStream, out warnings);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message);
            }
            Print();//打印事件
        }

        //用来记录当前打印到第几页了   
        private int m_currentPageIndex;
        private void Print()
        {
            m_currentPageIndex = 0;
            if (m_streams == null || m_streams.Count == 0)
                return;
            //声明PrintDocument对象用于数据的打印 
            PrintDocument printDoc = new PrintDocument();
            //指定需要使用的打印机的名称,使用空字符串""来指定默认打印机  
            //printDoc.PrinterSettings.PrinterName = "";
            //判断指定的打印机是否可用  
            //if (!printDoc.PrinterSettings.IsValid)
            //{
            //    MessageBox.Show("Can't find printer");
            //    return;
            //}
            //声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。  
            printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
            //执行打印操作,Print方法将触发PrintPage事件。  
            printDoc.DefaultPageSettings.PaperSize.RawKind = 9;
            //横版打印
            printDoc.DefaultPageSettings.Landscape = true;
            //打印预览                   
            PrintPreviewDialog ppd = new PrintPreviewDialog();
            ppd.Document = printDoc;
            if (DialogResult.OK == ppd.ShowDialog())
            {
                printDoc.Print();          //打印     
            }
        }

        private void PrintPage(object sender, PrintPageEventArgs ev)
        {
            //Metafile对象用来保存EMF或WMF格式的图形,  
            //我们在前面将报表的内容输出为EMF图形格式的数据流。        
            m_streams[m_currentPageIndex].Position = 0;
            Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
            ev.PageSettings.PaperSize.RawKind = 9;
            //指定是否横向打印
            ev.PageSettings.Landscape = true;
            //这里的Graphics对象实际指向了打印机   
            ev.Graphics.DrawImage(pageImage, 0, 0);
            m_streams[m_currentPageIndex].Close();
            m_currentPageIndex++;
            //设置是否需要继续打印  
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
        }

        #endregion

15 个解决方案

#1


LocalReport report = this.rvOrderPrint.LocalReport;
我这个把页面的报表直接复制过来,没错的啊,为什么打印的时候,样式出问题了呢?!

#2


如果我用 reportviewer 自带的 打印按钮,是没问题
但是,我现在是 自己放一个 button来打印,就出了问题
哎 。。BOSS要喊保存 订单是否已经被打印。 。我只有自定义打印事件
如果是 winform, 这很简单。 但是 web,我打印出来,样式就变了  

#3


下图为 控件自带的 打印按钮的预览效果图:
VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!

#4


你是不是把报表格式改了?

#5


引用 4 楼  的回复:
你是不是把报表格式改了?


我报表本来是设置好的,现在,我做自定义的打印按钮,你看我的代码,里面肯定有问题。 。请问,哪段代码有问题?

#6


没有其他人看了 ?

#7


是不是写了css,服务器事件就是这样的。 
样式在调用的时候id发生了变化,写弹出定位一下。

#8


引用 7 楼  的回复:
是不是写了css,服务器事件就是这样的。 
样式在调用的时候id发生了变化,写弹出定位一下。


css会影响? 弹出定位 什么意思 ?

#9



<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<link href="../ymPrompt-4.0/skin/qq/ymPrompt.css" rel="stylesheet" type="text/css" />
    <script src="../ymPrompt-4.0/ymPrompt.js" type="text/javascript"></script>
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div class="right1">
        <img src="../images/shouye.gif" width="18" height="18" alt="" align="middle" />
        当前位置:订单打印</div>
    <div class="right2" align="center">
        <div class="right2_tt" align="left">
            <div style="width: 760px; min-height: 400px;">
                <asp:Panel ID="panelPrint" runat="server">
                    <rsweb:ReportViewer ID="rvOrderPrint" runat="server" Width="760px" Font-Names="Verdana"
                        Font-Size="8pt" InteractiveDeviceInfos="(集合)" WaitMessageFont-Names="Verdana"
                        WaitMessageFont-Size="14pt">
                        <LocalReport ReportPath="Print\reportOrderPrint.rdlc">
                            <DataSources>
                                <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" Name="DataSet1" />
                            </DataSources>
                        </LocalReport>
                    </rsweb:ReportViewer>
                </asp:Panel>
                <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}"
                    SelectMethod="GetData" TypeName="Web.Print.OrderDatasetTableAdapters.OrderTodayPrintTableAdapter">
                    <SelectParameters>
                        <asp:Parameter Name="rantid" Type="String" />
                        <asp:Parameter Name="ordernolist" Type="String" />
                    </SelectParameters>
                </asp:ObjectDataSource>
            </div>
            <div class="qued" style="text-align: center; margin-top: 10px;">
                <asp:ImageButton ID="imgBtnLogin" runat="server" ImageUrl="~/images/back2.gif" TabIndex="4"
                    PostBackUrl="~/resrant/NewLunchOrders.aspx" />&nbsp;&nbsp;
                <asp:Button ID="btnPrint" runat="server" Text="打印" OnClick="btnPrint_Click1" Visible="false" />
                <asp:ImageButton ID="imgbtnSaveIsPrint" runat="server" 
                    ImageUrl="~/images/btnisprint.gif" onclick="imgbtnSaveIsPrint_Click" />&nbsp;&nbsp;
                <asp:ImageButton ID="imgbtnSavePrintOrder" runat="server" 
                    ImageUrl="~/images/btnprintorder.gif" onclick="imgbtnSavePrintOrder_Click" />
            </div>
        </div>
        <div class="right3">
            <img src="../images/right_b_03.jpg" alt="" />
        </div>
    </div>

<asp:Button ID="btnPrint" runat="server" Text="打印" OnClick="btnPrint_Click1" Visible="false" />
这个按钮的事件里面 。

#10


请问楼主问题解决了吗,,,,我也碰到这问题。感觉2010的问题

#11


研究了下,可能是在vs2010下DrawImage画图区别吧,具体原因不清。。。
将ev.Graphics.DrawImage(pageImage, 0, 0);
改成下面指定的大小缩放就可以了
ev.Graphics.DrawImage(pageImage, ev.PageBounds, 0, 0, ev.PageBounds.Width, ev.PageBounds.Height, System.Drawing.GraphicsUnit.Millimeter);

#12


引用 11 楼  的回复:
研究了下,可能是在vs2010下DrawImage画图区别吧,具体原因不清。。。
将ev.Graphics.DrawImage(pageImage, 0, 0);
改成下面指定的大小缩放就可以了
ev.Graphics.DrawImage(pageImage, ev.PageBounds, 0, 0, ev.PageBounds.Width, ev.PageBounds.Height, S……

我试试

#13


VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!
感觉还有点问题 。怎么在reportviewer里面都是正常的呢。 。晕死,我还要去缩小单元格

#14


            Rectangle adjustedRect = new Rectangle(
            ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
            ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
            ev.PageBounds.Width,
            ev.PageBounds.Height);

            ev.Graphics.FillRectangle(Brushes.White, adjustedRect);

            ev.Graphics.DrawImage(pageImage, adjustedRect);
你试下这样.

#15


为什么我发布以后,这个直接打印没有用,总是在客户端提示“未安装打印机”

#1


LocalReport report = this.rvOrderPrint.LocalReport;
我这个把页面的报表直接复制过来,没错的啊,为什么打印的时候,样式出问题了呢?!

#2


如果我用 reportviewer 自带的 打印按钮,是没问题
但是,我现在是 自己放一个 button来打印,就出了问题
哎 。。BOSS要喊保存 订单是否已经被打印。 。我只有自定义打印事件
如果是 winform, 这很简单。 但是 web,我打印出来,样式就变了  

#3


下图为 控件自带的 打印按钮的预览效果图:
VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!

#4


你是不是把报表格式改了?

#5


引用 4 楼  的回复:
你是不是把报表格式改了?


我报表本来是设置好的,现在,我做自定义的打印按钮,你看我的代码,里面肯定有问题。 。请问,哪段代码有问题?

#6


没有其他人看了 ?

#7


是不是写了css,服务器事件就是这样的。 
样式在调用的时候id发生了变化,写弹出定位一下。

#8


引用 7 楼  的回复:
是不是写了css,服务器事件就是这样的。 
样式在调用的时候id发生了变化,写弹出定位一下。


css会影响? 弹出定位 什么意思 ?

#9



<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<link href="../ymPrompt-4.0/skin/qq/ymPrompt.css" rel="stylesheet" type="text/css" />
    <script src="../ymPrompt-4.0/ymPrompt.js" type="text/javascript"></script>
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div class="right1">
        <img src="../images/shouye.gif" width="18" height="18" alt="" align="middle" />
        当前位置:订单打印</div>
    <div class="right2" align="center">
        <div class="right2_tt" align="left">
            <div style="width: 760px; min-height: 400px;">
                <asp:Panel ID="panelPrint" runat="server">
                    <rsweb:ReportViewer ID="rvOrderPrint" runat="server" Width="760px" Font-Names="Verdana"
                        Font-Size="8pt" InteractiveDeviceInfos="(集合)" WaitMessageFont-Names="Verdana"
                        WaitMessageFont-Size="14pt">
                        <LocalReport ReportPath="Print\reportOrderPrint.rdlc">
                            <DataSources>
                                <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" Name="DataSet1" />
                            </DataSources>
                        </LocalReport>
                    </rsweb:ReportViewer>
                </asp:Panel>
                <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}"
                    SelectMethod="GetData" TypeName="Web.Print.OrderDatasetTableAdapters.OrderTodayPrintTableAdapter">
                    <SelectParameters>
                        <asp:Parameter Name="rantid" Type="String" />
                        <asp:Parameter Name="ordernolist" Type="String" />
                    </SelectParameters>
                </asp:ObjectDataSource>
            </div>
            <div class="qued" style="text-align: center; margin-top: 10px;">
                <asp:ImageButton ID="imgBtnLogin" runat="server" ImageUrl="~/images/back2.gif" TabIndex="4"
                    PostBackUrl="~/resrant/NewLunchOrders.aspx" />&nbsp;&nbsp;
                <asp:Button ID="btnPrint" runat="server" Text="打印" OnClick="btnPrint_Click1" Visible="false" />
                <asp:ImageButton ID="imgbtnSaveIsPrint" runat="server" 
                    ImageUrl="~/images/btnisprint.gif" onclick="imgbtnSaveIsPrint_Click" />&nbsp;&nbsp;
                <asp:ImageButton ID="imgbtnSavePrintOrder" runat="server" 
                    ImageUrl="~/images/btnprintorder.gif" onclick="imgbtnSavePrintOrder_Click" />
            </div>
        </div>
        <div class="right3">
            <img src="../images/right_b_03.jpg" alt="" />
        </div>
    </div>

<asp:Button ID="btnPrint" runat="server" Text="打印" OnClick="btnPrint_Click1" Visible="false" />
这个按钮的事件里面 。

#10


请问楼主问题解决了吗,,,,我也碰到这问题。感觉2010的问题

#11


研究了下,可能是在vs2010下DrawImage画图区别吧,具体原因不清。。。
将ev.Graphics.DrawImage(pageImage, 0, 0);
改成下面指定的大小缩放就可以了
ev.Graphics.DrawImage(pageImage, ev.PageBounds, 0, 0, ev.PageBounds.Width, ev.PageBounds.Height, System.Drawing.GraphicsUnit.Millimeter);

#12


引用 11 楼  的回复:
研究了下,可能是在vs2010下DrawImage画图区别吧,具体原因不清。。。
将ev.Graphics.DrawImage(pageImage, 0, 0);
改成下面指定的大小缩放就可以了
ev.Graphics.DrawImage(pageImage, ev.PageBounds, 0, 0, ev.PageBounds.Width, ev.PageBounds.Height, S……

我试试

#13


VS2010 RDLC直接打印,样式和web页面显示的不一样,求解!!!
感觉还有点问题 。怎么在reportviewer里面都是正常的呢。 。晕死,我还要去缩小单元格

#14


            Rectangle adjustedRect = new Rectangle(
            ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
            ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
            ev.PageBounds.Width,
            ev.PageBounds.Height);

            ev.Graphics.FillRectangle(Brushes.White, adjustedRect);

            ev.Graphics.DrawImage(pageImage, adjustedRect);
你试下这样.

#15


为什么我发布以后,这个直接打印没有用,总是在客户端提示“未安装打印机”