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文件作为打印模板的更多相关文章

  1. [转]MSI安装程序中的文件替换

    原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装 ...

  2. 使用GDB 追踪依赖poco的so程序,core dump文件分析.

    前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...

  3. 安装程序无法复制文件 convlog.exe的解决方法

    在安装的时候出现一个错误提示“安装程序无法复制文件CONVLOG.EX_”,上网找了很多资料,都说是因为版本问题,考虑到自己的服务器安装的是2003 SP1,后来打了补丁到SP2的,也就认为是版本问题 ...

  4. VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)

    VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)-软件开发-鸡啄米 http://www.jizhuomi.com/software/143.html   鸡啄米在上一讲中 ...

  5. 将Java程序作成exe文件的几种方法【转载】

    看到网上有同志的介绍将Java程序作成exe文件的方法,写的不错,但是也许是这篇文章完成的时间比较早,许多内容已经不合适了.我在这里补充几条: 一.exe4j 说明:exe4j可以将Jar文件制作成e ...

  6. PHP程序缓存之文件缓存处理方式

    PHP程序缓存之文件缓存处理方式在开发程序过程中,缓存的设置大大提升程序效率,减小数据库负载.基本配置缓存和常规配置缓存 基本配置缓存在项目开发中类似这样子的格式: 文件:config.php $CF ...

  7. 程序一 用记事本建立文件src.dat,其中存放若干字符。编写程序,从文件src.dat中读取数据,统计其中的大写字母、小写字母、数字、其它字符的个数,并将这些数据写入到文件test.dat中。

    用记事本建立文件src.dat,其中存放若干字符.编写程序,从文件src.dat中读取数据,统计其中的大写字母.小写字母.数字.其它字符的个数,并将这些数据写入到文件test.dat中. #inclu ...

  8. 微信小程序新闻列表功能(读取文件、template模板使用)

    微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...

  9. 微信小程序-02-项目文件之间配合和调用关系

    微信小程序-02-项目文件之间配合和调用关系 我就不说那么多了,我是从官方文档拷贝的,然后加上一些自己的笔记,不喜勿喷 官方文档:https://developers.weixin.qq.com/mi ...

随机推荐

  1. python 锁 多进程

    参考: http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html http://linhs.blog.51cto.com/370259/1 ...

  2. hdu 4970 树状数组 “改段求段”

    题意:塔防.给1--n,给出m个塔,每个塔有攻击力,给出k个怪兽的位子和血量,问有几只可以到达n点. 今天刚刚复习了树状数组,就碰到这个题,区间更新.区间求和类型.第三类树状数组可以斩. 注意一下大数 ...

  3. LeetCode OJ-- Divide Two Integers *

    https://oj.leetcode.com/problems/divide-two-integers/ 在不使用乘法.除法.求余的情况下计算除法. 使用减法计算,看看减几次. 刚开始寻思朴素的暴力 ...

  4. K皇后问题递归解法

      #include<iostream> #include<cmath> #include<ctime> using namespace std; bool che ...

  5. 用chardet判断字符编码的方法

    转自http://www.cnblogs.com/xiaowuyi/archive/2012/03/09/2387173.html 用chardet判断字符编码的方法   1.chardet下载与安装 ...

  6. Factory Method 和AbstractFactory

    对应慕课视频的连接:https://www.imooc.com/video/5316 1,工厂模式的应用场景 有一组类似的对象需要被创建 在编码时不能预见需要被创建哪种类的实例 在系统需要考虑扩展性的 ...

  7. 使用charles远程调试iOS移动应用

    做iOS移动应用很多开发者会喜欢抓网络发包.回包来联调服务端借口以及定位其他网络问 题.如果在Windows系统可以使用fiddler来做iOS的远程代理,只要fiddler所在系统与iOS设备同时连 ...

  8. flash+xml无法显示中文的解决办法

    flash+xml用来做图片动态浏览效果相当不错,被广泛运用于电子相册制作,很多朋友都会从网上下载一些相关的flash源码下载参考,但是经常发现在使用过程中,修改了xml文件中的英文后要么文本不显示, ...

  9. HDU1565方格取数

    典型的状态压缩DP问题.第i行的取法只受到第i-1行的影响.首先每一行的取法要相容(不能有两个相邻),然后相邻行之间也要相容.将每一个格子看做两种状态,1表示取,0表示不取.这样每一行就是一个01串, ...

  10. DotnetBrowser入门教程-(2)启动简单的Web服务

    微软的网页服务向来与IIS捆绑紧密,虽然.net core可以脱离iis了,但是基于国内的xp系统,.net core类库的精简,使得我们仍然在dotnetbrowser增加了对web服务的支持. 先 ...