Harupdf e máximo de linhas/colunas

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harupdf e máximo de linhas/colunas

Mensagem por JoséQuintas »

Estou tentando definir a quantidade de colunas para um PDF.
Alguém conhece alguma fórmula prática?
Por enquanto estou usando as fórmulas abaixo, que foram as mais próximas.

Código: Selecionar todos

METHOD MaxRow() CLASS PDFGenClass
   LOCAL nPageHeight, nFontSize, nMaxRow
   nPageHeight := HPDF_Page_GetHeight( ::oPdfPage )
   nFontSize   := HPDF_Page_GetCurrentFontSize( ::oPdfPage )
   nMaxRow     := Int( nPageHeight / nFontSize )
   RETURN nMaxRow

METHOD MaxCol() CLASS PDFGenClass
   LOCAL nPageWidth, nFontSize, nMaxCol
   nPageWidth := HPDF_Page_GetWidth( ::oPdfPage )
   nFontSize  := HPDF_Page_GetCurrentFontSize( ::oPdfPage )
   nMaxCol    := Int( nPageWidth / nFontSize * 1.6 )
   RETURN nMaxCol
Já tentei fazer uso de:
HPDF_Page_GetTextLeading( ::oPdfPage )
HPDF_Page_GetLineSpacing( ::oPdfPage )
HPDF_Page_GetCharSpace( ::oPdfPage )
HPDF_Page_GetLineWidth( ::oPdfPage )
HPDF_Page_GetHorizontalSpacing( ::oPdfPage )

Mas a maioria retorna 0.
Com certeza, testo pela página, após criar a página e definir fonte.

Código: Selecionar todos

   ::oPdf           := HPDF_New()
   HPDF_SetCompressionMode( ::oPdf, HPDF_COMP_ALL )
   ::oPdfPage := HPDF_AddPage( ::oPdf )
   HPDF_Page_SetSize( ::oPdfPage, HPDF_PAGE_SIZE_A4, iif( lPortrait, HPDF_PAGE_PORTRAIT, HPDF_PAGE_LANDSCAPE ) )
   HPDF_Page_SetFontAndSize( ::oPdfPage, HPDF_GetFont( ::oPdf, ::cFontName, NIL ), ::nFontSize )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harupdf e máximo de linhas/colunas

Mensagem por JoséQuintas »

Agora o problema é com cores.
O preenchimento do retângulo está sendo sempre preto, mas não consigo entender aonde está o problema.

Código: Selecionar todos

         oPDF:SetRGBStroke( 0.1, 0.1, 0.1 )
         oPDF:SetRGBFill( 0.1, 0.1, 0.1 )
         oPdf:DrawRetangle( oPdf:nRow - 1, 0, oPdf:MaxCol() - 2, 2.5, , 2 )

METHOD SetRGBFill( ... ) CLASS PDFGenClass
   HPDF_Page_SetRGBFill( ::oPdfPage, ... )
   RETURN NIL

METHOD SetRGBStroke( ... ) CLASS PDFGenClass
   HPDF_Page_SetRGBStroke( ::oPdfPage, ... )
   RETURN NIL

METHOD DrawRetangle( nTop, nLeft, nWidth, nHeight, nPenSize, nType ) CLASS PDFGenClass
   nType  := iif( nType == NIL, 1, nType )
   IF nPenSize != NIL
      HPDF_Page_SetLineWidth( ::oPdfPage, nPenSize )
   ENDIF
   IF ::nDrawMode == PDFGEN_DRAWMODE_ROW_COL
      nTop    := ::PdfRow( nTop )
      nLeft   := ::PdfCol( nLeft )
      nWidth  := ( nWidth ) * ::nFontSize / 1.6
      nHeight := -( nHeight ) * :: nFontSize 
   ENDIF
   HPDF_Page_Rectangle( ::oPdfPage, nLeft, nTop, nWidth, nHeight )
   IF nType == 1
      HPDF_Page_Stroke( ::oPdfPage )     // borders only
   ELSEIF nType == 2
      HPDF_Page_Fill( ::oPdfPage )       // inside only
   ELSE
      HPDF_Page_FillStroke( ::oPdfPage ) // all
   ENDIF
   RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harupdf e máximo de linhas/colunas

Mensagem por JoséQuintas »

É esquisito, mas o resultado parece não ser o que deveria.
Pelo menos cheguei em algo aproximado.

- Margem: Não consegui encontrar na Harupdf aonde define margem. Se usar toda área útil, tem problemas no PDF gerado. Fui tentando algumas
- Quantidade de linhas: ( altura do papel - ( margem * 2 ) ) / tamanho do fonte
- Quantidade de colunas: ( largura do papel - ( margem * 2 ) ) / ( tamanho do fonte / 1.7 )
- Funções Row() e Col() pra calcular posições

Um exemplo de como ficou meu relatório em HaruPDF, praticamente igual o que era antes sem ela:

Código: Selecionar todos

STATIC FUNCTION imprime()
   LOCAL oPDF, mInkey

oPDF := PDFClass():New()
oPDF:SetPortrait( Sistema:FormatoImpressao == 2 )
mInkey = 0
oPDF:acHeader := { "","",""}
oPDF:acHeader[ 1 ] = "LISTAGEM DO CADASTRO DE CIDADES/PAISES"
oPDF:acHeader[ 3 ] = Space(43) + "CODIGO  NOME-------------------------------------  UF"
DO WHILE mInkey != K_ESC .AND. .NOT. eof()
   GrafProc()
   mInkey = MyInkey()
   oPDF:MaxRowTest()
   oPDF:DrawText( oPDF:nRow, 44, jpcidade->ciNumLan )
   oPDF:DrawText( oPDF:nRow, 52, jpcidade->cinome )
   oPDF:DrawText( oPDF:nRow, 96, jpcidade->ciuf )
   oPDF:nRow += 1
   SKIP
ENDDO
IF oPDF:nPageNumber != 0
   IF mInkey == K_ESC
      @ oPDF:nRow+1, 0 SAY "*** Impressao interrompida ***"
   ENDIF
   oPDF:PageFooter()
ENDIF
oPDF:Save()
ShellExecuteOpen( oPDF:cFileName )
RETURN NIL
Antes que perguntem....
Também tem opções de desenhar linha, desenhar retângulos pintados ou não, cores, etc.
E quando necessário, principalmente pra linhas/retângulos, utilizo por exemplo linha 1.5

Motivo:
A posição do PDF é referência pra texto, e indica a parte de baixo da linha.
No caso de um traço, o traço seria no meio da linha.
No caso de um retângulo pintado, o traço do retângulo seria nas partes de cima ou de baixo da linha.
Nestes casos, a posição de linha com decimal ajuda a fazer o ajuste.

Também é interessante o altura/largura.
Caso seja positivo/negativo, indica se vai ser desenhado dali pra cima, ou dali pra baixo, ou dali pra direita, ou dali pra esquerda.
Mas conforme a opção, o desenho sai invertido.

À primeira vista, só vou sentir falta do pCol()+2, que facilitava não precisar fazer contas.

Infelizmente, nos relatórios contábeis vou ter que manter a opção de matricial.
É que isso limita a usar somente texto...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harupdf e máximo de linhas/colunas

Mensagem por JoséQuintas »

No pedido, pra fazer retângulos igual NF, com letras diferentes ficou assim (essa parte em dobro, pras duas linhas):

Código: Selecionar todos

   FOR nCont = 1 TO 6
      oPdf:DrawRetangle( oPdf:nRow - 0.5, ( nCont - 1 ) * oPdf:MaxCol() / 6, oPdf:MaxCol() / 6, 1.5 )
   NEXT
   oPdf:DrawText( oPdf:nRow,     oPdf:MaxCol() / 6 * 0 + 1, "II", oPdf:nFontSize / 2 )
   oPdf:DrawText( oPdf:nRow,     oPdf:MaxCol() / 6 * 1 + 1, "IPI", oPdf:nFontSize / 2 )
   oPdf:DrawText( oPdf:nRow,     oPdf:MaxCol() / 6 * 2 + 1, "ICMS", oPdf:nFontSize /2 )
   oPdf:DrawText( oPdf:nRow,     oPdf:MaxCol() / 6 * 3 + 1, "ICMS ST", oPdf:nFontSize / 2 )
   oPdf:DrawText( oPdf:nRow,     oPdf:MaxCol() / 6 * 4 + 1, "PESO BRUTO", oPdf:nFontSize / 2 )
   oPdf:DrawText( oPdf:nRow,     oPdf:MaxCol() / 6 * 5 + 1, "VL.PRODUTOS", oPdf:nFontSize / 2 )
   oPdf:DrawText( oPDF:nRow+0.5, oPdf:MaxCol() / 6 * 0 + 1, Transform( jppedi->pdIIVal,  PicVal( 13, 2 ) ) )
   oPdf:DrawText( oPdf:nRow+0.5, oPdf:MaxCol() / 6 * 1 + 1, Transform( jppedi->pdIPIVal, PicVal( 13, 2 ) ) )
   oPdf:DrawText( oPdf:nRow+0.5, oPdf:MaxCol() / 6 * 2 + 1, Transform( jppedi->pdIcmVal, PicVal( 13, 2 ) ) )
   oPdf:DrawText( oPdf:nRow+0.5, oPdf:MaxCol() / 6 * 3 + 1, Transform( jppedi->pdSubVal, PicVal( 13, 2 ) ) )
   oPdf:DrawText( oPDF:nRow+0.5, oPdf:MaxCol() / 6 * 4 + 1, Transform( nPesoBruto,  PicVal( 13, 0 ) ) )
   oPdf:DrawText( oPdf:nRow+0.5, oPdf:MaxCol() / 6 * 5 + 1, Transform( jppedi->pdValPro, PicVal( 13, 2 ) ) )
   oPdf:nRow += 1.5
o resultado foi este:
Anexos
retangulospdf.png
retangulospdf.png (9.41 KiB) Exibido 881 vezes
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Harupdf e máximo de linhas/colunas

Mensagem por JoséQuintas »

Achei a proporção correta: 1.66666
Até que foi relativamente simples: pegar a posição antes de mostrar o texto, depois de mostrar o texto, e ver a diferença.
Foi igual pra qualquer tamanho do fonte Courier
Simples encontrar, mas não simples o fonte.... rs

Largura em medida pdf = tamanho do fonte / 1.66666

Código: Selecionar todos

#include "hbclass.ch"

PROCEDURE Main
   LOCAL oPDF, oPage, cFontName, nFontSize, nRadian, nAngle, nRow, nCol, cTexto, nTextColIni, nTextColFim

   nFontSize := 20
   cFontName := "Courier"
   nAngle    := 0
   nRow      := 1
   nCol      := 1
   cTexto    := "testando harupdf"
   
   oPdf := HPDF_New()
   HPDF_SetCompressionMode( oPdf, HPDF_COMP_ALL )
   oPage := HPDF_AddPage( oPdf )
   HPDF_Page_SetSize( oPage, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE )
   HPDF_Page_SetFontAndSize( oPage, HPDF_GetFont( oPdf, cFontName, NIL ), nFontSize )
   HPDF_Page_BeginText( oPage )
   nRadian := ( nAngle / 180 ) * 3.141592
   HPDF_Page_SetTextMatrix( oPage, Cos( nRadian ), Sin( nRadian ), -Sin( nRadian ), Cos( nRadian ), nCol, nRow )
   nTextColIni := HPDF_Page_GetCurrentTextPos( oPage )[ 1 ]
   HPDF_Page_ShowText( oPage, cTexto )
   nTextColFim := HPDF_Page_GetCurrentTextPos( oPage )[ 1 ]
   ? nFontSize, nTextColIni, nTextColFim, Transform( nFontSize / ( ( nTextColFim - nTextColIni ) / Len( cTexto )  ), "999.9999999999999999" )
   HPDF_Page_EndText( oPage )
   HPDF_Free( oPdf )
   RETURN
Isso facilita pegar um fonte de relatório e usar mesmas coordenadas de linha/coluna no pdf.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Ruben Dario
Usuário Nível 3
Usuário Nível 3
Mensagens: 127
Registrado em: 14 Jun 2015 23:19
Localização: Colombia

?Harupdf e máximo de linhas/colunas

Mensagem por Ruben Dario »

?hola Jose.

Tuj crerates la libreria PDFClass , me podrias mostar como lo hicistes.

Gracias
Responder