水晶報表自定義紙張大小打印 (轉)

水晶報表自定義紙張大小打印 (Crystal Report Print with custom paper size)

 

水晶報表查看器CrystalReportViewer自帶打印功能,調用當前系統默認打印機進行打印,但.NET裏的水晶版本不支持Web打印,需要水晶報表10以上的版本才支持。另外由於其他原因,我們大多需要自己寫代碼進行打印,這就牽扯到如何寫代碼、如何設置打印參數的問題,以下是一些基本知識:

打印的基本代碼:

CrystalReport1 report = new CrystalReport1(); //Report爲你自己的報表名
PageMargins margins;
margins = Report.PrintOptions.PageMargins;
margins.bottomMargin = 250;
margins.leftMargin = 350;
margins.rightMargin = 350;
margins.topMargin = 350;
// Apply the page margins.
Report.PrintOptions.ApplyPageMargins(margins);

// Select the printer.
string printerName = "\\\\局域網機器名\\打印機名(例如HP 2100)"; //本地打印機直接指定名稱
Report.PrintOptions.PrinterName = printerName;          //指定打印機名稱
Report.PrintOptions.PaperSize = PaperSize.PaperA4;   //指定紙張尺寸

report.PrintToPrinter(1, true, 1, 4);

 

本文由xwdd129編寫,轉載請註明出處,謝謝!

下面簡單就打印中的參數進行說明:

PrintOptions類,提供用於設置報表打印選項的屬性和方法。

PrintOptions成員:
    PageContentHeight---Int32,獲取頁面內容的高度
    PageContentWidth---Int32,獲取頁面內容的寬度
    PageMargins---獲取報表的邊距
    PageOrientation---獲取或設置打印機紙張方向
    Pagesize---獲取或設置當前打印機紙張的大小
    PrinterName---字符串,獲取或設置報表所使用的打印機名稱

ReportDocument.PrintToPrinter方法
public virtual void PrintToPrinter( int nCopies, bool collated, int startPageN, int endPageN )
    nCopies 指明要打印的分數
    collated 指明是否逐份打印
    startPageN 指明要打印的第一頁
    endPageN 指明要打印的最後一頁

發表於 @ 2006年06月01日 16:00:00|評論(3)|編輯

新一篇: 正在換工作…… | 舊一篇: 關於推模式水晶報表數據源的設置問題評論
#DaChu 發表於2007-09-24 12:04:54 IP: 121.28.161.*
margins = Report.PrintOptions.PageMargins
其中Report需要添加哪個引用?
我的是11.5版本,使用CRAXDRT.Report
系統告之:不包含PrintOptions定義

謝謝
[email protected]#pshy 發表於2007-12-18 09:48:17 IP: 59.36.90.*
Papersize裏面就只有那些紙張格式,請問還能增加自定義的紙張???#pshy 發表於2007-12-18 09:49:46 IP: 59.36.90.*
或者能自定義一個類似Papersize的類嗎?

 

因爲水晶報表的PaperSize是enum類型,但有時客戶用的紙張不在其定義範圍內,雖然在設計報表時可以選擇目的打印機和紙型,但如果重新配置過該打印機則報表默認紙型不再有效,報表將按A4進行預覽且會失真。

//獲取本機所有打印機將其名稱填充到comboBoxPrinters中:包含本地和網絡打印機

foreach(string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
    this.comboBoxPrinters.Items.Add(printer);
}


//當從comboBoxPrinters中選擇打印機時獲取其支持的紙張大小將其填充到listBoxPapers

this.listBoxPapers.Items.Clear();
string printer = this.comboBoxPrinters.Text;
this.m_printer = printer;
Microsoft.Win32.RegistryKey rk;
if(!this.comboBoxPrinters.Text.StartsWith(@"\\"))        //本地打印機

     rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\" + this.comboBoxPrinters.Text + "\\DsDriver");
else                                //網絡打印機

{
               
    string[] p = printer.Remove(0,2).Split(new char[] { '\\' });
    string path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Providers\\LanMan Print Services\\Servers\\" + p[0] + "\\Printers\\" + p[1] + "\\DsDriver";
     rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(path);
}

string[] papers = (string[])(rk.GetValue("printMediaSupported"));
for(int i=0;i<papers.Length;i++)
{
    this.listBoxPapers.Items.Add(papers[i]);
}

//根據紙張名稱獲取其所在本地機上的PaperSize:調用的是PaperSizeGetter.Get_PaperSizes靜態方法(是從水晶報表中reflect精簡出來的,版權歸原作者所有)

    public class PaperSizeGetter
    {
        public static string OutputPort = String.Empty;

        [DllImport("winspool.drv", CharSet=CharSet.Auto, SetLastError=true)]
        public static extern int DeviceCapabilities(string pDevice, string pPort, short fwCapabilities, IntPtr pOutput, IntPtr pDevMode);

        public static int[] Get_PaperSizes(string printer)
        {
            string text1 = printer;
            int num1 = FastDeviceCapabilities(0x10, IntPtr.Zero, -1, text1);
            if (num1 == -1)
            {
                return new int[0];
            }
            int num2 = Marshal.SystemDefaultCharSize * 0x40;
            IntPtr ptr1 = Marshal.AllocCoTaskMem(num2 * num1);
             FastDeviceCapabilities(0x10, ptr1, -1, text1);
            IntPtr ptr2 = Marshal.AllocCoTaskMem(2 * num1);
             FastDeviceCapabilities(2, ptr2, -1, text1);
            IntPtr ptr3 = Marshal.AllocCoTaskMem(8 * num1);
             FastDeviceCapabilities(3, ptr3, -1, text1);
            int[] sizeArray1 = new int[num1];
            for (int num3 = 0; num3 < num1; num3++)
            {
                string text2 = Marshal.PtrToStringAuto((IntPtr) (((long) ptr1) + (num2 * num3)), 0x40);
                int num4 = text2.IndexOf('\0');
                if (num4 > -1)
          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章