Página 1 de 1

Harupdf e máximo de linhas/colunas

Enviado: 22 Ago 2013 20:33
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 )

Harupdf e máximo de linhas/colunas

Enviado: 24 Ago 2013 12:00
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

Harupdf e máximo de linhas/colunas

Enviado: 02 Set 2013 00:46
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...

Harupdf e máximo de linhas/colunas

Enviado: 02 Set 2013 01:05
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:

Harupdf e máximo de linhas/colunas

Enviado: 07 Set 2013 21:27
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.

?Harupdf e máximo de linhas/colunas

Enviado: 27 Ago 2015 19:43
por Ruben Dario
?hola Jose.

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

Gracias