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>

时间: 2024-10-01 05:31:35

C# C/S程序使用HTML文件作为打印模板的相关文章

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

原文链接:http://teach.hanzify.org/article/652-1233562028.html 前言 最近有汉化朋友问起如何不重新制作MSI文件,而直接用汉化好的文件替换MSI安装程序中的文件.为此,将本人的实践经验作个总结,供各位汉化人参考.有错误的地方烦请指正.※说明:目前可以用于MSI编辑的软件很多,但是有些软件在保存时会在MSI文件中写入一些自己的表或内容,有些会另外嵌入一个CAB文件,使得MSI文件增大.而这里提供的方法保证不会写入任何不必要的内容和文件.※关键点:

c#程序将excel文件转换成xml文件

要程序你自己去组装去,我只写两个部分,一个是读Excel的部分,然后是写入到xml的1) 从指定的excel读出信息string strConn="provider=Microsoft.Jet.OLEDB.4.0;data source=你的Excel文件.xls;Extended Properties=Excel 8.0;";DataSet ds=new DataSet();System.Data.OleDb.OleDbConnection oleConn=new System.Da

C程序中头文件相互包含精华(转载)

C程序中头文件相互包含精华(网摘小结) 收藏(转自:http://blog.csdn.net/lingyun3429/archive/2010/04/27/5535191.aspx).h中一般放的是同名.c文件中定义的变量.数组.函数的声明,需要让.c外部使用的声明. 1)h文件作用 1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明: 2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h). 2)h文件里应该有什么 常量,结构,类型定义,函数,

MFC Wizard创建的空应用程序中各个文件内容的解析

创建的MFC应用程序名为:wd,那么: 一.wd.h解析 // wd.h : main header file for the WD application // #if !defined(AFX_WD_H__89BE48D2_F377_4DF1_8C44_4D7372A61CE0__INCLUDED_) #define AFX_WD_H__89BE48D2_F377_4DF1_8C44_4D7372A61CE0__INCLUDED_ //////////////////////////////

用程序读取CSV文件的方法

CSV全称 Comma Separated values,是一种用来存储数据的纯文本文件格式,通常用于电子表格或数据库软件.用Excel或者Numbers都可以导出CSV格式的数据. CSV文件的规则 0 开头是不留空,以行为单位.1 可含或不含列名,含列名则居文件第一行. 2 一行数据不垮行,无空行. 3 以半角符号,作分隔符,列为空也要表达其存在. 4 列内容如存在,,则用""包含起来. 5 列内容如存在""则用""""包

c# winform 获取当前程序运行根目录,winform 打开程序运行的文件夹

// 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName // 获取和设置当前目录(该进程从中启动的目录)的完全限定目录. System.Environment.CurrentDirectory // 获取应用程序的当前工作目录. System.IO.Directory.GetC

编写程序实现读取文件前几行

1 #编写程序实现读取文件前几行 2 def print_line(file_name): 3 line = int(input('请输入要显示前几行:')) 4 f = open(file_name) 5 for each_line in range(0,line): 6 print(f.readline()) 7 8 file_name = input('请输入要打开的文件名:') 9 print_line(file_name)

java程序执行sql文件

List<String> sqlFileList = new ArrayList<String>();从文件读放内容到按分号放到sqlFileListpublic List<String> readSqlFiles(List<String> fileNameList) {List<String> sqlList = new ArrayList<String>();for (String fileName : fileNameList)

Android应用程序相关的文件文件夹具体解释

一.方法介绍:         每一个Android应用程序都能够通过Context来获取与应用程序相关的文件夹,这些文件夹的功能各异,每一个文件夹都有自己的特点.有时候可能会搞混淆,本文结合android源代码凝视和实际操作.具体介绍一下每一个方法: 方法:getFilesDir 释义:返回通过Context.openFileOutput()创建和存储的文件系统的绝对路径,应用程序文件,这些文件会在程序被卸载的时候所有删掉. 方法:getCacheDir 释义:返回应用程序指定的缓存文件夹,这