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.