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:
Pergunta
paulobergo
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:
Instalando o executável na pasta scripts do IIS, basta passar esta url para obter um código. Por exemplo: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
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.