Net C#을 사용 하 여 원시 데이터를 프린터로 보내기 방법

Windows XP에 대한 지원이 종료되었습니다.

Microsoft는 2014년 4월 8일 Windows XP에 대한 지원을 종료했습니다. 이러한 변경에 따라 해당 소프트웨어 업데이트 및 보안 옵션이 영향을 받습니다. 사용자에게 미치는 영향 및 계속 보호를 받는 방법에 대해 알아보십시오.

이 문서는 Microsoft 기계 번역 소프트웨어를 이용하여 번역되었으며 Microsoft Community에 의한 Community Translation Framework(CTF) 기술 혹은 사람이 번역한 내용에 의하여 사후 편집될 수 있습니다. Microsoft는 Knowledge Base에 있는 모든 문서에 다양한 언어로 접근할 수 있도록 하기 위하여 기계 번역, 사람에 의한 번역 및 커뮤니티가 편집한 내용을 모두 제공합니다. 번역된 문서는 어휘, 구문 및/혹은 문법에 오류가 있을 수 있습니다. Microsoft는 번역 오류로 인한 부정확성, 오류 및/또는 손해와 이를 고객이 사용하는 데에 대하여 책임을 지지 않습니다.

이 문서의 영문 버전 보기:322091
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
이 문서의 Microsoft Visual Basic.NET 버전을 참조 하십시오. 322090.
에이 문서의 관리 되지 않는 c + + 버전에서 Microsoft 기술 자료의 다음 문서를 참조 하십시오.
138594 Win32 API를 사용 하 여 원시 데이터를 프린터로 보내기 방법
이 문서는 다음 Microsoft.NET Framework 클래스 라이브러리 네임 스페이스를 참조합니다.
  • System.IO
  • System.Drawing.Printing
  • System.Runtime.InteropServices

이 작업의

요약
이 문서에서는 NET C#를 사용 하 여 만든 프로그램에서 Win32 스풀러 함수를 사용 하는 방법을 보여 줍니다.

back to the top

자세한 내용

Microsoft.NET Framework 원시 데이터를 프린터로 보내려면, 프로그램은 Win32 스풀러 함수를 사용 하 여 작업 해야 합니다. .NET Framework 통해 PrintDocument, PrintController및 관련된 클래스를 사용 하 여 인쇄할 수 있습니다. 그러나.NET Framework 사용 하 여 프린터에 미리 서식이 지정 된 프린터에서 사용할 데이터를 보낼 수 없습니다.

다음 작업을 프린터로 원시 데이터를 보낼 수도 있습니다.
  • 이스케이프 시퀀스를 보냅니다.
  • 다운로드 및 소프트 글꼴을 사용 합니다.
  • 미리 인쇄 된 파일을 스풀링하기에.
이러한 형식 및 다른 형식의 원시 데이터 프린터로 보낼 코드를 Win32 스풀러 응용 프로그래머 인터페이스 (Api)를 사용 하 여 작업 해야 합니다. 다음 코드는 메모리로 미리 서식이 정의 된 파일의 내용을 읽고 다음 WritePrinter사용 하 여 해당 바이트 프린터로 보내는 방법을 보여 줍니다.

참고:이 방법은 네이티브 PrintDocument 인쇄 작업을 동일한 인쇄 작업에 사용할 수 없습니다. 인쇄 하거나 직접 인쇄 작업 바이트 보내기.NET Framework 사용 합니다.

back to the top

미리 서식이 지정 된 데이터를 출력 하는 프로젝트 만들기

  1. Visual Studio.NET을 시작 합니다. 파일 메뉴에서 새로만들기를 클릭 한 다음 프로젝트를 클릭 합니다. 프로젝트 형식Visual C# 프로젝트 폴더를 클릭 합니다. 템플릿 목록에서 Windows 응용 프로그램클릭 한 다음 확인을 누릅니다. 기본적으로 Form1이 생성 됩니다.
  2. 보기 메뉴에서 도구 상자를 표시 하려면 도구 상자 클릭 한 다음 Form1에 단추 를 추가 합니다. 이 단추의 이름이 Button1.
  3. 다른 단추 를 Form1에 추가 합니다. 이 단추에 Button2 라는.
  4. Button1을 두 번 클릭 합니다. 폼의 코드 창에 나타납니다.
  5. Button1_Click 서브루틴을을 다음 코드로 바꿉니다.
    private void button1_Click(object sender, System.EventArgs e){    // Allow the user to select a file.    OpenFileDialog ofd = new OpenFileDialog();    if( DialogResult.OK == ofd.ShowDialog(this) )    {        // Allow the user to select a printer.        PrintDialog pd  = new PrintDialog();        pd.PrinterSettings = new PrinterSettings();        if( DialogResult.OK == pd.ShowDialog(this) )        {            // Print the file to the printer.            RawPrinterHelper.SendFileToPrinter(pd.PrinterSettings.PrinterName, ofd.FileName);        }    }}					
  6. Button2_Click 서브루틴을 다음 코드로 바꿉니다.
    private void button2_Click(object sender, System.EventArgs e){    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);    }}					
  7. 파일 위쪽에 다음 코드를 삽입 합니다.
    using System;using System.Drawing;using System.Drawing.Printing;using System.Windows.Forms;using System.Runtime.InteropServices;					
  8. 기본 응용 프로그램 네임 스페이스 안에 있지만 모든 클래스 정의 외부에 다음 코드를 추가 합니다.
    public class RawPrinterHelper{    // Structure and API declarions:    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]    public class DOCINFOA    {        [MarshalAs(UnmanagedType.LPStr)] public string pDocName;        [MarshalAs(UnmanagedType.LPStr)] public string pOutputFile;        [MarshalAs(UnmanagedType.LPStr)] public string pDataType;    }    [DllImport("winspool.Drv", EntryPoint="OpenPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);    [DllImport("winspool.Drv", EntryPoint="ClosePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool ClosePrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="StartDocPrinterA", SetLastError=true, CharSet=CharSet.Ansi, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool StartDocPrinter( IntPtr hPrinter, Int32 level,  [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);    [DllImport("winspool.Drv", EntryPoint="EndDocPrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool EndDocPrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="StartPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool StartPagePrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="EndPagePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool EndPagePrinter(IntPtr hPrinter);    [DllImport("winspool.Drv", EntryPoint="WritePrinter", SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten );    // SendBytesToPrinter()    // When the function is given a printer name and an unmanaged array    // of bytes, the function sends those bytes to the print queue.    // Returns true on success, false on failure.    public static bool SendBytesToPrinter( string szPrinterName, IntPtr pBytes, Int32 dwCount)    {        Int32    dwError = 0, dwWritten = 0;        IntPtr    hPrinter = new IntPtr(0);        DOCINFOA    di = new DOCINFOA();        bool    bSuccess = false; // Assume failure unless you specifically succeed.        di.pDocName = "My C#.NET RAW Document";        di.pDataType = "RAW";        // Open the printer.        if( OpenPrinter( szPrinterName.Normalize(), out hPrinter, IntPtr.Zero ) )        {            // Start a document.            if( StartDocPrinter(hPrinter, 1, di) )            {                // Start a page.                if( StartPagePrinter(hPrinter) )                {                    // Write your bytes.                    bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);                    EndPagePrinter(hPrinter);                }                EndDocPrinter(hPrinter);            }            ClosePrinter(hPrinter);        }        // If you did not succeed, GetLastError may give more information        // about why not.        if( bSuccess == false )        {                dwError = Marshal.GetLastWin32Error();        }        return bSuccess;    }    public static bool SendFileToPrinter( string szPrinterName, string szFileName )    {        // Open the file.        FileStream fs = new FileStream(szFileName, FileMode.Open);        // Create a BinaryReader on the file.        BinaryReader br = new BinaryReader(fs);        // Dim an array of bytes big enough to hold the file's contents.        Byte []bytes = new Byte[fs.Length];        bool bSuccess = false;        // Your unmanaged pointer.        IntPtr pUnmanagedBytes = new IntPtr(0);        int nLength;        nLength = Convert.ToInt32(fs.Length);        // Read the contents of the file into the array.        bytes = br.ReadBytes( nLength );        // Allocate some unmanaged memory for those bytes.        pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);        // Copy the managed byte array into the unmanaged array.        Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);        // Send the unmanaged bytes to the printer.        bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);        // Free the unmanaged memory that you allocated earlier.        Marshal.FreeCoTaskMem(pUnmanagedBytes);        return bSuccess;    }    public static bool SendStringToPrinter( string szPrinterName, string szString )    {        IntPtr pBytes;        Int32 dwCount;        // How many characters are in the string?        dwCount = szString.Length;        // Assume that the printer is expecting ANSI text, and then convert        // the string to ANSI text.        pBytes = Marshal.StringToCoTaskMemAnsi(szString);        // Send the converted ANSI string to the printer.        SendBytesToPrinter(szPrinterName, pBytes, dwCount);        Marshal.FreeCoTaskMem(pBytes);        return true;    }}					
  9. 빌드하고 다음 프로그램을 실행 하려면 F5 키를 누릅니다.
  10. 로드 한 파일의 내용을 인쇄 하려면 Button1 클릭 합니다.
  11. 문자열을 인쇄 하려면 Button2 클릭 합니다. ( 이상한 명령 없이 문자열 전송 되므로 페이지를 수동으로 꺼내기 할 수 있습니다.)
back to the top
참조
자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료에 있는 문서를 참조하십시오.
138594 Win32 API를 사용 하 여 원시 데이터를 프린터로 보내기 방법
back to the top
원시 장치 포트 소프트 글꼴 다운로드

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 322091 - 마지막 검토: 12/07/2015 10:54:22 - 수정: 6.0

Microsoft Windows XP Professional

  • kbnosurvey kbarchive kbdswgdi2003swept kbhowtomaster kbmt KB322091 KbMtko
피드백