科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道直接把结果输出到打印机

直接把结果输出到打印机

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

   ??? 下面的代码可以通过调用WIN32 API让你直接输出到打印机,因而可以达到最快的速度进行打印,而不是等待Windows的打印系统

作者:中国IT实验室 来源:中国IT实验室 2007年9月10日

关键字: 编程

  • 评论
  • 分享微博
  • 分享邮件
  

    下面的代码可以通过调用WIN32 API让你直接输出到打印机,因而可以达到最快的速度进行打印,而不是等待Windows的打印系统。此外,示例代码还说明了如何向打印机发送PCL代码。
  
  // PrintDirect.cs
  // 本文参考了Microsoft Support 文档号:Q298141
  // 本代码假定你在file://192.168.1.101/hpl存在共享打印机
  // 本代码示例了如何向打印机发送Hewlett Packard PCL5代码直接在页面中央打印出一个矩形。
  
  
  using System;
  using System.Text;
  using System.Runtime.InteropServices;
  
  [StructLayout( LayoutKind.Sequential)]
  public struct DOCINFO
  {
   [MarshalAs(UnmanagedType.LPWStr)]public string pDocName;
   [MarshalAs(UnmanagedType.LPWStr)]public string pOutputFile;
   [MarshalAs(UnmanagedType.LPWStr)]public string pDataType;
  }
  
  public class PrintDirect
  {
   [ DllImport( "winspool.drv",CharSet=CharSet.Unicode,ExactSpelling=false,
   CallingConvention=CallingConvention.StdCall )]
   public static extern long OpenPrinter(string pPrinterName,ref IntPtr phPrinter,
   int pDefault);
   [ DllImport( "winspool.drv",CharSet=CharSet.Unicode,ExactSpelling=false,
   CallingConvention=CallingConvention.StdCall )]
   public static extern long StartDocPrinter(IntPtr hPrinter, int Level,
   ref DOCINFO pDocInfo);
  
   [ DllImport("winspool.drv",CharSet=CharSet.Unicode,ExactSpelling=true,
   CallingConvention=CallingConvention.StdCall)]
   public static extern long StartPagePrinter(IntPtr hPrinter);
   [ DllImport( "winspool.drv",CharSet=CharSet.Ansi,ExactSpelling=true,
   CallingConvention=CallingConvention.StdCall)]
   public static extern long WritePrinter(IntPtr hPrinter,string data,
   int buf,ref int pcWritten);
  
   [ DllImport( "winspool.drv" ,CharSet=CharSet.Unicode,ExactSpelling=true,
   CallingConvention=CallingConvention.StdCall)]
   public static extern long EndPagePrinter(IntPtr hPrinter);
  
   [ DllImport( "winspool.drv",CharSet=CharSet.Unicode,ExactSpelling=true,
   CallingConvention=CallingConvention.StdCall)]
   public static extern long EndDocPrinter(IntPtr hPrinter);
  
   [ DllImport("winspool.drv",CharSet=CharSet.Unicode,ExactSpelling=true,
   CallingConvention=CallingConvention.StdCall )]
   public static extern long ClosePrinter(IntPtr hPrinter);
  }
  
  public class App
  {
   public static void Main ()
   {
   System.IntPtr lhPrinter=new System.IntPtr();
  
   DOCINFO di = new DOCINFO();
   int pcWritten=0;
   string st1;
  
   // text to print with a form feed character
   st1="This is an example of printing directly to a printer\f";
   di.pDocName="my test document";
   di.pDataType="RAW";
  
   // the \x1b means an ascii escape character
   st1="\x1b*c600a6b0P\f";
   //lhPrinter contains the handle for the printer opened
   //If lhPrinter is 0 then an error has occured
   PrintDirect.OpenPrinter("\\\\192.168.1.101\\hpl",ref lhPrinter,0);
   PrintDirect.StartDocPrinter(lhPrinter,1,ref di);
   PrintDirect.StartPagePrinter(lhPrinter);
   try
   {
   // Moves the cursor 900 dots (3 inches at 300 dpi) in from the left margin, and
   // 600 dots (2 inches at 300 dpi) down from the top margin.
   st1="\x1b*p900x600Y";
   PrintDirect.WritePrinter(lhPrinter,st1,st1.Length,ref pcWritten);
  
   // Using the print model commands for rectangle dimensions, "600a" specifies a rectangle
   // with a horizontal size or width of 600 dots, and "6b" specifies a vertical
   // size or height of 6 dots. The 0P selects the solid black rectangular area fill.
   st1="\x1b*c600a6b0P";
   PrintDirect.WritePrinter(lhPrinter,st1,st1.Length,ref pcWritten);
  
   // Specifies a rectangle with width of 6 dots, height of 600 dots, and a
   // fill pattern of solid black.
   st1="\x1b*c6a600b0P";
   PrintDirect.WritePrinter(lhPrinter,st1,st1.Length,ref pcWritten);
   // Moves the current cursor position to 900 dots, from the left margin and
   // 1200 dots down from the top margin.
   st1="\x1b*p900x1200Y";
   PrintDirect.WritePrinter(lhPrinter,st1,st1.Length,ref pcWritten);
   // Specifies a rectangle with a width of 606 dots, a height of 6 dots and a
  
   // fill pattern of solid black.
   st1="\x1b*c606a6b0P";
   PrintDirect.WritePrinter(lhPrinter,st1,st1.Length,ref pcWritten);
  
   // Moves the current cursor position to 1500 dots from the left margin and
   // 600 dots down from the top margin.
   st1="\x1b*p1500x600Y";
   PrintDirect.WritePrinter(lhPrinter,st1,st1.Length,ref pcWritten);
  
   // Specifies a rectangle with a width of 6 dots, a height of 600 dots and a
   // fill pattern of solid black.
   st1="\x1b*c6a600b0P";
   PrintDirect.WritePrinter(lhPrinter,st1,st1.Length,ref pcWritten);
   // Send a form feed character to the printer
   st1="\f";
   PrintDirect.WritePrinter(lhPrinter,st1,st1.Length,ref pcWritten);
   }
   catch (Exception e)
   {
   Console.WriteLine(e.Message);
   }
  
   PrintDirect.EndPagePrinter(lhPrinter);
   PrintDirect.EndDocPrinter(lhPrinter);
   PrintDirect.ClosePrinter(lhPrinter);
   }
  }

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章