2010-08-16 1 views
1

Многие принтеры имеют команду «feed and cut» или «cut paper» (я говорю о POS-принтерах здесь).Режущая бумага («подача и вырезание») с помощью GDI?

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

Есть ли способ сделать это? Возможно, при выпуске EndDocument()?

Или, может быть, даже от .NET?

ответ

2

GDI и даже абстрактная модель печати Windows, вероятно, не помогут вам здесь. Вам придется отправить команду feed и cut на принтер на том языке, который, как ожидается, будет обычно получать данные.

Например, Epson TM-T88III thermal receipt printer говорит языком ESC/POS изначально, а не последовательностью команд GDI или PCL. Однако большинство этих принтеров поставляются с драйверами принтеров, которые делают Windows видимыми в них как обычные принтеры GDI. Как правило, эти драйверы работают, так это то, что они растеризуют все команды GDI в одну большую растровую карту в программном обеспечении, а затем выводят растровое изображение на принтер для печати через команду «print the bit-image» на родном языке. Как правило, это имеет менее чем желательные эффекты:

  • Это гораздо менее эффективно (в смысле времени, необходимого и передаваемых данных), чтобы отправить много растровых данных на принтер, чем последовательность двоичных команд, которые он знает, как интерпретировать. (Вы предпочитаете отправлять изображение с текстом для печати или только фактический текст и спецификацию размера шрифта? Аналогии с HTML/CSS по сравнению с изображением текста.)
  • Эти принтеры обычно имеют низкое разрешение и являются монохромными (это есть, все черные или все белые, без оттенков серого или цвета). Их предварительно загруженные шрифты предназначены для того, чтобы хорошо работать под этими ограничениями для четкого, четкого рендеринга. Растрируя в растровое изображение, мы теряем эту осторожную конструкцию, поскольку пиксели защелкиваются и округляются от сетки, что приводит к обработке зубчатого текста на фактической распечатке. Если вы пытаетесь нарисовать то, что действительно чувствительно к такого рода округлениям, как штрих-код, вы SOL, если только вы не стараетесь сохранить DPI контекста устройства принтера во время работы с GDI.

Например, здесь фрагмент кода из an extensive example on my usually-irrelevant blog. Вы можете увидеть ближе к концу, как я заполняю BinaryWriter с необходимой последовательностью байтов, равна «подачи бумаги и вырезать» команду на нашем Epson термическим чекового принтера (AsciiControlChars просто статический класс с константами):

 using (var ms = new MemoryStream()) 
     using (var bw = new BinaryWriter(ms)) 
     { 
      // Reset the printer bws (NV images are not cleared) 
      bw.Write(AsciiControlChars.Escape); 
      bw.Write('@'); 

      // Render the logo 
      RenderLogo(bw); 

      // Feed 3 vertical motion units and cut the paper with a 1 point cut 
      bw.Write(AsciiControlChars.GroupSeparator); 
      bw.Write('V'); 
      bw.Write((byte)66); 
      bw.Write((byte)3); 

      bw.Flush(); 

      return ms.ToArray(); 
     } 

Затем вы можете просто отправить байты непосредственно на принтер в виде документа RAW, либо используя код в конце этой статьи, который работает с различными функциями принтера Win32, либо с Microsoft RawPrinterHelper class.

Вам нужно будет найти команды, специфичные для вашего принтера. Скорее всего, он не слишком отличается от того, который вы видите здесь: языки POS начинают стандартизоваться, но это также похоже на то, что SQL является стандартным - взаимопонимаемым человеком, но не очень совместимым без каких-либо корректировок.

Если вы действительно хотите использовать GDI, вы можете распечатать документ GDI обычным способом на принтере (опять же, предполагая, что драйвер принтера GDI существует, что он, вероятно, делает), а затем выдает вторую, небольшую , Документ RAW на принтер, содержащий встроенную команду подачи и вырезания.(В качестве альтернативы, некоторые драйверы принтера GDI позволяют вам указывать «всегда вырезать после печати документа» прямо на панели управления принтерами, - но удачи, чтобы получить доступ к этой функции драйвера в хорошо документированном виде программно!)

Надеюсь, что это помогает нарисовать картину отношения GDI к принтерам POS.

+0

Действительно искушенное объяснение. Благодарю. –

+0

Спасибо - когда я принял ваше решение в тот же день, Интернет был просто ... в самый неподходящий момент. –