Печатайте несколько разных этикеток на принтере Zebra - PullRequest
2 голосов
/ 05 июля 2011

Я хочу просмотреть список Member объектов и напечатать их имена и адреса, например:

foreach (Member member in members) {
    sb.AppendLine();
    sb.AppendLine("N");
    sb.AppendLine(string.Format("A50,50,0,2,1,1,N,\"{0}\"", member.name));
    sb.AppendLine(string.Format("A50,50,0,2,1,1,N,\"{0}\"", member.address));
    sb.AppendLine("P1");

    RawPrinterHelper.SendStringToPrinter(printerName, sb.ToString());
}  

Но, безусловно, должен быть более простой способ передачи нескольких этикеток на принтер?Отправить его один раз и позволить принтеру перебрать набор переменных?

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Наконец-то решил это. Вот еще немного информации, чтобы расширить ответы от OTisley и Brad Chrisite.

Я использовал эту страницу для загрузки шрифтов на принтер: Преобразование и загрузка шрифтов .

И этот код для циклического перебора членов:

StringBuilder sb = new StringBuilder();

foreach (Member member in members) {
    sb.AppendLine();
    sb.AppendLine("N");
    sb.AppendLine(string.Format("A10,10,0,b,1,1,N,\"{0}\"", member.name));
    sb.AppendLine(string.Format("A10,45,0,b,1,1,N,\"{0}\"", member.address));
    sb.AppendLine("P1,1");
}

string sendThisToPrinter = sb.ToString();

Объяснение формата, отправляемого на принтер:
A10 = смещение слева в точках
10 = смещение вершины в точках
0 = Поворот текста
b = Имя шрифта, которое вы задали при загрузке шрифтов в принтер.
1 = Расширить текст по горизонтали x количество раз.
1 = Развернуть текст по вертикали х раз.
N = N обычный или R пропущенный текст.
\ "{0} \" = Текст для печати. ​​

2 голосов
/ 05 июля 2011

Лично я всегда создавал холст сам.Я в основном создал класс «спулер», который представляет собой коллекцию меток для печати.Метка - это, по сути, класс, который содержит базовый формат метки (некоторые из них являются адресами доставки, некоторые содержат номера деталей и т. Д.) В дополнение к свойствам, которые я могу заполнить для добавления в шаблон метки.Затем я создаю печатный документ, заполняю параметры страницы и привязываюсь к событию PrintPage и извлекаю метки из очереди.

Держу пари, если вы дойдете до уровня драйвера принтера, который у вас будетлучше посылать полную полезную нагрузку, чем сериализовать ее, но я думаю, что один за другим просто придется работать.

Мне, однако, любопытно, каков сценарий, когда отправка их разоваянежелательно?


Дальнейшее понимание того, как я это делаю:

Во-первых, создайте интерфейс, определяющий, что должен представлять «label [class]»:

interface IPrintLabel
{
  // Get or set the printer this label should print from
  // I typically bounce between a Zebra (UPS/FedEx) printer and an in-house
  // DYNO printer, depending the label I print for shipping.
  PrinterSettings PrinterSettings { get; set; }

  // Get or set the paper size, margins, etc. Allows me to setup the canvas
  PageSettings PageSettings { get; set; }

  // Method responsible for laying out the label (send it the event args
  // from the PrintPage method of PrintDocument)
  void GenerateLabel(ref PrintPageEventArgs printArgs);

}

У меня есть классы misc, которые реализуют этот интерфейс. С определенными свойствами, форматированием, макетами и т. Д. Затем у меня есть «спулер»:

class PrintSpooler : Queue<IPrintLabel>
{
  public void PrintLabels()
  {
    // Establish a PrintDocument and bind to the PrintPage method something like:
    printDoc.PrintPage += (s, e) =>
    {
      IPrintLabel nextLabel = base.Dequeue();
      nextLabel.GenerateLabel(ref e);
      e.hasMorePages = (base.Count > 0);
    };
  }
}

Все обобщено, но только для того, чтобы дать вам эффект,Это старый код ~ 3 года, так что, возможно, есть лучшие / более оптимизированные методы, но он выполняет работу здесь (и приводит меня к крайнему сроку).

1 голос
/ 06 июля 2011

Что это за принтер Zebra?Вы можете использовать ZPL?Вы не можете передать набор, карту или массив на принтер Zebra, но вы можете определить переменные в формате и позже вызвать метку, передавая только переменные.Это уменьшит полезную нагрузку при печати этикетки.

В ZPL вы используете команду ^FN<Variable Number> для создания группы переменных внутри сохраняемой вами метки.Эта метка будет большой в зависимости от того, сколько переменных у вас есть в вашем наборе и сколько информации о форматировании имеет метка.

Когда вы хотите напечатать эту этикетку, все, что вам нужно сделать, это использовать ^XF commandвспомнить метку и передать только переменные данные, поэтому вам не нужно передавать всю информацию метки.

Сохраненная метка

^XA
^DFR:SAMPLE.GRF^FS
^FO20,30^GB750,1100,4^FS
^FO20,30^GB750,200,4^FS
^FO20,30^GB750,400,4^FS
^FO20,30^GB750,700,4^FS
^FO20,226^GB325,204,4^FS
^FO30,40^ADN,36,20^FDShip to:^FS
^FO30,260^ADN,18,10^FDPart number #^FS
^FO360,260^ADN,18,10^FDDescription:^FS
^FO30,750^ADN,36,20^FDFrom:^FS
^FO150,125^ADN,36,20^FN1^FS (ship to)
^FO60,330^ADN,36,20^FN2^FS(part num)
^FO400,330^ADN,36,20^FN3^FS(description)
^FO70,480^BY4^B3N,,200^FN4^FS(barcode)
^FO150,800^ADN,36,20^FN5^FS (from)
^XZ

Как вы вызываете метку

^XA
^XFR:SAMPLE.GRF
^FN1^FDAcme Printing^FS
^FN2^FD14042^FS
^FN3^FDScrew^FS
^FN4^FD12345678^FS
^FN5^FDMacks Fabricating^FS
^XZ
...