2010-05-14 4 views
6

내 응용 프로그램은 인보이스를 인쇄 한 다음 데이터베이스에서 인보이스를 가져와 인보이스에 큰 문자열 (줄, 열 등을 말함)에 정보를 삽입해야합니다. 문자열을 프린터에 보낼 준비가되었습니다.C#에서 프린터로 ESC 명령 보내기

내 문제는 다음과 같습니다

좀 ESC/P 명령을 둘 필요가/내 큰 문자열에있는 문자 나는 이런 식으로 뭔가하려고 노력이 파크

 char formFeed = (char)12; 
     Convert.ToChar(12); 

     MyBigString.Insert(10, formFeed); 

라인을 10 할 것 FormFeed하지만 작동하지 않습니다.

참고 : MybigString을 모두 한 번에 프린터로 보냅니다.

내 코드를 작동 시키려면 데이터를 한 줄씩 프린터로 보내야합니까?

도움 주셔서 감사합니다.

추 신 : 죄송합니다. 제 영어는 아직 브라질 인으로서 영어를 사용하지 못합니다.

+0

프린터는 EPSON FX-1170 (도트 매트릭스 프린터)입니다. – Ewerton

+2

'MyBigString'이란 무엇입니까? – SLaks

답변

5

기본 명령 언어를 사용하여 프린터 드라이버를 무시하고 프린터를 직접 제어하는 ​​것은 지원되는 시나리오입니다. P/Invoke는 KB article에 잘 설명되어 있습니다.

물론이 작업을 원하십니까? 온화하게두기는 일반적으로 저비용의 POS (point-of-sale) 열 또는 행렬 프린터로만 시도합니다. PrintDocument.PrintPage의 메커니즘이 마음에 들지 않으면 아무도하지 않습니다. 내 코드는 this thread입니다. FormFeed 메서드를 유의하십시오.

+0

은 KB 기사를 읽고 구현하며 잘 작동합니다. 감사합니다. – Ewerton

+0

기술 자료 기사는 "RAW"모드에서 프린터를 엽니 다. 즉, 프린터 드라이버가 허용 할 바이트를 발행해야합니다. XPS 프린터에 0xFF를 보내려고하면 아무 작업도 수행되지 않습니다. 모드를 "TEXT"로 변경해야합니다. "(http://social.msdn.microsoft.com/forums/en-US/windowsxps/thread/6280ebb0-61ad-4c42-a870-7f022fcdfbfe/) –

5

I've blogged about this before after having to do it myself. 나만의 경적을 너무 크게 들려서는 안되지만 프린터로 복잡한 이미지 명령에 대해 이야기 할 때이 항목을 읽는 것이 좋습니다. 이해가된다면 아무 것도 프린트 할 수 있습니다!

(I 소매 영수증 프린터에 사용 ESC/POS에 대해 이야기하지만, 논의의 의미뿐만 아니라, ESC/P, 이전 도트 매트릭스 언어에 적용됩니다.) 한마디로

하는을 사용 BinaryWriter 대신 string 또는 특정 문자가 프린터로가는 도중 잘못된 인코딩으로 구워지면 당연히 혼란스러워 할 것입니다. (이 하나 날 믿어! ESC/POS에 얘기하려고 할 때 StringBuilder를 사용하지 마십시오.)

것은 그것이 바이트에서와 같이 문자열의 길이를 앞에 추가됩니다으로 BinaryWriterWrite(string) 오버로드를 사용하지 않도록주의 스트림, 당신이 원하는 것이 아닙니다. (I also blogged about that 같은 프로젝트도 어렵게 것을 학습 후.) P/호출하여 프린터에 직접의 BinaryWriter에서 얻은

가 그럼 난의 byte 배열을 보내 몇 가지 코드를 사용

private static void Print(string printerName, byte[] document) 
{ 
    NativeMethods.DOC_INFO_1 documentInfo; 
    IntPtr printerHandle; 

    documentInfo = new NativeMethods.DOC_INFO_1(); 
    documentInfo.pDataType = "RAW"; 
    documentInfo.pDocName = "Bit Image Test"; 

    printerHandle = new IntPtr(0); 

    if (NativeMethods.OpenPrinter(printerName.Normalize(), out printerHandle, IntPtr.Zero)) 
    { 
     if (NativeMethods.StartDocPrinter(printerHandle, 1, documentInfo)) 
     { 
      int bytesWritten; 
      byte[] managedData; 
      IntPtr unmanagedData; 

      managedData = document; 
      unmanagedData = Marshal.AllocCoTaskMem(managedData.Length); 
      Marshal.Copy(managedData, 0, unmanagedData, managedData.Length); 

      if (NativeMethods.StartPagePrinter(printerHandle)) 
      { 
       NativeMethods.WritePrinter(
        printerHandle, 
        unmanagedData, 
        managedData.Length, 
        out bytesWritten); 
       NativeMethods.EndPagePrinter(printerHandle); 
      } 
      else 
      { 
       throw new Win32Exception(); 
      } 

      Marshal.FreeCoTaskMem(unmanagedData); 

      NativeMethods.EndDocPrinter(printerHandle); 
     } 
     else 
     { 
      throw new Win32Exception(); 
     } 

     NativeMethods.ClosePrinter(printerHandle); 
    } 
    else 
    { 
     throw new Win32Exception(); 
    } 
}

행운을 빌어 요!

+0

감사합니다 니콜라스, 당신의 코드는 나를 위해 많이 발전한 것 같지만 이해하려고 노력하고 있습니다. : D – Ewerton

+0

@ Nicholas 당신의 블로그는 더 이상 작동하지 않습니다. 어쨌든 코드를 살펴볼 수 있습니까? –

0

"....을 OpenPrinter (printerName.Normalize(), printerHandle, IntPtr.Zero 아웃) ..."너무 원료로 IntPtr.Zero를 설정하는 데 필요한

수 있습니다.

프린터 특히 도트 매트릭스를 사용하면 프린터를 제어하는 ​​데 기본 ESC/0x1b 명령 코드를 사용하여 훨씬 간단하고 신속하게 인쇄 할 수있는 DOS, CMD 방법을 사용하여 직접 인쇄 할 수 있습니다. .

을 windowos/graphic으로 사용하면 openprinter (,, printer_defaults) printer_defaults 및 doc-inf를 설정하여 그래픽 및 원시를 사용할 수 있으며 pls는 win32 sdk 참조를 참조합니다.

모든 원시 인쇄의 경우 어떤 그래픽을 어떤 프린터로 인쇄하려면 ESC 명령 (프린터 설명서 세부 정보 참조)을 사용할 수 있습니까? 드라이버가 수행 한 것입니다.

원료 인쇄와 같은, 단지 각 프린터는 ESC는 약간의 차이를 명령하지만 마스터 ESC 명령이 사용되었다 을 같은 oxoc (폼 피드) 0x0doa (0x0a, 0x0d로, \ n 또는 개행)와 제 20 ASCII 중 하나를, 추가 유사한 도트 매트릭스의 대부분을 위해 벌금이 부과됩니다.

원시 모드의 예는 다음과

, 폼 피드, \ n R

\ &

CHAR cFormfeed = 0x0c; // 또는 \ f

char cStr [] = "1 = 텍스트, ...... @ \ n2 = 텍스트 ..... \ r \ f3 = 텍스트 ......."; // cFormfeed를 사용하지 않고 \ f를 사용하십시오. 해결할 수 있습니다.

cStr> lpt1; // 프린터 DOS 또는 cmd 메소드로 출력하십시오. 이유는 lpt1을 사용할 수 있어야합니다.

2 ..... 2 페이지에서

텍스트입니다 = @

프린트 아웃 ...,

첫 페이지

1 = 텍스트가 될 것이다

3 = 텍스트 .......

희망이 도움, 행운을 빌어 요.

관련 문제