惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
MyScale Blog
MyScale Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
C
Check Point Blog
宝玉的分享
宝玉的分享
B
Blog RSS Feed
博客园 - 三生石上(FineUI控件)
量子位
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗
J
Java Code Geeks
The Cloudflare Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
P
Proofpoint News Feed
美团技术团队
H
Help Net Security
B
Blog
博客园_首页

博客园 - 追风逐云.NET

一种新的穿透防火墙的数据传输技术 - 追风逐云.NET - 博客园 [VC++]点对点(P2P)多线程断点续传的实现 Flash MX2004中的XML应用 Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇 Microsoft .Net Remoting系列专题之二:Marshal、Disconnect与生命周期以及跟踪服务 通过Web Services显示和下载文件 用 WebClient.UploadData 方法 上载文件数据 - 追风逐云.NET 创建以Microsoft .NET Remoting为基础的分布式应用架构 最近一直在做C#操作office方面的工作!总结一下!Word(二) 最近一直在做C#操作office方面的工作!总结一下!(一)Excel 读书笔记c#高级编程 委托和事件 设计了一个用户权限管理模型 C# winform中不规则窗体制作的解决方案(已经解决24位色以上不能正常显示问题) .NET 2.0泛型集合类与.NET 1.1集合类的区别(二) .NET 2.0泛型集合类与.NET 1.1集合类的区别(一) .NET(C#)连接各类数据库-集锦 SQL Server .NET Framework 数据提供程序连接池 防止可淹没应用程序的池溢出 提高ASP.Net应用程序性能的十大方法
C# 逐行驱动打印
追风逐云.NET · 2005-09-08 · via 博客园 - 追风逐云.NET

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); 
    }
 
}

有段以前VB的懒的改了找了段VB.net  http://support.microsoft.com/default.aspx?scid=KB;EN-US;322090 的翻过来,结果搞了一个多小时才调通还不如自己写呢。
原代码语法翻译工具 VB.Net  To C# 编译时候会遇到n多默认名空间、类型转换、修饰符、返回值、初始化、方法的()等问题,SendFileToPrinter是编译后用Reflector反编译回来的也有些莫名其妙的问题。
我语法翻译了一份,反编译一份对照这改才算调试通过了。
VB.net的代码还是编译了再 DllImport方便些。