直接把结果输出到打印机

转载 2004年11月01日 20:07:00
作者:孟宪会 出自:【孟宪会之精彩世界】 发布日期:2003年6月15日 10点49分57秒

<!--StartFragment-->// 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);
  }
}

Windows打印体系结构之本地打印任务处理流程①

1.4、Windows本地打印任务处理流程 1.4.1、本地打印机的架构 对Windows的本地打印任务处理的流程的说明,我想从打印机接入计算机或者操作系统说起。在这里我们仅仅针对本地计算机,...
  • Liuqz2009
  • Liuqz2009
  • 2017年03月25日 14:56
  • 822

Web 应用中使用打印机打印网页信息

最近在公司项目中需要用到是web应用中打印用户的测试报告,所以就对这方面做了一些研究。 首先,如果单纯的只是打印web页面的所有信息,我们可以直接在JS的方法中使用 window.print()函数,...
  • BackZero333
  • BackZero333
  • 2017年08月16日 10:17
  • 194

直接把结果输出到打印机

// PrintDirect.cs// 本文参考了Microsoft Support 文档号:Q298141// 本代码假定你在file://192.168.1.101/hpl存在共享打印机// 本代...
  • andylaufzf
  • andylaufzf
  • 2007年10月17日 09:39
  • 411

把mysql的一些状态输出到文件里显示

有些状态在 mysql里边不好看,比如show engine innodb status\G在mysql里就很难看,找信息也不好找,所以最好输出到外部文件里,比如txt文件,不废话了直接上代码    ...
  • laiyijian
  • laiyijian
  • 2017年04月17日 23:00
  • 138

Android遇上打印机

打印机其实和Android没有什么大的关系,和linux内核关联才是比较强的。最近调试打印机,有那么一点心得,一点一点记录下来。      最终的结果是要在Android实现驱动打印机,但是一般调试一...
  • kangear
  • kangear
  • 2014年01月11日 16:34
  • 31351

掌握.NET中的日常打印

掌握.NET中的日常打印 下载本文代码下载本期杂志代码见资源运用.NET Framework中的类来创建看上去很专业的报表。 by Michael Eaton技术工具箱:C# 你可以用几种方法在.NE...
  • ddarkelf
  • ddarkelf
  • 2004年09月15日 12:31
  • 2960

Linux将输出放到文件中

一,如何把命令运行的结果保存到文件当中?   这个问题太简单了,大家都知道,用 > 把输出转向就可以了   例子:   [lhd@hongdi ~]$ ls > ls.txt   [lhd@h...
  • u013238950
  • u013238950
  • 2016年06月16日 13:32
  • 8623

C++中将打印结果输出到文件中

本人最近在蓝桥杯调试的过程中痛感到打印结果在调试界面上,脑海里是有点不情愿的。于是想出了将输出结果重定向到指定的文件上面。 直接上代码: #include #include #include us...
  • u013628862
  • u013628862
  • 2015年04月03日 20:41
  • 1635

Android遇上打印机

打印机其实和Android没有什么大的关系,和linux内核关联才是比较强的。最近调试打印机,有那么一点心得,一点一点记录下来。        最终的结果是要在Android实现驱动打印机,但是一般...
  • sdvch
  • sdvch
  • 2015年04月17日 13:22
  • 2014

打印管理

目标 多年来,打印问题一直困扰着Unix,包括Linux。Unix和Linux没有合适的标准接口或系统来支持打印。Berkeley和System V 打印系统是从前通常采用的两种解决方案。不过在19...
  • lhf_tiger
  • lhf_tiger
  • 2012年10月10日 10:49
  • 3643
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:直接把结果输出到打印机
举报原因:
原因补充:

(最多只允许输入30个字)