C# C/S程序使用HTML文件作为打印模板
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文件作为打印模板的更多相关文章
- [转]MSI安装程序中的文件替换
原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装 ...
- 使用GDB 追踪依赖poco的so程序,core dump文件分析.
前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...
- 安装程序无法复制文件 convlog.exe的解决方法
在安装的时候出现一个错误提示“安装程序无法复制文件CONVLOG.EX_”,上网找了很多资料,都说是因为版本问题,考虑到自己的服务器安装的是2003 SP1,后来打了补丁到SP2的,也就认为是版本问题 ...
- VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)
VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)-软件开发-鸡啄米 http://www.jizhuomi.com/software/143.html 鸡啄米在上一讲中 ...
- 将Java程序作成exe文件的几种方法【转载】
看到网上有同志的介绍将Java程序作成exe文件的方法,写的不错,但是也许是这篇文章完成的时间比较早,许多内容已经不合适了.我在这里补充几条: 一.exe4j 说明:exe4j可以将Jar文件制作成e ...
- PHP程序缓存之文件缓存处理方式
PHP程序缓存之文件缓存处理方式在开发程序过程中,缓存的设置大大提升程序效率,减小数据库负载.基本配置缓存和常规配置缓存 基本配置缓存在项目开发中类似这样子的格式: 文件:config.php $CF ...
- 程序一 用记事本建立文件src.dat,其中存放若干字符。编写程序,从文件src.dat中读取数据,统计其中的大写字母、小写字母、数字、其它字符的个数,并将这些数据写入到文件test.dat中。
用记事本建立文件src.dat,其中存放若干字符.编写程序,从文件src.dat中读取数据,统计其中的大写字母.小写字母.数字.其它字符的个数,并将这些数据写入到文件test.dat中. #inclu ...
- 微信小程序新闻列表功能(读取文件、template模板使用)
微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...
- 微信小程序-02-项目文件之间配合和调用关系
微信小程序-02-项目文件之间配合和调用关系 我就不说那么多了,我是从官方文档拷贝的,然后加上一些自己的笔记,不喜勿喷 官方文档:https://developers.weixin.qq.com/mi ...
随机推荐
- 牛客网 牛客小白月赛1 E.圆与三角形-公式题
E.圆与三角形 链接:https://www.nowcoder.com/acm/contest/85/E来源:牛客网 这个题把公式推一下, 发现就是1+sinA*r,sinA最大为1,所以 ...
- FZU 1078 计算循环冗余码【模拟】
计算机网络中采用循环冗余码来校验数据的正确性.其原理是:发送方计算出待发送的二进制数据的循环冗余码,并随同原数据一起发送到接收方:接收方通过重新计算接收到的数据的循环冗余码,并和收到的循环冗余码进行比 ...
- [Machine Learning with Python] My First Data Preprocessing Pipeline with Titanic Dataset
The Dataset was acquired from https://www.kaggle.com/c/titanic For data preprocessing, I firstly def ...
- RabbitMq解决分布式事物
一.RabbitMQ解决分布式事务思路: 案例: 经典案例,以目前流行点外卖的案例,用户下单后,调用订单服务,让后订单服务调用派单系统通知送外卖人员送单,这时候订单系统与派单系统采用MQ异步通讯. 二 ...
- 纯手写Myatis框架
1.接口层-和数据库交互的方式 MyBatis和数据库的交互有两种方式: 使用传统的MyBatis提供的API: 使用Mapper接口: 2.使用Mapper接口 MyBatis 将配置文件中的每一个 ...
- iphone之判断屏幕方向
有两种方法可以判断 1,程序刚开始运行的时候,不能获取当前方向.给你说几种方式,你试一下: 1. 可以在启动后0.01秒执行初始化的代码,这个时候就可以获取设备方向了. 2. 另外一种方式,借助状态栏 ...
- Oracle 11gR2 RAC 单网卡 转 双网卡绑定 配置步骤
之前写过一篇双网卡绑定的文章,如下: Oracle RAC 与 网卡绑定 http://blog.csdn.net/tianlesoftware/article/details/6189639 Ora ...
- VS2010 MFC中 静态编译设置方法
问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等 解决方法:1.将这些dll打包,和应用程序一起发布;2.采用MFC静态编译; 静态编译: ...
- MFC中的CDC详细教程
参考: MFC中的CDC详细教程1,2,3 StretchDIBits用法
- Geographical distance
Introduction Calculating the distance between geographical coordinates is based on some level of abs ...