读书人

C# 怎么自动打印

发布时间: 2012-12-29 10:28:09 作者: rapoo

C# 如何自动打印
C# 如何自动打印 [.NET技术 C#]
[解决办法]
你是指用c#编程?还是问的普通的办公问题?普通办公问题:麻烦你打开“苏州001.doc”,文件->打印->选择好相应城市的打印机->打印编程问题:获取文件名中的城市名你会吧,然后根据城市名得到打印机名(这一步只能你手动设定,比如苏州(城市名)对应打印机名是001,你也可以把对应的打印机名设为城市名 这样就ok了)然后运用打印类: public class RawPrinterHelper { // [Methods] [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, SetLastError = true, ExactSpelling = true)] public static extern bool ClosePrinter(IntPtr hPrinter); [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, SetLastError = true, ExactSpelling = true)] public static extern bool EndDocPrinter(IntPtr hPrinter); [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, SetLastError = true, ExactSpelling = true)] public static extern bool EndPagePrinter(IntPtr hPrinter); [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd); public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, int dwCount) { int dwError = 0; int dwWritten = 0; IntPtr hPrinter = new IntPtr(0); DOCINFOA di = new DOCINFOA(); bool bSuccess = false; di.pDocName = "My C#.NET RAW Document"; di.pDataType = "RAW"; if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) { if (StartDocPrinter(hPrinter, 1, di)) { if (StartPagePrinter(hPrinter)) { bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten); EndPagePrinter(hPrinter); } EndDocPrinter(hPrinter); } ClosePrinter(hPrinter); } if (!bSuccess) { dwError = Marshal.GetLastWin32Error(); } return bSuccess; } public static bool SendFileToPrinter(string szPrinterName, string szFileName) { FileStream fs = new FileStream(szFileName, FileMode.Open); BinaryReader br = new BinaryReader(fs); byte[] bytes = new byte[fs.Length]; bool bSuccess = false; IntPtr pUnmanagedBytes = new IntPtr(0); int nLength = Convert.ToInt32(fs.Length); bytes = br.ReadBytes(nLength); pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength); Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength); bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength); Marshal.FreeCoTaskMem(pUnmanagedBytes); return bSuccess; } public static bool SendStringToPrinter(string szPrinterName, string szString) { int dwCount = szString.Length; IntPtr pBytes = Marshal.StringToCoTaskMemAnsi(szString); SendBytesToPrinter(szPrinterName, pBytes, dwCount); Marshal.FreeCoTaskMem(pBytes); return true; } [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern bool StartDocPrinter(IntPtr hPrinter, int level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di); [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, SetLastError = true, ExactSpelling = true)] public static extern bool StartPagePrinter(IntPtr hPrinter); [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, SetLastError = true, ExactSpelling = true)] public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, int dwCount, out int dwWritten); //Nested Types [StructLayout(LayoutKind.Sequential)] public class DOCINFOA { [MarshalAs(UnmanagedType.LPStr)] public string pDocName; [MarshalAs(UnmanagedType.LPStr)] public string pOutputFile; [MarshalAs(UnmanagedType.LPStr)] public string pDataType; } }这是网上的一个比较标准的打印类,比较好用,直接copy然后:SendFileToPrinter(打印机名,文件名).


[解决办法]
C#实现打印方式有很多种方法的,你可以尝试一下js:

script language="Javascript">function preview(){ bdhtml=window.document.body.innerHTML; sprnstr="<!--startprint-->"; eprnstr="<!--endprint-->"; prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17); prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr)); window.document.body.innerHTML=prnhtml; window.print();}</script><!--省略部分代码--><form id="WebForm1" method="post" runat="server"> <center>本部分以上不被打印</center> <!--startprint--> <div align="center"> <asp:DataGrid id="dgShow" runat="server"> <!--省略部分代码--> </asp:DataGrid> </div> <!--endprint--> <center>本部分以下不被打印</center> <div align="center"> <input type="button" name="print" value="预览并打印" onclick="preview()"> </div> <style> @media Print { .Noprn { DISPLAY: none }} </style> <p class="Noprn">不打印</p> <table id="datagrid"> <tr> <td>打印</td> </tr> </table> <input class="Noprn" type="button" onclick="window.print()" value="print"></form>

读书人网 >.NET

热点推荐