技术vs艺术

技术是扎实的基本功,艺术是丰富的想象力;技术的突破总是从夸张的想像中开始的。

博客园 首页 新随笔 联系 订阅 管理
  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);
    }

高了好久的打印呀,收集整理一下
posted on 2012-06-21 20:35  邓春光  阅读(3695)  评论(5编辑  收藏  举报