C# C/S程式使用HTML檔案作為列印模板

來源:互聯網
上載者:User

標籤:style   color   io   os   ar   使用   for   sp   檔案   

     C#   C/S程式使用HTML檔案作為列印模板

      在網上找了一堆的資料,整理到鬱悶呀,慢慢試慢慢改,哎,終於成功了,哈,菜鳥傷不起呀

     

 public partial class Print : Form
    {

       // 定義dgSetPage委託進行列印時的選項設定
        public delegate void dgSetPage();   

       //定義dgFileDelete 委託進行列印完成後,刪除填充後的模板檔案
        public delegate void dgFileDelete();

 

        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
 
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
 

        //定義SendMessage方法內使用的按一下滑鼠 常量

        const int BM_CLICK = 0xF5;
 

 

        private void btnPrint_Click(object sender, EventArgs e)
        {
            btnPrint.Enabled = false;

 

           //因為是使用WebBrowser對象進行列印HTML檔案,所以無法控制版面設定,需要使用註冊表修改一些內容

           //方法 ChangePageSettingByRegist ,修改註冊表,取消頁首、頁角項目
            ChangePageSettingByRegist();

 

           //讀取資料填充HTML模板
            string sFillDataResult=FillDataToNewFile();


            if (sFillDataResult.IndexOf("NG") >= 0)
            {
                MessageBox.Show(sFillDataResult);
                return;
            }

            pd_PrintPage(); 
            btnPrint.Enabled = true;
        }

        private void pd_PrintPage()
        {
            //建立一個WebBrowser對象,然後用它在後台開啟並解釋HTML檔案
            WebBrowser webBrowserForPrinting = new WebBrowser();

   

           //  lblNewFile.Text  儲存是填充後的模板檔案名稱 
            webBrowserForPrinting.Url = new Uri(Application.StartupPath.ToString() + "\\" +  lblNewFile.Text);

            //當負載檔案完成後激發手動追加的事件
            webBrowserForPrinting.DocumentCompleted +=   new WebBrowserDocumentCompletedEventHandler(PrintDocument);
            webBrowserForPrinting.Focus();
        }


        private void PrintDocument(object sender,WebBrowserDocumentCompletedEventArgs e)
        { 
            //建立一個新的線程,用於當彈出版面設定對話方塊時發送設定為橫向的指令
            Thread th = new Thread(new ThreadStart(new dgSetPage(SetPage)));
            th.Start(); 

            //彈出版面設定對話方塊-----即上方定義的新進程需要處理的視窗
            ((WebBrowser)sender).ShowPageSetupDialog();

            //列印
            ((WebBrowser)sender).Print();
           
            //釋放資源
            ((WebBrowser)sender).Dispose();

            //刪除填充後的模板檔案,防止重複列印
            System.IO.File.Delete(lblNewFile.Text);
            lblNewFile.Text = "";
        }

 

        //  此處方式被注釋掉了,因為如果需要修改主視窗內控制項的內容或者狀況裡需要使用委託調用修改方法

       //  需要時,把SetPage與SetPage2名稱互換即可在變更後的名稱為SetPage2內添加修改主視窗內容的代碼
        //private void SetPage2()
        //{
        //    //建立委派物件
        //    MethodInvoker In = new MethodInvoker(SetPage2);
        //    this.BeginInvoke(In);
        //}

        private void SetPage()
        {
            int i = 0;

          //      此處需要設定迴圈尋找時間,目前為超過10秒未找到結束尋找
          while (true)
            {
                IntPtr WindownHand = FindWindow("#32770", "版面設定");
                if (WindownHand != IntPtr.Zero)
                {

                    //找到視窗內子項目的名柄,然後類比滑鼠左鍵單擊事件
                    IntPtr Wk = FindWindowEx(WindownHand, IntPtr.Zero, null, "橫向(&A)");
                    SendMessage(Wk, BM_CLICK, 0, 0);

                    IntPtr Wk1 = FindWindowEx(WindownHand, IntPtr.Zero, null, "確定");
                    SendMessage(Wk1, BM_CLICK, 0, 0);

 
                    break;
                }
                else
                {
                    if (i > 20)
                        break;
                    Thread.Sleep(500);
                    i++;
                }
            }

         

        }

        //修改註冊表,把頁首頁尾拿掉,然後設定為縮放至一頁
        private void ChangePageSettingByRegist()
        {
            RegistryKey hklm = Registry.CurrentUser;
            RegistryKey software = hklm.OpenSubKey(@"Software\Microsoft\Internet Explorer\PageSetup".ToUpper(), true);
            object A = (object)"";
            object B = (object)"0.5";
            object C = (object)"0";
            software.SetValue("header", A);
            software.SetValue("footer", A);
            software.SetValue("margin_bottom", B);
            software.SetValue("margin_left", C);
            software.SetValue("margin_right", C);
            software.SetValue("margin_top", C);
            software.SetValue("Shrink_To_Fit","yes");          

        }

 


HTML模板內容片段

     <%A%>  預留位置,用於替換

    <table cellpadding="0" cellspacing="0" border="0px">
        <tr><td colspan="8"  class="EachPartSpace"></td></tr>
        <tr><td class="LayOutFieldTitle" colspan="8">Machine Protocol</td></tr>       
        <tr>
            <td class="FieldNameHorizontal Column1With">Purchase Order No:</td>
            <td class="FieldValueHorizontal Column2With"><%OrderNo%></td>
            <td class="FieldNameHorizontal Column1With">Unit No:</td>
            <td class="FieldValueHorizontal Column2With"><%UnitNo%></td>
            <td class="FieldNameHorizontal Column1With">Region:</td>
            <td class="FieldValueHorizontal Column6With"><%Region%></td>
            <td class="FieldNameHorizontal Column2With">Assembly date:</td>
            <td class="FieldValueHorizontal Column2With"><%AssemblyDate%></td>
        </tr>

 

C# C/S程式使用HTML檔案作為列印模板

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.