Página 1 de 5

Harupdf e boleto

Enviado: 02 Set 2012 20:26
por JoséQuintas
Comecei a tentar montar o boleto com a harupdf.
Tenho olhado o exemplo Harbour, o Danfe da hbnfe, e minha geração de PDF que converti do VB.
A minha que agora está em Harbour, só trabalha com texto, então não serve pro boleto.

Só pra dar uma idéia da encrenca....
O PDF do Danfe, na hbnfe, define uma página inclinada em 45 graus, e também inclina os textos em 45 graus pra desfazer a inclinaçào da página. Como o Danfe é um trabalho excelente, faz direito o que tem que fazer, dá uma idéia de que os exemplos existentes de modelo acabam dando muito mais trabalho pra entender as coisas.
Infelizmente, no Harbour isso é comum: querem mostrar a quantidade de recursos, e complicam os exemplos pra quem está começando.

Ainda não acertei o cálculo de converter linha/coluna para posições do PDF, mas já começou a sair alguma coisa.
E sem ser pra boleto, acertando essa métrica, vou poder deixar de usar minha rotina que só trata texto, apesar de funcionar numa boa.

O fonte, ainda precário, só traçando linhas e um texto simples, ainda em ajuste está assim:
Se alguém puder ajudar seria interessante.
Por enquanto usei o que tinha no outro fonte, que considera espaçamento entre linhas de 1.2 vezes o tamanho da letra, e largura proporcional à altura em 1.5. (largura * 1.5 = altura).
E o posicionamento no PDF é ao contrário: a posição zero do papel é no fim e não no começo.
Talvez até mais fácil criar funções PdfRow() e PdfCol() que convertam as posições - considerando apenas texto e gráficos básicos, pelo menos pra começo e pra aprendizado.

Código: Selecionar todos


#include "hbwin.ch"
#include "harupdf.ch"


Procedure PBOL0010

cFilePdf := "harutest.pdf"
oPdf := HPDF_New()
HPDF_SetCompressionMode( oPdf, HPDF_COMP_ALL )

oPdfPage       := HPDF_AddPage( oPdf )
HPDF_Page_SetSize( oPdfPage, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT )
nAltura        := HPDF_Page_GetHeight( oPdfPage )
nLargura       := HPDF_Page_GetWidth( oPdfPage )
nLinhaPdf      := nAltura -8
nAngulo        := 90
nRadiano       := nAngulo / 180 * 3.141592
oPdfFontName   := HPDF_GetFont( oPdf, "Helvetica", NIL )
oPdfFontSizeGrande  := 12
oPdfFontSizePequeno := 6
oPdfFontSizeNormal  := 10
//nQtCol := nLargura/oPdfFontSizePequeno*1.5-1
//nQtRow := nAltura/oPdfFontSizePequeno/1.2-1
//MsgExclamation("nAltura " + Ltrim(Str(nAltura)) + ", nLargura " + Ltrim(Str(nLargura)) + ", nQtCol " + Ltrim(Str(nQtCol)) + ", nQtRow " + Ltrim(Str(nQtRow)) )

PdfDrawLine( 3, 0, 3, 88 )
PdfDrawLine( 7, 0, 7, 88 )
PdfDrawLine( 11, 0, 11, 88 )
PdfDrawLine( 14, 0, 14, 88 )
PdfDrawLine( 17, 0, 17, 88 )
PdfDrawLine( 20, 0, 20, 88 )

PdfDrawLine( 23, 60, 23, 88 )
PdfDrawLine( 26, 60, 26, 88 )
PdfDrawLine( 29, 60, 29, 88 )
PdfDrawLine( 32, 60, 32, 88 )

PdfDrawLine( 35, 0, 35, 88 )
PdfDrawLine( 38, 0, 38, 88 )
PdfDrawLine( 41, 0, 41, 88 )

PdfDrawText( 10, 10, "Testando o texto que vai ser impresso", oPdfFontSizeNormal )

//HPDF_Page_SetRGBFill( oPdfPage, 0, 0, 0 ) // reseta cor do fonte

//HPDF_Page_SetRGBStroke( oPdfPage, 0.75, 0.75, 0.75 )
//HPDF_Page_SetRGBStroke( oPdfPage, 0, 0, 0 ) // reseta cor de linha

HPDF_SaveToFile( oPdf, cFilePdf )
HPDF_Free( oPdf )
ShellExecute(cFilePdf)
Return


Function PdfDrawLine(nRowi, nColi, nRowf, nColf)
   nRowi := nAltura - nRowi*6*1.2
   nColi := nColi*6/1.5
   nRowf := nAltura - nRowf*6*1.2
   nColf := nColf*6/1.5
   HPDF_Page_SetLineWidth( oPdfPage, 0.2 ) // Grossura da linha
   HPDF_Page_MoveTo( oPdfPage, nColi, nRowi )
   HPDF_Page_LineTo( oPdfPage, nColf, nRowf )
   HPDF_Page_Stroke( oPdfPage )
   Return NIL

Function PdfDrawText(nRow,nCol,cTexto,nSize)

nRow := nAltura-nRow*6*1.2
nCol := nCol*6/1.5
// nRadiano := nAngulo / 180 * 3.141592 // Calcurate the radian value. 
nRadiano := 0 / 180 * 3.141592 // Não precisa girar o texto, segue igual a página
HPDF_Page_SetFontAndSize( oPdfPage, oPdfFontName, nSize )
HPDF_Page_BeginText( oPdfPage )
HPDF_Page_SetTextMatrix( oPdfPage, Cos(nRadiano), Sin(nRadiano), -Sin(nRadiano), Cos(nRadiano), nCol, nRow )
HPDF_Page_ShowText( oPdfPage, cTexto )
HPDF_Page_EndText( oPdfPage )
Return NIL


Harupdf e boleto

Enviado: 02 Set 2012 21:20
por JoséQuintas
Pra ser mais exato, por enquanto só tentando definir a equação pra isto:

Function PdfRow(nRow)
Return nAltura - nRow*6*1.2

Function PdfCol(nCol)
Return nCol*6/1.5

Harupdf e boleto

Enviado: 02 Set 2012 22:03
por JoséQuintas
O fonte agora está assim, notem que comparado ao primeiro fonte, mudou só o que se refere a linhas/colunas.
E estou usando basicamente linhas/colunas como se fosse impressão normal estilo tradicional.

Código: Selecionar todos

#include "hbwin.ch"
#include "harupdf.ch"

Procedure PBOL0010

cFilePdf := "harutest.pdf"
oPdf := HPDF_New()
HPDF_SetCompressionMode( oPdf, HPDF_COMP_ALL )

oPdfPage       := HPDF_AddPage( oPdf )
HPDF_Page_SetSize( oPdfPage, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT )
nAltura        := HPDF_Page_GetHeight( oPdfPage )
nLargura       := HPDF_Page_GetWidth( oPdfPage )
nLinhaPdf      := nAltura -8
nAngulo        := 90
nRadiano       := nAngulo / 180 * 3.141592
oPdfFontName   := HPDF_GetFont( oPdf, "Helvetica", NIL )
oPdfFontSizeGrande  := 12
oPdfFontSizePequeno := 6
oPdfFontSizeNormal  := 10
//nQtCol := nLargura/oPdfFontSizePequeno*1.5-1
//nQtRow := nAltura/oPdfFontSizePequeno/1.2-1
//MsgExclamation("nAltura " + Ltrim(Str(nAltura)) + ", nLargura " + Ltrim(Str(nLargura)) + ", nQtCol " + Ltrim(Str(nQtCol)) + ", nQtRow " + Ltrim(Str(nQtRow)) )

PdfDrawLine(  3, 10,  3, 140 )
PdfDrawLine(  7, 10,  7, 140 )
PdfDrawLine( 11, 10, 11, 140 )
PdfDrawLine( 14, 10, 14, 140 )
PdfDrawLine( 17, 10, 17, 140 )
PdfDrawLine( 20, 10, 20, 140 )
PdfDrawLine( 23, 100, 23, 140 )
PdfDrawLine( 26, 100, 26, 140 )
PdfDrawLine( 29, 100, 29, 140 )
PdfDrawLine( 32, 100, 32, 140 )

PdfDrawLine( 35, 10, 35, 140 )
PdfDrawLine( 41, 10, 41, 140 )
PdfDrawLine( 50, 10, 50, 140 )

PdfDrawText(  2, 10, "Banco Itau S/A", oPdfFontSizeNormal)
PdfDrawText(  2, 35, "341-4",oPdfFontSizeGrande)
PdfDrawText(  2, 50, "34191.09008 01530.780749 61723.78005 1 50880000012518",oPdfFontSizeGrande)
PdfDrawText(  4, 105, "Vencimento", oPdfFontSizePequeno)
//PdfDrawText(  5, 10, "PAGAVEL EM QUALQUER BANCO ATE O VENCIMENTO", oPdfFontSizeNormal)
//PdfDrawText(  5, 110, "12/09/2012", oPdfFontSizeNormal)
PdfDrawText(  8, 12, "Cedente", oPdfFontSizePequeno)
PdfDrawText(  8, 105, "Agencia/Codigo do Cedente", oPdfFontSizePequeno)
PdfDrawText( 12, 12, "Data do Documento", oPdfFontSizePequeno)
PdfDrawText( 12, 32, "Numero do Documento", oPdfFontSizePequeno)
PdfDrawText( 12, 42, "Especie Doc", oPdfFontSizePequeno)
PdfDrawText( 12, 52, "Aceite", oPdfFontSizePequeno)
PdfDrawText( 12, 72, "Data de Processamento", oPdfFontSizePequeno)
PdfDrawText( 12, 105, "Nosso Número", oPdfFontSizePequeno)
PdfDrawText( 15, 12, "Uso do Banco", oPdfFontSizePequeno)
PdfDrawText( 15, 32, "Carteira", oPdfFontSizePequeno)
PdfDrawText( 15, 42, "Especie", oPdfFontSizePequeno)
PdfDrawText( 15, 62, "Quantidade", oPdfFontSizePequeno)
PdfDrawText( 15, 82, "Valor", oPdfFontSizePequeno)
PdfDrawText( 15, 105, "(=) Valor do Documento", oPdfFontSizePequeno)
PdfDrawText( 18, 12, "Instruções (Texto de Responsabilidade do Cedente)", oPdfFontSizePequeno)
PdfDrawText( 18, 105, "(-) Desconto/Abatimento",oPdfFontSizePequeno)
PdfDrawText( 21, 105, "(-) Outras Deducoes",oPdfFontSizePequeno)
PdfDrawText( 24, 105, "(-) Mora/Multa", oPdfFontSizePequeno)
PdfDrawText( 27, 105, "(+) Mora/Multa",oPdfFontSizePequeno)
PdfDrawText( 30, 105, "(+) Outros Acrescimos", oPdfFontSizePequeno)
PdfDrawText( 33, 105, "(=) Valor Cobrado", oPdfFontSizePequeno)
PdfDrawText( 36, 12, "Sacado", oPdfFontSizePequeno)
PdfDrawText( 40, 12, "SACADOR/AVALISTA", oPdfFontSizePequeno)
PdfDrawText( 42, 100, "Autenticacao Mecânica - Ficha de Compensacao", oPdfFontSizePequeno)
PdfDrawText( 43, 100, "Papelete Processada e impressa pelo cedente", oPdfFontSizePequeno)


//HPDF_Page_SetRGBFill( oPdfPage, 0, 0, 0 ) // reseta cor do fonte

//HPDF_Page_SetRGBStroke( oPdfPage, 0.75, 0.75, 0.75 )
//HPDF_Page_SetRGBStroke( oPdfPage, 0, 0, 0 ) // reseta cor de linha

HPDF_SaveToFile( oPdf, cFilePdf )
HPDF_Free( oPdf )
ShellExecute(cFilePdf)
Return


Function PdfDrawLine(nRowi, nColi, nRowf, nColf)
   nRowi := PdfRow(nRowi)
   nColi := PdfCol(nColi)
   nRowf := PdfRow(nRowf)
   nColf := PdfCol(nColf)
   HPDF_Page_SetLineWidth( oPdfPage, 0.2 ) // Grossura da linha
   HPDF_Page_MoveTo( oPdfPage, nColi, nRowi )
   HPDF_Page_LineTo( oPdfPage, nColf, nRowf )
   HPDF_Page_Stroke( oPdfPage )
   Return NIL

Function PdfDrawText(nRow,nCol,cTexto,nSize)

nRow := PdfRow(nRow)
nCol := PdfCol(nCol)
// nRadiano := nAngulo / 180 * 3.141592 // Calcurate the radian value. 
nRadiano := 0 / 180 * 3.141592 // o texto segue angulo diferente
HPDF_Page_SetFontAndSize( oPdfPage, oPdfFontName, nSize )
HPDF_Page_BeginText( oPdfPage )
HPDF_Page_SetTextMatrix( oPdfPage, Cos(nRadiano), Sin(nRadiano), -Sin(nRadiano), Cos(nRadiano), nCol, nRow )
HPDF_Page_ShowText( oPdfPage, cTexto )
HPDF_Page_EndText( oPdfPage )
Return NIL

Function PdfRow(nRow)
   Return nAltura - nRow*6*1.2

Function PdfCol(nCol)
   Return nCol*6/1.5


Harupdf e boleto

Enviado: 03 Set 2012 04:28
por JoséQuintas
Alterei o tamanho do fonte normal, de 10 pra 9, e acrescentei informações.
O fonte pra impressão está assim, por enquanto:

Código: Selecionar todos

PdfDrawText(  2,  10, "Banco Itau S/A", oPdfFontSizeNormal)
PdfDrawText(  2,  35, "341-4",oPdfFontSizeGrande)
PdfDrawText(  2,  50, "34191.09008 01530.780749 61723.78005 1 50880000012518",oPdfFontSizeGrande)
PdfDrawLine(  3,  10,  3, 140 )
PdfDrawText(  4, 101, "Vencimento", oPdfFontSizePequeno)
PdfDrawText(  5,  11, "PAGAVEL EM QUALQUER BANCO ATE O VENCIMENTO", oPdfFontSizeNormal)
PdfDrawText(  5, 101, "12/09/2012", oPdfFontSizeNormal)
PdfDrawLine(  6,  10,  6, 140 )
PdfDrawText(  7,  11, "Cedente", oPdfFontSizePequeno)
PdfDrawText(  7, 101, "Agencia/Codigo do Cedente", oPdfFontSizePequeno)
PdfDrawText(  8,  11, "NOME DO CEDENTE E CNPJ", oPdfFontSizeNormal)
PdfDrawText(  9,  11, "ENDERECO DO CEDENTE", oPdfFontSizeNormal)
PdfDrawText( 10,  11, "CEP, BAIRRO, CIDADE, UF DO CEDENTE", oPdfFontSizeNormal)
PdfDrawLine( 11,  10, 11, 140 )
PdfDrawText( 12,  11, "Data do Documento", oPdfFontSizePequeno)
PdfDrawText( 12,  32, "Numero do Documento", oPdfFontSizePequeno)
PdfDrawText( 12,  42, "Especie Doc", oPdfFontSizePequeno)
PdfDrawText( 12,  52, "Aceite", oPdfFontSizePequeno)
PdfDrawText( 12,  72, "Data de Processamento", oPdfFontSizePequeno)
PdfDrawText( 12, 101, "Nosso Número", oPdfFontSizePequeno)
PdfDrawText( 13,  11, "12/09/2012", oPdfFontSizeNormal)
PdfDrawText( 13,  32, "NUMERO", oPdfFontSizeNormal)
PdfDrawText( 13,  42, "NF", oPdfFontSizeNormal)
PdfDrawText( 13,  52, "N", oPdfFontSizeNormal)
PdfDrawText( 13,  72, "12/09/2012", oPdfFontSizeNormal)
PdfDrawText( 13, 101, "NOSSO NUMERO", oPdfFontSizeNormal)
PdfDrawLine( 14,  10, 14, 140 )
PdfDrawText( 15,  11, "Uso do Banco", oPdfFontSizePequeno)
PdfDrawText( 15,  32, "Carteira", oPdfFontSizePequeno)
PdfDrawText( 15,  42, "Especie", oPdfFontSizePequeno)
PdfDrawText( 15,  62, "Quantidade", oPdfFontSizePequeno)
PdfDrawText( 15,  82, "Valor", oPdfFontSizePequeno)
PdfDrawText( 15, 101, "(=) Valor do Documento", oPdfFontSizePequeno)
PdfDrawText( 16,  32, "109", oPdfFontSizeNormal)
PdfDrawText( 16,  42, "REAL", oPdfFontSizeNormal)
PdfDrawText( 16, 101, Transform(12345678.90, "@E 999,999,999,999.99"), oPdfFontSizeNormal)
PdfDrawLine( 17,  10, 17, 140 )
PdfDrawText( 18,  11, "Instruções (Texto de Responsabilidade do Cedente)", oPdfFontSizePequeno)
PdfDrawText( 18, 101, "(-) Desconto/Abatimento",oPdfFontSizePequeno)
PdfDrawText( 19, 11, "PROTESTO APOS 10 DIAS DO VENCIMENTO", oPdfFontSizeNormal)
PdfDrawLine( 20,  10, 20, 140 )
PdfDrawText( 21, 101, "(-) Outras Deducoes",oPdfFontSizePequeno)
PdfDrawLine( 23, 100, 23, 140 )
PdfDrawText( 24, 101, "(-) Mora/Multa", oPdfFontSizePequeno)
PdfDrawLine( 26, 100, 26, 140 )
PdfDrawText( 27, 101, "(+) Mora/Multa",oPdfFontSizePequeno)
PdfDrawLine( 29, 100, 29, 140 )
PdfDrawText( 30, 101, "(+) Outros Acrescimos", oPdfFontSizePequeno)
PdfDrawLine( 32, 100, 32, 140 )
PdfDrawText( 33, 101, "(=) Valor Cobrado", oPdfFontSizePequeno)
PdfDrawLine( 35,  10, 35, 140 )
PdfDrawText( 36,  11, "Sacado", oPdfFontSizePequeno)
PdfDrawText( 37,  11, "EMPRESA CLIENTE CNPJ 00.000.000/0000-00", oPdfFontSizeNormal)
PdfDrawText( 38,  11, "ENDERECO CLIENTE", oPdfFontSizeNormal)
PdfDrawText( 39,  11, "CEP BAIRRO CIDADE UF", oPdfFontSizeNormal)
PdfDrawText( 40,  11, "SACADOR/AVALISTA", oPdfFontSizePequeno)
PdfDrawText( 40,  30, "EMPRESA SACADO CNPJ", oPdfFontSizeNormal)
PdfDrawLine( 41,  10, 41, 140 )
PdfDrawText( 42, 100, "Autenticacao Mecânica - Ficha de Compensacao", oPdfFontSizePequeno)
PdfDrawText( 43, 100, "Papelete Processada e impressa pelo cedente", oPdfFontSizePequeno)
PdfDrawLine( 50,  10, 50, 140 )

PdfDrawLine(  3, 100, 35, 100 )

e o resultado disso é este, já o PDF aberto:
Obs. Como já devo ter falado no grupo, não tenho muita afinidade com visual

Imagem

Harupdf e boleto

Enviado: 04 Set 2012 17:28
por HASA
:))
Boa tarde Jose, acho que acertei na trave, peguei seu exemplo e implementei um pouquinho, compilei em Xharbour + BCC55 ok.
Creio que falta muito pouco agora, veja o pdf,
:)Pos
Hasa

Harupdf e boleto

Enviado: 04 Set 2012 18:33
por JoséQuintas
o que acrescentou na linquedição?
Aqui acusa falta de funções pra imagem.

Mas estou ajustando a parte do código de barras assim, baseado em linha/coluna (ainda não consegui testar):
Um detalhe importante: a diferença de 1 pixel na largura é pra não sobrepor uma imagem na outra e deformar.
Resta linqueditar e testar, e torcer pro pdf não deformar o código de barras no redimensionamento.

Código: Selecionar todos

nRowIni  := Int(PdfRow(42))
nColIni  := Int(PdfCol(11))
nLargura := 19
nAltura  := 54

PdfImage( 'CodeStart.jpg', nColIni, nRowIni, nLargura-1, nAltura )
nColIni += ( nLargura )
For nCont = 1 To 44 Step 2
    cImageFile := "CODE" + Substr(cCodBar,nCont,2) + ".JPG"
    PdfImage(cImageFile, nColIni, nRowIni, nLargura-1, nAltura-1)
    nColIni += nLargura
Next
PdfImage( 'CodeStop.jpg', nColIni, nRowIni, nLargura-1, nAltura-1)

Harupdf e boleto

Enviado: 04 Set 2012 19:05
por JoséQuintas
Achei png.lib

Agora falta um leitor de código de barras pra testar.

Harupdf e boleto

Enviado: 04 Set 2012 19:06
por JoséQuintas
A parte do código de barras ficou assim:

Código: Selecionar todos

nRowIni  := Int(PdfRow(42))
nColIni  := Int(PdfCol(11))
nLargura := Int(PdfCol(13)-PdfCol(10))
nAltura  := PdfRow(47)-PdfRow(42)

PdfImage( 'CodeStar.jpg', nColIni, nRowIni, nLargura-1, nAltura )
nColIni += ( nLargura )
For nCont = 1 To 44 Step 2
   cImageFile := "CODE" + Substr(cCodBar,nCont,2) + ".JPG"
   PdfImage(cImageFile, nColIni, nRowIni, nLargura-1, nAltura-1)
   nColIni += nLargura
Next
PdfImage( 'CodeStop.jpg', nColIni, nRowIni, nLargura-1, nAltura-1)


Harupdf e boleto

Enviado: 04 Set 2012 23:10
por JoséQuintas
Não achei função pra desenhar retângulo preenchido. Se encontrar, dá pra fazer o código de barras direto sem precisar de foto.
No exemplo da harupdf o retângulo é feito com linha grossa, mas o problema é que a medida da grossura não é proporcional à medida em pixels, e aí complica tudo.
Dá pra reduzir pra 1 imagem ao invés de 101, mas o legal seria não precisar de nenhuma.
A única imagem seria um quadrado preto, já que o branco não precisa de nada.
Após conseguir testar esse código de barras num leitor, vou brincar com uma única foto.
Pelo menos já teremos as proporções que funcionam.

Harupdf e boleto

Enviado: 05 Set 2012 01:36
por sygecom
Parabéns pessoal, está ficando bom...

Harupdf e boleto

Enviado: 05 Set 2012 09:35
por HASA
:))
Beleza, veja o ZIP anexo acho que resolve o problema das barras. Coloquei o novo código, compila mas... não cria o PDF ? se poder disponibilizar o PRG agradeço.

Hasa

Harupdf e boleto

Enviado: 07 Set 2012 13:07
por JoséQuintas
Ainda falta testar o código de barras.
Coisas importantes:

1) Não adianta imprimir qualquer número no código de barras, tem que ser um código válido
2) Não adianta colocar o digitável no código de barras, não tem nada a ver o número de cima com o código de barras
3) Atenção nas imagens: se a foto chama-se "star.jpg", não adianta incluir "start.jpg" que não sai pdf.
4) O mesmo se tentar incluir outras coisas com nome errado. Não tem mensagem de erro pra arquivo não encontrado. O PDF não sai.
5) Por enquanto a parte importante é funcionar o código de barras, o resto já teremos em hbboleto.

Harupdf e boleto

Enviado: 08 Set 2012 19:31
por HASA
:( , Verdade, mas você poderia ao menos disponibilizar o prg que te enviei com o ajuste efetuado, o restante tá facil gero um boleto para mesmo de 1 real e vou no banco pagar no caixa eletronico, se ler tá testado ok
:)Pos
Hasa

Harupdf e boleto

Enviado: 09 Set 2012 12:21
por JoséQuintas
Ué, só mudei esse bloco do código de barras.
Só ontem reparei que usei nAltura e nLargura que já existem no fonte.
Tentei pagar mas não reconheceu o código de barras.

Não sei se dá pra usar funções do Harbour pra criar uma imagem do zero.
A melhor opção pra evitar que seja deformado seria criar uma imagem com o código de barras completo, e incluir essa imagem no boleto.
no php é fácil, porque nele é só somar as imagens: Barras.jpg=barrafina.jpg+barragrossa.jpg+barrafina.jpg

Harupdf e boleto

Enviado: 10 Set 2012 09:31
por asimoes
Usei para testar boleto do itaú:

http://www.borboleto.com.br/borboleto/d ... o-itau.php

.