在msdn中有一篇文章:演练:使用 LocalReport 对象进行打印 (C#)。我在测试过程中发现两个问题:1、每次打印完毕在指定报表的位置自动创建的图片不会自动清除;2、没有办法在程序中指定打印机的纸张规格(PageSize)。我想了很久,测试了很多次,始终解决不了,请高手指点迷津。谢谢!
下面是代码:
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;public class Demo : IDisposable
{
    private int m_currentPageIndex;
    private IList<Stream> m_streams;    private DataTable LoadSalesData()
    {
        DataSet dataSet = new DataSet();
        dataSet.ReadXml(@"c:\My Reports\data.xml");
        return dataSet.Tables[0];
    }    private Stream CreateStream(string name, 
      string fileNameExtension, Encoding encoding,
      string mimeType, bool willSeek)
    {
        Stream stream = new FileStream(@"c:\My Reports\" + name + 
          "." + fileNameExtension, FileMode.Create);
        m_streams.Add(stream);
        return stream;
    }    private void Export(LocalReport report)
    {
        string deviceInfo =
          "<DeviceInfo>" +
          "  <OutputFormat>EMF</OutputFormat>" +
          "  <PageWidth>8.5in</PageWidth>" +
          "  <PageHeight>11in</PageHeight>" +
          "  <MarginTop>0.25in</MarginTop>" +
          "  <MarginLeft>0.25in</MarginLeft>" +
          "  <MarginRight>0.25in</MarginRight>" +
          "  <MarginBottom>0.25in</MarginBottom>" +
          "</DeviceInfo>";
        Warning[] warnings;
        m_streams = new List<Stream>();
        report.Render("Image", deviceInfo, CreateStream, out warnings);        foreach (Stream stream in m_streams)
            stream.Position = 0;
    }    private void PrintPage(object sender, PrintPageEventArgs ev)
    {
        Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
        ev.Graphics.DrawImage(pageImage, ev.PageBounds);        m_currentPageIndex++;
        ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
    }    private void Print()
    {
        const string printerName = "Microsoft Office Document Image Writer";        if (m_streams == null || m_streams.Count == 0)
            return;        PrintDocument printDoc = new PrintDocument();
        printDoc.PrinterSettings.PrinterName = printerName;
        if (!printDoc.PrinterSettings.IsValid)
        {
            string msg = String.Format("Can't find printer \"{0}\".", printerName);
            MessageBox.Show(msg, "Print Error");
            return;
        }
        printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
        printDoc.Print();
    }    private void Run()
    {
        LocalReport report = new LocalReport();
        report.ReportPath = @"c:\My Reports\Report.rdlc";
        report.DataSources.Add(new ReportDataSource("Sales", LoadSalesData()));        Export(report);        m_currentPageIndex = 0;
        Print();
    }    public void Dispose()
    {
        if (m_streams != null)
        {
            foreach (Stream stream in m_streams)
                stream.Close();
            m_streams = null;
        }
    }    public static void Main(string[] args)
    {
        using (Demo demo = new Demo())
        {
            demo.Run();
        }
    }
}