Xpoint
   [напомнить пароль]

Печать штрих-кода из браузера

Метки: [без меток]
2013-02-13 16:48:14 [обр] hotice(0/3)[досье]

Здравствуйте, уважаемые форумчане!

Кратко обрисую ситуацию.

Есть внутренний корпоративный портал (сайт Apache+PHP+Postgres). Одна из страниц производит печать штрих-кода на термо-трансферном принтере. На данный момент все работает на ActiveX, который как известно не поддерживается в браузере FF, т.е. приходится работать только в IE. Большая часть верстки уже кросс-браузерна (на сколько это возможно).

Реализация в две кнопки - первая "настройка принтера", появляется стандартное окно настройки принтера, как при печати из текстового редактора; вторая "печать", которая собственно и отправляет сообщение о печати принтеру.

Объект ActiveX подключается так:

<OBJECT name='obj1'
           ID='obj1'
           classid='clsid:8536FBF1-1B41-409D-8D3A-XXXXXXXXXXX'
           codebase='http://localhost/AX/BarCodPrint.ocx#version=1,0,0,0'
      width='423'
      height='700'
      align='center'
      hspace='0'
      vspace='0'>
</OBJECT>

Под кнопками весят вызовы двух JS функций, соответственно:

 function SetPrint() {
  document.getElementById('obj1').PrintSet = 1;
 }
 function BarPrint() {
  document.getElementById('obj1').PrintBar = 1;  
 }

Сам ActiveX написан на Delphi. Плохо или хорошо не важно, главное что он работает. Сразу говорю, писал не я, получил так сказать по наследству. Разобрался как в нем что подправить и отложил в сторону до сего дня.

Сейчас хочется сделать так, что бы печать производилась из любого браузера. Но опыта нет, вот даже и не знаю с чего начать. Думал про плагин для FF, но как он будет работать в IE, интуиция подсказывает что никак не будет. Можно ли сделать универсальный модуль, если да то как? Желательно не потратив на это уйму времени.

Если кто-то может, направьте плз, в нужное русло, что капать и т.д.

P.S. Пока нет необходимости печатать по сети (т.е. браузер открыт на одном ПК, а принтер подключен к другому), думаю необходимость появится не скоро, принтер всегда рядом с "оператором" и подключен к его ПК.

спустя 3 часа 25 минут [обр] Евгений Седов aka KPbIC(5/176)[досье]
Печатать через сервер.
спустя 1 час 42 минуты [обр] Филипп Ткачев(5/112)[досье]
Для нормальной переносимости лучше использовать JavaApplet. В данном случае будет решена проблема переносимости и массового деплоя приложения. Насколько я понимаю, штука работает через последовательный порт ну или надстройку инкапсулирующую COM-порт в USB.
спустя 3 минуты [обр] Филипп Ткачев(5/112)[досье]
Есть даже готовые решения.
спустя 1 минуту [обр] hotice(0/3)[досье]

Вот за что я люблю наших гуру, так это за скромность :)

Евгений Седов aka KPbIC[досье], поясните пожалуйста свой ответ. Что вы имеете ввиду? Каков приблизительный план реализации? Куда читать?
Филипп Ткачев[досье] Спасибо за подсказку про Яву, я как то даже не подумал. А "штука" работает через LPT, хотя можно и usb подсоединить или как Вы правильно подметили RS-232. За ссылку благодарен покурю.

спустя 2 минуты [обр] Филипп Ткачев(5/112)[досье]
hotice[досье],
Supports COM, parallel, serial, USB, socket, lpr, LPT communication.
спустя 42 минуты [обр] Jared(0/26)[досье]
hotice[досье], с темой штрих-кодов и хитрых принтеров незнаком, но мне видится, что нет особой проблемы генерить на сервере растр штрих-кода, и печатать уже его.
спустя 2 часа 19 минут [обр] LookeR(9/1069)[досье]
hotice[досье]
Возможно скажу глупость (поскольку не программист), но нельзя ли на сервере сгенерить PDF, и его отдавать браузеру и уже печатать с интерфейсом у функционалом Adobe Reader? Хотя "две кнопки" с точки зрения пользователя выглядят приятнее...
спустя 1 час 45 минут [обр] Thirteensmay(3/157)[досье]
Поднять микросервер на клиенте, инсталлятор в один клик, общаться с ним хоть через AJAX, сам сервер на любом языке, удобно например на nodejs, может делать в системе все что угодно, кросплатформенно и кросбраузерно.
спустя 4 часа 42 минуты [обр] Lynn «Кофеман»(3/571)[досье]
А нельзя взять какой-нибудь шрифт типа http://www.barcodesinc.com/free-barcode-font/ и создавать на сервере pdf/doc/что-нибудь с использованием этого шрифта?
спустя 27 минут [обр] Филипп Ткачев(5/112)[досье]
C PDF не получится, термопринтер - штука, которая управляется достаточно простыми текстовыми командами. Хорошо бы опубликовать здесь модель термопринтера.
спустя 2 часа 27 минут [обр] hotice(0/3)[досье]

По поводу генерации различных файлов вроде pdf, скажу так, во-первых печать идет не чека, а самоклеющегося стикера размером 58*40 мм, у принтера есть профиль действия который нужно настроить(он содержит параметры печати, размеры, скорость, последействия, предействия), во-вторых принтеры которые у нас используются это CITIZEN CLP-621, а у них буфер ограничен, что-то вроде 128 Кб, т.е. печать идет на ленту, и надо контролировать количество отправляемых на печать стикеров, поскольку иначе идет переполнение и он просто начинает гадить :) сейчас пытаюсь изучить ActiveX написанный на Delphi, сам по себе он только обрабатывает полученные данные и используя библиотеку (есть исходники), которая все вырисовывает, производит печать. В принципе можно пожалуй и код выложить, если надо. На Delphi никогда не писал, потому разбор кода тяжко продвигается.
Lynn «Кофеман»[досье] Мысль не плохая, но там используется код штрих кода №39, а у меня это EAN13.
Thirteensmay[досье] микросервер для меня сложно, но все возможно, вопрос времени :) за направление по node.js спасибо, не сталкивался раньше, думаю может для много чего пригодится.
Филипп Ткачев[досье] модель чуть выше по тексту сообщения.

Попробую привести наиболее значимые, с моей точки функции на Delphi. Надеюсь это будет не лишним.
В основном коде есть вызовы

BarCode1.Text     := col4; {код штрих-кода цифрами}
BarCode1.DrawBarcode(Printer.Canvas); {отрисовка самого штриха}

выше указанный код заключен вот в такие операторы, перед которыми идет инициализация различных параметров

Printer.BeginDoc;
...
Printer.EndDoc;

А вот код функций из библиотеки

procedure TBarcode.DoLines(data:string; Canvas:TCanvas);

var i:integer;
   lt : TBarLineType;
  xadd:integer;
   width, height:integer;
  a,b,c,d,     {Edges of a line (we need 4 Point because the line}
               {is a recangle}
   orgin : TPoint;
   alpha:double;

begin
   xadd := 0;
   orgin.x := FLeft;
   orgin.y := FTop;
   alpha := FAngle*pi / 180.0;

   with Canvas do begin
      Pen.Width := 1;

    for i:=1 to Length(data) do  {examine the pattern string}
      begin

         {
         input:  pattern code
         output: Width and Linetype
         }
         OneBarProps(data[i], width, lt);

         if (lt = black) or (lt = black_half) then
         begin
            Pen.Color := FColorBar;
         end
         else
         begin
            Pen.Color := FColor;
         end;
         Brush.Color := Pen.Color;

         if lt = black_half then
            height := FHeight * 2 div 5
         else
            height := FHeight;





         a.x := xadd;
         a.y := 0;

         b.x := xadd;
         b.y := height;

      {c.x := xadd+width;}
      c.x := xadd+Width-1;  {23.04.1999 Line was 1 Pixel too wide}
         c.y := Height;

      {d.x := xadd+width;}
      d.x := xadd+Width-1;  {23.04.1999 Line was 1 Pixel too wide}
         d.y := 0;

      {a,b,c,d builds the rectangle we want to draw}


      {rotate the rectangle}
         a := Translate2D(Rotate2D(a, alpha), orgin);
         b := Translate2D(Rotate2D(b, alpha), orgin);
         c := Translate2D(Rotate2D(c, alpha), orgin);
         d := Translate2D(Rotate2D(d, alpha), orgin);

      {draw the rectangle}
         Polygon([a,b,c,d]);

         xadd := xadd + width;
      end;
   end;
end;

procedure TBarcode.DrawBarcode(Canvas:TCanvas);
var
   data : string;
   SaveFont: TFont;
   SavePen: TPen;
   SaveBrush: TBrush;
begin
   Savefont  := TFont.Create;
   SavePen   := TPen.Create;
   SaveBrush := TBrush.Create;


  {get barcode pattern}
   data := MakeData;


   try
    {store Canvas properties}
      Savefont.Assign(Canvas.Font);
      SavePen.Assign(Canvas.Pen);
      SaveBrush.Assign(Canvas.Brush);

      DoLines(data, Canvas);    {draw the barcode}

      if FShowText <> bcoNone then
         DrawText(Canvas);   {show readable Text}


    {restore old Canvas properties}
      Canvas.Font.Assign(savefont);
      Canvas.Pen.Assign(SavePen);
      Canvas.Brush.Assign(SaveBrush);
   finally
      Savefont.Free;
      SavePen.Free;
      SaveBrush.Free;
   end;
end;

procedure TBarcode.DrawText(Canvas:TCanvas);
var
 tmp           :String;
begin
   with Canvas do
   begin
      Font.Size := 10;
      {the fixed font size is a problem, if you
       use very large or small barcodes}

      Pen.Color := clBlack;
      Brush.Color := clWhite;

    tmp := FText;
    tmp := SetLen(12);
    tmp := DoCheckSumming(tmp);
    tmp := Copy(tmp, 1, 12);

    ShowMessage(tmp);

      if FShowText in [bcoCode, bcoNone] then
         TextOut(FLeft+100, FTop+55, tmp);         {contents of Barcode}
      if FShowText in [bcoTyp, bcoBoth] then
         TextOut(FLeft, FTop+14, GetTypText); {type/name of barcode}
   end;
end;
спустя 4 дня [обр] Евгений Седов aka KPbIC(5/176)[досье]
hotice[досье] Помогать вам с Delphi вряд ли кто-то станет, форум не тот.
Powered by POEM™ Engine Copyright © 2002-2005