C# 逐行驱动打印


 
windows打印以page方式驱动打印机,行方式驱动需调用API或用种变通的方式。

方法一

简单的写到一个文件里然后

System.Diagnostics.Process.Start("cmd"," /c copy d:\1.txt  prn")

输出重定向简单易行打个receipt啥的足够用,就是感觉很业余,呵呵。

方法二
这个就要用几个API 了

Class  RawPrinterHelper


 

using System;
using System.IO;
using System.Drawing.Printing;
using System.Runtime.InteropServices;


public class RawPrinterHelper
{
    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
        public struct DOCINFOW
    {
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pDocName;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pOutputFile;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pDataType;
    }

    [DllImport("winspool.Drv", EntryPoint="OpenPrinterW", CallingConvention=CallingConvention.StdCall, CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
    public static extern bool OpenPrinter(string src, ref IntPtr hPrinter, long pd);
 


    [DllImport("winspool.Drv", CallingConvention=CallingConvention.StdCall, CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
    public static extern bool ClosePrinter(IntPtr hPrinter);
 


    [DllImport("winspool.Drv", EntryPoint="StartDocPrinterW", CallingConvention=CallingConvention.StdCall, CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
    public static extern bool StartDocPrinter(IntPtr hPrinter, int level, ref RawPrinterHelper.DOCINFOW pDI);
 


    [DllImport("winspool.Drv", EntryPoint="EndDocPrinter", SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
    public static extern bool EndDocPrinter(IntPtr hPrinter);
   

    [DllImport("winspool.Drv", EntryPoint="StartPagePrinter", SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
    public static extern bool StartPagePrinter(IntPtr hPrinter) ;
   

    [DllImport("winspool.Drv", EntryPoint="EndPagePrinter", SetLastError=true, CharSet=CharSet.Unicode, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
    public static extern bool EndPagePrinter(IntPtr hPrinter) ;
   

    [DllImport("winspool.Drv", CallingConvention=CallingConvention.StdCall, CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, int dwCount, ref int dwWritten);
 


    public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
    {
        IntPtr hPrinter =  System.IntPtr.Zero;
        Int32 dwError;
        DOCINFOW di = new DOCINFOW();
        Int32 dwWritten = 0;
        bool bSuccess;
        di.pDocName = "My Document";
        di.pDataType = "RAW";
        bSuccess = false;
        if (OpenPrinter(szPrinterName,ref hPrinter, 0))
        {
            if (StartDocPrinter(hPrinter, 1,ref di))
            {
                if (StartPagePrinter(hPrinter))
                {
                    bSuccess = WritePrinter(hPrinter, pBytes, dwCount, ref dwWritten);
                    EndPagePrinter(hPrinter);
                }
                EndDocPrinter(hPrinter);
            }
            ClosePrinter(hPrinter);
        }
        if (bSuccess == false)
        {
            dwError = Marshal.GetLastWin32Error();
        }
        return bSuccess;

    }


    public static bool SendFileToPrinter(string szPrinterName, string szFileName)
    {
        FileStream stream1 = new FileStream(szFileName, FileMode.Open);
        BinaryReader reader1 = new BinaryReader(stream1);
        byte[] buffer1 = new byte[((int) stream1.Length) + 1];
        buffer1 = reader1.ReadBytes((int) stream1.Length);
        IntPtr ptr1 = Marshal.AllocCoTaskMem((int) stream1.Length);
        Marshal.Copy(buffer1, 0, ptr1, (int) stream1.Length);
        bool flag1 = RawPrinterHelper.SendBytesToPrinter(szPrinterName, ptr1, (int) stream1.Length);
        Marshal.FreeCoTaskMem(ptr1);
        return flag1;

    }

    public static void SendStringToPrinter(string szPrinterName, string szString)
    {
        IntPtr pBytes;
        Int32 dwCount;
        dwCount = szString.Length;
        pBytes = Marshal.StringToCoTaskMemAnsi(szString);
        SendBytesToPrinter(szPrinterName, pBytes, dwCount);
        Marshal.FreeCoTaskMem(pBytes);
    }
}


调用

 


    sPrintStr   = " test"

    PrintDialog pd = new PrintDialog();
    pd.PrinterSettings = new PrinterSettings();
    //if (pd.ShowDialog(this) > DialogResult.None)
    //{
    RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, sPrintStr);
    //}
 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cnming/archive/2008/03/22/2204496.aspx

posted on 2010-01-25 23:52  杨剑  阅读(380)  评论(0编辑  收藏  举报

导航