• 0
Sign in to follow this  
paulobergo

Geração De Código De Barras Itf (2by5) Em Bmp

Question

Oi pessoal...

Desenvolvi um pequeno aplicativo (cgi ou isapi), para simplesmente criar uma figura (um bitmap) de um código de barras no padrão itf (2by5 interleaved)...

Com um form normal, consigo gravar a imagem do código de barras (meu objetivo é imprimir o código da febraban ou qualquer outro que use o padrão '2 de 5 intercalado') como jpeg...

No entanto, a aplicação (o código simplificado encontra-se a seguir) precisa rodar sob a Intranet, em uma aplicação CGI (executável) sob o IIS no XP... e gravando como BMP dá certinho... só não consigo salvar como jpeg... O código é este:

Unit cgi2by5unit;

{***********************************************************************
 Executável (cgi) para geração de uma imagem de códigos de barras
  no padrão 2 de 5 intercalado (interleaved 2by5)
************************************************************************}

interface

uses
  SysUtils, Classes, HTTPApp, HTTPProd, JPEG, QExtCtrls, QGraphics;

type
  TWebModule1 = class(TWebModule)
    PageProducer1: TPageProducer;
    procedure WebModule1WebActionItem1Action(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    procedure PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
      const TagString: String; TagParams: TStrings;
      var ReplaceText: String);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Var
  WebModule1: TWebModule1;
  sITFMask: Array[0..9] of String;
  sBitFase: String;

Const
  cr = chr(13);
  lf = chr(10);
  sBarraF = '1';    // Barra preta, "fina"
  sSpaceF = '00';   // Barra branca, "fina"
  sBarraG = '1111'; // Barra preta, "larga"
  sSpaceG = '0000'; // Barra branca, "larga"

Implementation

{$R *.DFM}

Function sBar2by5(sCbCodi: String): String;
Var
  sBit, sGetPA, sGetPB, sMaskA, sMaskB, sCodeBar: String;
  iGetcol, iCodA, iCodB, iItf, iItfstep: Integer;
  iPos, iY0, iY1, iX0, iX1: Integer;
  jp: TJPEGImage;
  Image: TBitmap;
  sTempFile: String;
  jpeg: TJPEGImage;
  bmp:  TBitmap;
Begin

  // A variável sBitFase é usada apenas para saber onde está ocorrendo erro.

  Image := TBitmap.Create;
  sBitFase := '1';

  Image.Width := 1024;
  sBitFase := '2';

  Image.Height := 80;
  sBitFase := '3';

  // Image.Picture.Graphic := Bitmap;
  sBitFase := '4';
  // Image.Picture.Graphic := Image;

  sBitFase := '5';
  sCbCodi := TRIM(sCbCodi);

  // *********** Montagem de uma "imagem" do código, com "zeros" e "uns". Início.
  sBitFase := '6';
  sCodeBar := sBarraF+sSpaceF+sBarraF+sSpaceF;

  iITF := 1;
  While iITF<=Length(sCbCodi) do Begin
    iCodA  := StrToInt(Copy(sCbCodi,iITF  ,1));
    iCodB  := StrToInt(Copy(sCbCodi,iITF+1,1));
    sMaskA := sITFMask[iCodA];
    sMaskB := sITFMask[iCodB];
    iGetCol := 1;
    While iGetCol<=5 do Begin
      sGetPA := Copy(sMaskA,iGetCol,1);
      sGetPB := Copy(sMaskB,iGetCol,1);
      sCodeBar := sCodeBar+IIF(sGetPA='1',sBarraG,sBarraF)+
                           IIF(sGetPB='1',sSpaceG,sSpaceF);
      Inc(iGetCol);
    End;{While iGetCol<=5}
    iITF := iITF+2;
  End;{While iITF<=Length(sCbCodi)}
  sCodeBar := sCodeBar+sBarraG+sSpaceF+sBarraF;
  // *********** Montagem de uma "imagem" do código, com "zeros" e "uns". Fim

  sBitFase := '7';
  iY0 := Image.Height-5;
  iY1 := 5;
  iX0 := 10;
  iX1 := 0;
  iPos := 1;
  While iPos<=Length(sCodeBar) do Begin
    sBit := Copy(sCodeBar,iPos,1);
    If sBit='1' then
      Begin
        Image.Canvas.MoveTo(iX0,iY0);
        Image.Canvas.LineTo(iX0,iY1);
      End;
    {EndIf}

    Inc(iX0);
    Inc(iPos);
  End;{While iPos<=Length(sCodeBar)}
  Image.SaveToFile('c:\temp\figura.bmp');

  {
   ********** Parte que só funciona em um Form. Início.
              Toda essa parte do código, que funciona com um form
              comum, não funciona no webmodule
  }

  {
  sBitFase := '8';
  jp := TJPEGImage.Create;
  Try
    With jp Do Begin
      sBitFase := '9';
      Assign(Image); // passa o conteúdo do Comp. Image para o Comp. Jp

      sBitFase := '10';
      sTempFile := 'c:\temp\barcode.jpg';

      sBitFase := '11';
      SaveToFile(sTempFile);
    End;{With jp}
 {Finally
    jp.Free;
    Image.Free;
  End;
  {
   ********** Parte que só funciona em um Form. Fim.
  }
  sBar2by5 := sBitFase;
End;

Procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
Var
  iItens, iItem, iPos: Integer;
  bModoPost: Boolean;
  sCodigo2Barras, sString, sParteDir, sParteEsq: String;
Begin

  iItens := Request.ContentFields.Count;
  bModoPost := iItens>0;
  If not bModoPost then
    iItens := Request.QueryFields.Count;
  {EndIf}

  sITFMask[0] := '00110';
  sITFMask[1] := '10001';
  sITFMask[2] := '01001';
  sITFMask[3] := '11000';
  sITFMask[4] := '00101';
  sITFMask[5] := '10100';
  sITFMask[6] := '01100';
  sITFMask[7] := '00011';
  sITFMask[8] := '10010';
  sITFMask[9] := '01010';

  iItem := 1;
  While iItem<=iItens do Begin
    If bModoPost then
      sString := Request.ContentFields.Strings[iItem-1]
    Else
      sString := Request.QueryFields.Strings[iItem-1];
    {EndIf}

    iPos := Pos('=',sString);
    sParteEsq := Copy(sString,1,iPos-1);
    sParteDir := Copy(sSTring,iPos+1,Length(sString)-iPos);

    If sParteEsq='i2by5' then
      Begin
        sCodigo2Barras := sParteDir;
        sBar2By5(sCodigo2Barras);
      End;
    {EndIf}
    Inc(iItem);
  End;{While iItem<=iItens}

  Response.Content := '<html>'+
                      'O código é '+sCodigo2Barras+'<br>'+
                      '<img src="c:\temp\figura.bmp">';
  Response.Content := Response.Content+
                      PageProducer1.Content;
  Response.Content := Response.Content+'</html>';
End;

Procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
  const TagString: String; TagParams: TStrings; var ReplaceText: String);
Var
  sCode2Convert: String;
Begin
  If Copy(TagString,1,6)='cidade' then
    ReplaceText := 'Juiz de Fora-MG';
  {EndIf}
End;

End.

Instalando o executável na pasta scripts do IIS, basta passar esta url para obter um código. Por exemplo:
url=http://meuservidor/scripts/cgi2by5.exe?i2by5=001122&cidade=Belo%20Horizonte

Isso iria gerar o código de barras para 001122 (usar sempre quantidade par de algarismos)...

Grato!

Share this post


Link to post
Share on other sites

1 answer to this question

Recommended Posts

  • 0
(...) Com um form normal, consigo gravar a imagem do código de barras (meu objetivo é imprimir o código da febraban ou qualquer outro que use o padrão '2 de 5 intercalado') como jpeg...

No entanto, a aplicação (o código simplificado encontra-se a seguir) precisa rodar sob a Intranet, em uma aplicação CGI (executável) sob o IIS no XP... e gravando como BMP dá certinho... só não consigo salvar como jpeg... (...)

paulobergo, experimenta utilizar a função de conversão que postei outro dia para transformar seu BMP em JPG - post (o método é um pouco diferente do seu)

Abraços

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this