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


