2010-05-14 2 views
6

Мое приложение должно печатать счета-фактуры, затем получить счет-фактуру из базы данных, вставить информацию о счете-фактуре в большую строку (указать строку, столбец и т. Д.) После этого у меня есть строка готова к отправке на принтер.Отправьте команды ESC на принтер в C#

Моя проблема: Мне нужно поставить некоторые команды ESC/P/символы в моей большой строке

Я пытался сделать что-то вроде этого:

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

     MyBigString.Insert(10, formFeed); 

Whith это, линия 10 будет делать a FormFeed, но это не работает

ПРИМЕЧАНИЕ. Я отправляю MybigString сразу на принтер.

Чтобы мой код работал, мне нужно отправить данные по строкам на принтер?

Спасибо за помощь.

PS: Извините, за мой английский, я бразильский разработчик, который не говорит по-английски (пока).

+0

Принтер EPSON FX-1170 (матричный принтер) – Ewerton

+2

Что такое 'MyBigString'? – SLaks

ответ

5

Обход драйвера принтера и управление принтером напрямую, с использованием собственного языка команд, является поддерживаемым сценарием. P/Invoke хорошо объясняется в этом KB article.

Уверен, вы хотите это сделать? Это необычно, мягко говоря, обычно делается только при использовании недорогих термографических или матричных принтеров Point-Of-Sale. Если вам не нравится механизм PrintDocument.PrintPage, никто этого не делает, вы можете рассмотреть мой код в this thread. Обратите внимание на метод FormFeed.

+0

прочитайте и реализуйте статью KB, и она отлично работает для меня. Спасибо – Ewerton

+0

Статья в KB открывает принтер в режиме «RAW», что означает, что вы должны указывать байты, которые будет принимать драйвер принтера. Попытка отправить 0xFF на принтер XPS приведет к тому, что он ничего не сделает. Вы должны изменить режим на «ТЕКСТ» (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. Не слишком громко использовать свой собственный звуковой сигнал, но я рекомендую вам прочитать эту запись, поскольку я говорю о команде сложного изображения с принтером. Если вы это понимаете, вы можете распечатать все!

(я говорю о ESC/POS, используемом в принтерах розничных квитанций, но семантика обсуждения относится к ESC/P, старшему язык матричного, а также.)

Короче говоря, использовать BinaryWriter вместо string, или вы будете безнадежно запутаны (как и я), так как определенные символы получают «испеченные» неправильные кодировки на пути к принтеру. (Поверьте мне на это! Не используйте StringBuilder при попытке поговорить с ESC/POS.)

Будьте осторожны, чтобы не использовать Write(string) перегрузки BinaryWriter, как он будет предварять длину строки в качестве байта поток, который вы не хотите. (I also blogged about that, узнав, что трудный путь, тоже на том же проекте.)

Затем я использую код для отправки byte массива, полученного от BinaryWriter, непосредственно на принтер P/ссылающегося на:

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 на сырье тоже.

Принтеры, особенно точечные матрицы, могут быть напрямую с использованием DOS, CMD-метода, который намного проще и быстрее для печати также может использовать основные командные коды ESC/0x1b для управления принтером. , и т. д.

как windowos/graphic, он может быть графическим и необработанным, установив openprinter (,, printer_defaults) printer_defaults и doc-inf, ссылаясь на ссылки win32 sdk.

для любой необработанной печати он может использовать команду ESC (см. Подробности руководства принтера) для печати любых графических изображений, как это делал драйвер windows .

как печать сырья, это просто добавить любого из первых 20 ASCII, такие как oxoc (Под.стр) 0x0doa (0x0A, 0x0D, \ N или новая строка) каждый принтер имеет небольшую ESC команду различия, но с помощью команды главного ESC является оштрафован для большинства матриц Dot.

в качестве сырья пример режима следующим образом, Под.стр, \ п & \ г

символ cFormfeed = 0x0c; // или \ f

char cStr [] = "1 = текст, ...... @ \ n2 = текст ..... \ r \ f3 = текст ......."; // используем \ f не используя cFormfeed, вы можете это исправить

cStr> lpt1; // вывод на принтер dos или cmd метод, причина должна получить lpt1.

распечатывают будет

первая страница

1 = текст, ...... @

2 = текст .....

на 2-й странице

3 = текст .......

надеюсь, что это поможет, удачи.

Смежные вопросы