如何通过使用 Visual C#.net 将原始数据发送到打印机

  1  public  class RawPrinterHelper
  2 {
  3      //  Structure and API declarions:
  4      [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
  5      public  class DOCINFOA
  6     {
  7         [MarshalAs(UnmanagedType.LPStr)]  public  string pDocName;
  8         [MarshalAs(UnmanagedType.LPStr)]  public  string pOutputFile;
  9         [MarshalAs(UnmanagedType.LPStr)]  public  string pDataType;
 10     }
 11     [DllImport( " winspool.Drv ", EntryPoint= " OpenPrinterA ", SetLastError= true, CharSet=CharSet.Ansi, ExactSpelling= true, CallingConvention=CallingConvention.StdCall)]
 12      public  static  extern  bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)]  string szPrinter,  out IntPtr hPrinter, IntPtr pd);
 13 
 14     [DllImport( " winspool.Drv ", EntryPoint= " ClosePrinter ", SetLastError= true, ExactSpelling= true, CallingConvention=CallingConvention.StdCall)]
 15      public  static  extern  bool ClosePrinter(IntPtr hPrinter);
 16 
 17     [DllImport( " winspool.Drv ", EntryPoint= " StartDocPrinterA ", SetLastError= true, CharSet=CharSet.Ansi, ExactSpelling= true, CallingConvention=CallingConvention.StdCall)]
 18      public  static  extern  bool StartDocPrinter( IntPtr hPrinter, Int32 level,  [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);
 19 
 20     [DllImport( " winspool.Drv ", EntryPoint= " EndDocPrinter ", SetLastError= true, ExactSpelling= true, CallingConvention=CallingConvention.StdCall)]
 21      public  static  extern  bool EndDocPrinter(IntPtr hPrinter);
 22 
 23     [DllImport( " winspool.Drv ", EntryPoint= " StartPagePrinter ", SetLastError= true, ExactSpelling= true, CallingConvention=CallingConvention.StdCall)]
 24      public  static  extern  bool StartPagePrinter(IntPtr hPrinter);
 25 
 26     [DllImport( " winspool.Drv ", EntryPoint= " EndPagePrinter ", SetLastError= true, ExactSpelling= true, CallingConvention=CallingConvention.StdCall)]
 27      public  static  extern  bool EndPagePrinter(IntPtr hPrinter);
 28 
 29     [DllImport( " winspool.Drv ", EntryPoint= " WritePrinter ", SetLastError= true, ExactSpelling= true, CallingConvention=CallingConvention.StdCall)]
 30      public  static  extern  bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount,  out Int32 dwWritten );
 31 
 32      //  SendBytesToPrinter()
 33       //  When the function is given a printer name and an unmanaged array
 34       //  of bytes, the function sends those bytes to the print queue.
 35       //  Returns true on success, false on failure.
 36       public  static  bool SendBytesToPrinter(  string szPrinterName, IntPtr pBytes, Int32 dwCount)
 37     {
 38         Int32    dwError =  0, dwWritten =  0;
 39         IntPtr    hPrinter =  new IntPtr( 0);
 40         DOCINFOA    di =  new DOCINFOA();
 41          bool    bSuccess =  false//  Assume failure unless you specifically succeed.
 42 
 43         di.pDocName =  " My C#.NET RAW Document ";
 44         di.pDataType =  " RAW ";
 45 
 46          //  Open the printer.
 47           if( OpenPrinter( szPrinterName.Normalize(),  out hPrinter, IntPtr.Zero ) )
 48         {
 49              //  Start a document.
 50               if( StartDocPrinter(hPrinter,  1, di) )
 51             {
 52                  //  Start a page.
 53                   if( StartPagePrinter(hPrinter) )
 54                 {
 55                      //  Write your bytes.
 56                      bSuccess = WritePrinter(hPrinter, pBytes, dwCount,  out dwWritten);
 57                     EndPagePrinter(hPrinter);
 58                 }
 59                 EndDocPrinter(hPrinter);
 60             }
 61             ClosePrinter(hPrinter);
 62         }
 63          //  If you did not succeed, GetLastError may give more information
 64           //  about why not.
 65           if( bSuccess ==  false )
 66         {
 67                 dwError = Marshal.GetLastWin32Error();
 68         }
 69          return bSuccess;
 70     }
 71 
 72      public  static  bool SendFileToPrinter(  string szPrinterName,  string szFileName )
 73     {
 74          //  Open the file.
 75          FileStream fs =  new FileStream(szFileName, FileMode.Open);
 76          //  Create a BinaryReader on the file.
 77          BinaryReader br =  new BinaryReader(fs);
 78          //  Dim an array of bytes big enough to hold the file's contents.
 79          Byte []bytes =  new Byte[fs.Length];
 80          bool bSuccess =  false;
 81          //  Your unmanaged pointer.
 82          IntPtr pUnmanagedBytes =  new IntPtr( 0);
 83          int nLength;
 84 
 85         nLength = Convert.ToInt32(fs.Length);
 86          //  Read the contents of the file into the array.
 87          bytes = br.ReadBytes( nLength );
 88          //  Allocate some unmanaged memory for those bytes.
 89          pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
 90          //  Copy the managed byte array into the unmanaged array.
 91          Marshal.Copy(bytes,  0, pUnmanagedBytes, nLength);
 92          //  Send the unmanaged bytes to the printer.
 93          bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
 94          //  Free the unmanaged memory that you allocated earlier.
 95          Marshal.FreeCoTaskMem(pUnmanagedBytes);
 96          return bSuccess;
 97     }
 98      public  static  bool SendStringToPrinter(  string szPrinterName,  string szString )
 99     {
100         IntPtr pBytes;
101         Int32 dwCount;
102          //  How many characters are in the string?
103          dwCount = szString.Length;
104          //  Assume that the printer is expecting ANSI text, and then convert
105           //  the string to ANSI text.
106          pBytes = Marshal.StringToCoTaskMemAnsi(szString);
107          //  Send the converted ANSI string to the printer.
108          SendBytesToPrinter(szPrinterName, pBytes, dwCount);
109         Marshal.FreeCoTaskMem(pBytes);
110          return  true;
111     }
112 }

若要将这些类型和其他类型的原始数据发送到打印机中,您的代码必须使用 Win32 后台应用程序程序员接口 (api)。下面的代码演示如何以预先设好格式的文件的内容读入内存,然后通过使用 WritePrinter 将那些字节发送到打印机。

: 不能使用这种方法相同的打印作业作为本机 PrintDocument 打印作业中。您必须使用.net 框架打印或发送您自己的打印作业字节。

打印文章 

 
 1  //  Allow the user to select a file.
 2      OpenFileDialog ofd =  new OpenFileDialog();
 3      if( DialogResult.OK == ofd.ShowDialog( this) )
 4     {
 5          //  Allow the user to select a printer.
 6          PrintDialog pd  =  new PrintDialog();
 7         pd.PrinterSettings =  new PrinterSettings();
 8          if( DialogResult.OK == pd.ShowDialog( this) )
 9         {
10              //  Print the file to the printer.
11              RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName);
12         }
13     }
string s =  " Hello "//  device-dependent string, need a FormFeed?
    
    
//  Allow the user to select a printer.
    PrintDialog pd  =  new PrintDialog();
    pd.PrinterSettings =  new PrinterSettings();
     if( DialogResult.OK == pd.ShowDialog( this) )
    {
         //  Send a printer-specific to the printer.
        RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, s);
    }

高了好久的打印呀,收集整理一下

转载于:https://www.cnblogs.com/deng02/archive/2012/06/21/2558211.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值