No vídeo de hoje, vamos demonstrar em como gerar códigos de barra usando a classe FWMSPrinter.
A dúvida de hoje, nos perguntaram, como seria possível gerar códigos de barra em um relatório usando a classe FWMSPrinter.
Pensando nisso, montamos esse exemplo, onde demonstramos em como usar os seguintes métodos:
- Método FWMSBar (genérico que possui vários tipos como INT25, EAN8, INDA25, etc)
- Método Code128
- Método Ean13
- Método Code128C
- Método Pdf417
- Método QRCode
- Método FWMSBar (imprimindo em Vertical)
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "Totvs.ch"
#Include "TopConn.ch"
#Include "RPTDef.ch"
#Include "FWPrintSetup.ch"
//Alinhamentos
#Define PAD_LEFT 0
#Define PAD_RIGHT 1
#Define PAD_CENTER 2
#Define PAD_JUSTIFY 3 //Opção disponível somente a partir da versão 1.6.2 da TOTVS Printer
//Cor(es)
Static nCorCinza := RGB(110, 110, 110)
Static nCorDestaq := RGB(000, 208, 028)
/*/{Protheus.doc} User Function zVid0092
Testes de Código de Barras
@author Atilio
@since 28/02/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
User Function zVid0092()
Local aArea := FWGetArea()
//Cria as o relatorio
Processa({|| fImprime()})
FWRestArea(aArea)
Return
/*/{Protheus.doc} fImprime
Faz a impressão do relatório zVid0092
@author Atilio
@since 28/02/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function fImprime()
Local aArea := FWGetArea()
Local cArquivo := 'zVid0092'+RetCodUsr()+'_' + dToS(Date()) + '_' + StrTran(Time(), ':', '-') + '.pdf'
Local cCodBarra := "01234567890123456789012345678901234567890123456" //47 caracteres
Private oPrintPvt
Private cHoraEx := Time()
Private nPagAtu := 1
Private cLogoEmp := fLogoEmp()
//Linhas e colunas
Private nLinAtu := 0
Private nLinFin := 800
Private nColIni := 010
Private nColFin := 580
Private nColMeio := (nColFin-nColIni)/2
//Declarando as fontes
Private cNomeFont := 'Arial'
Private oFontDet := TFont():New(cNomeFont, /*uPar2*/, -11, /*uPar4*/, .F., /*uPar6*/, /*uPar7*/, /*uPar8*/, /*uPar9*/, .F.)
Private oFontDetN := TFont():New(cNomeFont, /*uPar2*/, -13, /*uPar4*/, .T., /*uPar6*/, /*uPar7*/, /*uPar8*/, /*uPar9*/, .F.)
Private oFontRod := TFont():New(cNomeFont, /*uPar2*/, -8, /*uPar4*/, .F., /*uPar6*/, /*uPar7*/, /*uPar8*/, /*uPar9*/, .F.)
Private oFontMin := TFont():New(cNomeFont, /*uPar2*/, -7, /*uPar4*/, .F., /*uPar6*/, /*uPar7*/, /*uPar8*/, /*uPar9*/, .F.)
Private oFontTit := TFont():New(cNomeFont, /*uPar2*/, -15, /*uPar4*/, .T., /*uPar6*/, /*uPar7*/, /*uPar8*/, /*uPar9*/, .F.)
//Criando o objeto de impressao
oPrintPvt := FWMSPrinter():New(;
cArquivo,; // cFilePrinter
IMP_PDF,; // nDevice
.F.,; // lAdjustToLegacy
,; // cPathInServer
.T.,; // lDisabeSetup
,; // lTReport
@oPrintPvt,; // oPrintSetup
,; // cPrinter
,; // lServer
,; // lParam10
,; // lRaw
.T.; // lViewPDF
)
oPrintPvt:cPathPDF := GetTempPath()
oPrintPvt:SetResolution(72)
oPrintPvt:SetPortrait()
oPrintPvt:SetPaperSize(DMPAPER_A4)
oPrintPvt:SetMargin(0, 0, 0, 0)
//Inicia a página imprimindo o cabeçalho
fImpCab()
//Método FWMSBar
oPrintPvt:SayAlign(nLinAtu, nColMeio-200, "Método FWMSBar", oFontTit, 400, 20, nCorCinza, PAD_CENTER, /*nAlignVert*/)
oPrintPvt:FWMSBar(;
"INT25",; // cTypeBar
nLinAtu / 8,; // nRow
nColIni / 8,; // nCol
cCodBarra,; // cCode
oPrintPvt,; // oPrint
,; // lCheck
,; // Color
.T.,; // lHorz
,; // nWidth
,; // nHeigth
,; // lBanner
,; // cFont
,; // cMode
.F.,; // lPrint
,; // nPFWidth
,; // nPFHeigth
; // lCmtr2Pix
)
//Método Code128
nLinAtu += 90
oPrintPvt:SayAlign(nLinAtu, nColMeio-200, "Método Code128", oFontTit, 400, 20, nCorCinza, PAD_CENTER, /*nAlignVert*/)
oPrintPvt:Code128(;
nLinAtu + 20,; // nRow
nColIni,; // nCol
cCodBarra,; // cCodeBar
1,; // nWidth
30,; // nHeight
.T.,; // lSay
oFontMin,; // oFont
300; // nTotalWidth
)
//Método Ean13
nLinAtu += 70
oPrintPvt:SayAlign(nLinAtu, nColMeio-200, "Método Ean13", oFontTit, 400, 20, nCorCinza, PAD_CENTER, /*nAlignVert*/)
oPrintPvt:Ean13(;
nLinAtu + 20,; // nRow
nColIni + 20,; // nCol
Left(cCodBarra, 13),; // cCodeBar
100,; // nTotalWidth
30; // nHeight
)
//Método Code128C
nLinAtu += 70
oPrintPvt:SayAlign(nLinAtu, nColMeio-200, "Método Code128C", oFontTit, 400, 20, nCorCinza, PAD_CENTER, /*nAlignVert*/)
oPrintPvt:Code128C(;
nLinAtu + 65,; // nRow
nColIni,; // nCol
Left(cCodBarra, 40),; // cCodeBar
50; // nSizeBar
)
//Método Pdf417
nLinAtu += 70
oPrintPvt:SayAlign(nLinAtu, nColMeio-200, "Método Pdf417", oFontTit, 400, 20, nCorCinza, PAD_CENTER, /*nAlignVert*/)
oPrintPvt:Pdf417(;
nLinAtu + 50,; // nRow
nColIni,; // nCol
Left(cCodBarra, 40),; // cCodeBar
150,; // nSizeBar
30; // nHeight
)
//Método QRCode
nLinAtu += 70
oPrintPvt:SayAlign(nLinAtu, nColMeio-200, "Método QRCode", oFontTit, 400, 20, nCorCinza, PAD_CENTER, /*nAlignVert*/)
oPrintPvt:QRCode(;
nLinAtu + 90,; // nRow
nColIni,; // nCol
cCodBarra,; // cCodeBar
65; // nSizeBar
)
//Método FWMSBar (Vertical)
nLinAtu += 110
oPrintPvt:SayAlign(nLinAtu, nColMeio-200, "Método FWMSBar (Vertical)", oFontTit, 400, 20, nCorCinza, PAD_CENTER, /*nAlignVert*/)
oPrintPvt:FWMSBar(;
"CODE128",; // cTypeBar
nLinAtu / 8 - 19,; // nRow
nColIni / 8,; // nCol
Left(cCodBarra, 15),; // cCode
oPrintPvt,; // oPrint
,; // lCheck
,; // Color
.F.,; // lHorz
,; // nWidth
,; // nHeigth
,; // lBanner
,; // cFont
,; // cMode
.F.,; // lPrint
,; // nPFWidth
,; // nPFHeigth
; // lCmtr2Pix
)
//Imprime o último rodapé e abre o PDF
fImpRod()
oPrintPvt:Preview()
FWRestArea(aArea)
Return
/*/{Protheus.doc} fLogoEmp
Função que retorna o logo da empresa conforme configuração da DANFE
@author Atilio
@since 28/02/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function fLogoEmp()
Local cLogo := "\x_imagens\logo.png"
Return cLogo
/*/{Protheus.doc} fImpCab
Função que imprime o cabeçalho do relatório
@author Atilio
@since 28/02/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function fImpCab()
Local cTexto := ''
Local nLinCab := 015
//Iniciando Pagina
oPrintPvt:StartPage()
//Imprime o logo
If File(cLogoEmp)
oPrintPvt:SayBitmap(005, nColIni, cLogoEmp, 030, 030)
EndIf
//Cabecalho
cTexto := 'Testes Códigos de Barras'
oPrintPvt:SayAlign(nLinCab, nColMeio-200, cTexto, oFontTit, 400, 20, nCorDestaq, PAD_CENTER, /*nAlignVert*/)
//Linha Separatoria
nLinCab += 020
oPrintPvt:Line(nLinCab, nColIni, nLinCab, nColFin, nCorDestaq)
//Atualizando a linha inicial do relatorio
nLinAtu := nLinCab + 5
Return
/*/{Protheus.doc} fImpRod
Função que imprime o rodapé e encerra a página
@author Atilio
@since 28/02/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function fImpRod()
Local nLinRod:= nLinFin
Local cTexto := ''
//Linha Separatoria
oPrintPvt:Line(nLinRod, nColIni, nLinRod, nColFin, nCorDestaq)
nLinRod += 3
//Dados da Esquerda
cTexto := dToC(dDataBase) + ' ' + cHoraEx + ' ' + FunName() + ' (zVid0092) ' + UsrRetName(RetCodUsr())
oPrintPvt:SayAlign(nLinRod, nColIni, cTexto, oFontRod, 500, 10, /*nClrText*/, PAD_LEFT, /*nAlignVert*/)
//Direita
cTexto := 'Pagina '+cValToChar(nPagAtu)
oPrintPvt:SayAlign(nLinRod, nColFin-40, cTexto, oFontRod, 040, 10, /*nClrText*/, PAD_RIGHT, /*nAlignVert*/)
//Finalizando a pagina e somando mais um
oPrintPvt:EndPage()
nPagAtu++
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.