Ir para conteúdo
Fórum Script Brasil
  • 0

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


paulobergo

Pergunta

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!

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...