ajuda sobre Pdfclass

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

Moderador: Moderadores

jparada
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 20 Out 2021 18:01
Localização: México

ajuda sobre Pdfclass

Mensagem por jparada »

Olá,

Estou usando a classe pdfclass para um relatório fácil que estou fazendo, tudo bem, mas no final do arquivo pdf exibe a legenda "NENHUM CONTEUDO (SEM CONTEÚDO)", aqui está o código que uso (obtido dos exemplos aqui exposto no fórum)

Código: Selecionar todos

  oPDF := PDFClass():New()
  oPDF:Begin()
  oPDF:cFileName := tempFile
  nLinha   := 75
  nPagina := 1
  nMaxCol := oPDF:MaxCol()
  
  rs:MoveFirst()
  Do While !rs:Eof()
    
    If  nLinha   > 65
      oPDF:AddPage()
      
      oPDF:DrawText(  3,  1, 'Empresa, Nil, 10, "Helvetica-Bold", Nil, Nil )
      oPDF:DrawText(  3, 80, 'Hoja ' + hb_NtoS( nPagina ), Nil, 10, "Helvetica", Nil, Nil )
      oPDF:DrawText(  4,  1, 'Reporte de existencias al ' + fechaLegible( Date() ) + ' ' + Time(), Nil, 10, "Helvetica-Bold", Nil, Nil )

      oPDF:DrawText( 6,  1, hb_utf8ToStr( 'Código' ), Nil, 10, "Helvetica-Bold", Nil, Nil )
      oPDF:DrawText( 6, 12, 'Nombre del producto' , Nil, 10, "Helvetica-Bold", Nil, Nil )      
      oPDF:DrawText( 6, 75, "Existencia", Nil, 10, "Helvetica-Bold", Nil, Nil )

      nLinha := 8
      nPagina += 1
    Endif

    oPDF:DrawText( nLinha    ,  1, rs:Fields( "codigoproducto" ):Value, NIL, 10, 'Courier-Bold', NIL, NIL )
    oPDF:DrawText( nLinha    , 12, rs:Fields( "descripcion" ):Value   , NIL, 10, 'Courier-Bold', NIL, NIL )
    oPDF:DrawText( nLinha    , 70, rs:Fields( "existencia" ):Value, '@E 99,999,999.99', 10, 'Courier-Bold', NIL, NIL )
    
    nLinha += 1.5
    
    rs:MoveNext()
  
  Enddo
  
  oPDF:End()
o que preciso para evitar aquela última página com essa legenda?

Eu aprecio sua ajuda.

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

ajuda sobre Pdfclass

Mensagem por JoséQuintas »

jparada escreveu:o que preciso para evitar aquela última página com essa legenda?
Era só ter olhado o fonte de onde imprime isso.

Código: Selecionar todos

      IF ::nPdfPage == 0
         ::AddPage()
         ::DrawText( 10, 10, "NENHUM CONTEUDO (NO CONTENT)",, ::nFontSize * 2 )
      ENDIF
E procurando um pouco mais, é no oPDF:PageHeader() que soma 1 na contagem de páginas.

Opção 1:

Ao invés de oPDF:AddPage(), usar oPDF:PageHeader()

Opção 2:

Alterar diretamente oPDF:nPDFPage := 1

Opção 3:

Na verdade, pra testar pular página é oPDF:MaxRowTest()
Fazendo de cabeça, mas acho que seria isto, estilo um relatório normal feito a mão.

Código: Selecionar todos

oPDF:nPDFRow := 99
DO WHILE ! Eof()
   oPDF:MaxRowTest()
   @ oPDF:nRow + 1, 0 SAY "xx"
  SKIP
ENDDO
oPDF
O MaxRowTest() equivale a IF lin > 66... cabecalho()... ENDIF, sendo que se não criar oPDF:acHeader(), não tem impressão de cabeçalho.

Código: Selecionar todos

METHOD PageHeader() CLASS PDFClass

   LOCAL nCont

   IF Len( ::acHeader ) > 0
      IF ::nPageNumber != 0 .AND. ::nRow != 0 .AND. ::nPdfPage != 0
         ::PageFooter()
      ENDIF
   ENDIF
   ::nPdfPage    += 1
   ::nPageNumber += 1
   ::nRow        := 0
   Mensagem( "Impressão em andamento, folha " + StrZero( ::nPageNumber, 7 ) )
   ::AddPage()
   IF Len( ::acHeader ) > 0

Código: Selecionar todos

METHOD MaxRowTest( nRows ) CLASS PDFClass

   hb_Default( @nRows, 0 )
   IF ::nRow > ::MaxRow() - 2 - nRows
      ::PageHeader()
   ENDIF

   RETURN Nil
Opcionalmente, se quiser que pule 3 linhas antes do final, usa MaxRowTest(3)
2 linhas foram reservadas como margem no final.
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/
jparada
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 20 Out 2021 18:01
Localização: México

ajuda sobre Pdfclass

Mensagem por jparada »

oi, optei pela primeira opção, funcionando muito bem.

Obrigado pela ajuda.

Saudações,
Javier
jparada
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 20 Out 2021 18:01
Localização: México

ajuda sobre Pdfclass

Mensagem por jparada »

Pediram-me uma alteração no relatório, colocaram a linha de classificação do produto, e agora não estou obtendo o resultado que desejo, tenho esses relatórios funcionando gerando arquivos Excel sem problema, mas me pediram para alterá-los para pdf e não para pdf não tenho experiência, então estou tentando replicar o código que funciona no Excel para usá-lo com a classe PdfClass, até agora tenho esse código:

Código: Selecionar todos

  
  oPDF := PDFClass():New()
  oPDF:Begin()
  oPDF:cFileName := tempFile
  nLinha   := 70 // 75
  nPagina := 1
  nMaxCol := oPDF:MaxCol()
  
  //METHOD SetInfo( cAuthor, cCreator, cTitle, cSubject ) CLASS PDFClass
  oPDF:SetInfo( 'Javier Parada', hb_utf8ToStr( '' ),'Reporte de existencias', 'empresa' )
  
  rs:MoveFirst()
  Do While !rs:Eof()
    
    idclasificacion := rs:Fields( 'idclasificacion' ):Value
  	clasificacion   := rs:Fields( 'clasificacion' ):Value
    
    If  nLinha   > 60 // 65
      oPDF:PageHeader()
      
      oPDF:DrawText(  3,  1, 'Empresa', NIL, 10, 'Helvetica-Bold', NIL, NIL )
      oPDF:DrawText(  3, 80, 'Hoja ' + hb_NtoS( nPagina ), NIL, 10, 'Helvetica', NIL, NIL )
      oPDF:DrawText(  4,  1, 'Reporte de existencias al ' + fechaLegible( Date() ) + ' ' + Time(), NIL, 10, 'Helvetica-Bold', NIL, NIL )

      oPDF:DrawText( 6,  1, hb_utf8ToStr( 'Código' ), NIL, 10, 'Helvetica-Bold', NIL, NIL )
      oPDF:DrawText( 6, 12, 'Nombre del producto' , NIL, 10, 'Helvetica-Bold', NIL, NIL )      
      oPDF:DrawText( 6, 75, 'Existencia', NIL, 10, 'Helvetica-Bold', NIL, NIL )

      nLinha := 8
      nPagina += 1
    Endif    
    
    oPDF:DrawText( nLinha    ,  1, hb_Utf8ToStr( 'Clasificación: ' ) + hb_NToS( idclasificacion ) + ' - ' + clasificacion, NIL, 10, 'Courier-Bold', NIL, NIL )
    nLinha += 1

    Do While !rs:Eof() .AND. idclasificacion == rs:Fields( 'idclasificacion' ):Value

      oPDF:DrawText( ++nLinha    ,  1, rs:Fields( 'codigoproducto' ):Value, NIL, 10, 'Courier-Bold', NIL, NIL )
      oPDF:DrawText(   nLinha    , 12, rs:Fields( 'descripcion' ):Value   , NIL, 10, 'Courier-Bold', NIL, NIL )
      oPDF:DrawText(   nLinha    , 70, rs:Fields( 'existencia' ):Value, '@E 99,999,999.99', 10, 'Courier-Bold', NIL, NIL )
    
      nLinha += 1.5
    
      rs:MoveNext()
  
    Enddo

  Enddo
  
  oPDF:End()
poderia me ajudar a ver o que estou fazendo de errado, os erros é que agora não consigo controlar o salto da folha e nem todos os produtos na classificação estão imprimindo.

meu maior problema é que com o pdf não sei como controlar a quebra de folha

Eu aprecio sua ajuda.

Javier
Fernando queiroz
Usuário Nível 4
Usuário Nível 4
Mensagens: 779
Registrado em: 13 Nov 2014 00:41
Localização: Porto Alegre/RS

ajuda sobre Pdfclass

Mensagem por Fernando queiroz »

da uma olhada na rotina que tem quebra de pagina

Código: Selecionar todos

	oPDF := PDFClass()
	IF oPDF == NIL
		hwg_msginfo("Falha da criação do objeto PDF")
		RETURN .F.
	ENDIF
	HB_GTINFO( HB_GTI_CLIPBOARDDATA, ::cFileName)
	oPDF:cFileName 	:= ::cFileName
	oPDF:cDefaultPrinter := ::cDefaultPrinter

	oPDF:SetType( PDFCLASS_LANDSCAPE )

	oPDF:Begin()
	nLinha	:= 100
	nPagina := 1
	nMaxCol := oPDF:MaxCol()
	
	DO WHILE ! oQuery:Eof()
		IF 	nLinha	> 96
			oPDF:AddPage()

			oPDF:DrawBox( 0, 0, 9, 41, Nil, Nil, Nil )                 // box esquerdo
			oPDF:DrawImageSize( 0.5, 0.5, 8, 39, "logotipo.jpg" )             // logotipo

			oPDF:DrawBox( 0, 41, 9, 117, Nil, Nil, Nil )  // box centro
			oPDF:DrawText( 2.0, 42, RTRIM(oQuery1:Fields( "NomeUsuario" ):Value), nil, 10, "Helvetica-Bold", Nil, Nil )
			oPDF:DrawText( 3.5, 42, RTRIM(oQuery1:Fields( "n_xLgr" ):Value) + ', ' + RTRIM(oQuery1:Fields( "n_nro" ):Value), Nil, 8, "Helvetica", Nil, Nil )
			oPDF:DrawText( 5.0, 42,'BAIRRO - ' + RTRIM(oQuery1:Fields( "n_xBairro" ):Value), Nil, 8, "Helvetica", Nil, Nil )
			oPDF:DrawText( 6.4, 42, "CEP " +oQuery1:Fields( "n_CEP" ):Value + ' - ' + RTRIM(oQuery1:Fields( "n_xMun" ):Value) + ' - ' + oQuery1:Fields( "n_xUF" ):Value + " - FONE: " +oQuery1:Fields( "n_fone" ):Value, Nil, 8, "Helvetica", Nil, Nil )
			oPDF:DrawText( 8.0, 42, 'CNPJ-'+RTRIM(oQuery1:Fields( "n_CNPJ" ):Value) + '   Insc.Est.-' + RTRIM(oQuery1:Fields( "n_IE" ):Value) , Nil, 10, "Helvetica-Bold", Nil, Nil )

			oPDF:DrawBox( 0, nMaxCol, 9, 41, Nil, Nil, Nil )  // box direito
			oPDF:DrawText( 2, 120, "CONTAS A RECEBER 2" , Nil, 10, "Helvetica", Nil, Nil )
			oPDF:DrawText( 4, 120, "PAGINA Nr.: " + STRZERO(nPagina,4,0), Nil, 10, "Helvetica", Nil, Nil )
			oPDF:DrawText( 6, 120, "DATA: " + DTOC(M->DAT_HOJE), Nil, 10, "Helvetica", Nil, Nil )
			oPDF:DrawText( 8, 120, "HORA: " + TIME(), Nil, 10, "Helvetica", Nil, Nil )

			oPDF:DrawBox( 9, 0, 12, nMaxCol, Nil, Nil, Nil )
			oPDF:DrawText( 11, 1, "RELACAO DAS RECEITAS EM ABERTO DE "+DTOC(::dPERINI)+" A "+DTOC(::dPERFIN), Nil, 10, "Helvetica-Bold", Nil, Nil )

			oPDF:DrawBox( 12, 0, 14.5, nMaxCol, Nil, Nil, Nil )
			oPDF:DrawText( 14, 01, "TITULO", Nil, 10, "Helvetica-Bold", Nil, Nil )
			oPDF:DrawText( 14, 21, "CLIENTE" , Nil, 10, "Helvetica-Bold", Nil, Nil )
			oPDF:DrawText( 14, 81, "VALOR TITULO", Nil, 10, "Helvetica-Bold", Nil, Nil )		
			oPDF:DrawText( 14, 104, "ACRESCIMOS", Nil, 10, "Helvetica-Bold", Nil, Nil )	
			oPDF:DrawText( 14, 126, "TOTAL RECEBER", Nil, 10, "Helvetica-Bold", Nil, Nil )

			nLinha := 16
			nPagina += 1

		ENDIF
		
		IF oQuery:Fields( "DATVEN" ):Value != dDATVEN
			oPDF:DrawText( nLinha++, 10, "Total a RECEBER no Dia "+DTOC(dDATVEN)+" --->"+transform(TOTDIARIO,"@E 99,999,999,999.99") , Nil, 10, "Courier-Bold", Nil, Nil )	
			oPDF:DrawLine( nLinha-0.5, 0, nLinha-0.5, nMaxCol, 1 )
			nLinha++
			TOTDIARIO	:= 0.00
			dDATVEN		:= oQuery:Fields( "DATVEN" ):Value
		ENDIF

		MULTA:=0.00
		JUROS:=0.00
		IF (M->DAT_HOJE-oQuery:Fields( "DATVEN" ):Value) > 0
			IF M->DAT_HOJE > oQuery:Fields( "VENPRO" ):Value
				MULTA=oQuery:Fields( "MORA" ):Value*(M->DAT_HOJE-oQuery:Fields( "DATVEN" ):Value)
				JUROS=(oQuery:Fields( "VALOR" ):Value*oQuery:Fields( "PER_MULTA" ):Value*(M->DAT_HOJE-oQuery:Fields( "DATVEN" ):Value))/3000
			END 
		END
		ACRESCIMOS+=MULTA+JUROS
		TOTALARECEBER+=oQuery:Fields( "VALOR" ):Value+MULTA+JUROS
		oPDF:DrawText( nLinha, 00, STRZERO(oQuery:Fields( "DOCUMENTO" ):Value,9,0) + "/" + STRZERO(oQuery:Fields( "PARCELA" ):Value,2,0), Nil, 10, "Courier-Bold", Nil, Nil )
		oPDF:DrawText( nLinha, 21, STRZERO(oQuery:Fields( "CLIENTES_ID" ):Value,9,0)+"-"+SUBSTR(oQuery:Fields( "nraz_soc" ):Value,1,27) , Nil, 10, "Courier-Bold", Nil, Nil )				
		oPDF:DrawText( nLinha, 80, oQuery:Fields( "VALOR" ):Value, "@E 99,999,999.99", 10, "Courier-Bold", Nil, Nil )
		oPDF:DrawText( nLinha, 108, MULTA+JUROS, "@E 99,999.99", 10, "Courier-Bold", Nil, Nil )
		oPDF:DrawText( nLinha, 128, oQuery:Fields( "VALOR" ):Value+MULTA+JUROS, "@E 99,999,999.99", 10, "Courier-Bold", Nil, Nil )
		nLinha +=2
		TOTDIARIO  += oQuery:Fields( "VALOR" ):Value
		TOTGERAL   += oQuery:Fields( "VALOR" ):Value

		oQuery:MoveNext()
	ENDDO   
	oPDF:DrawText( nLinha++, 10, "Total a RECEBER no Dia "+DTOC(dDATVEN)+" --->"+transform(TOTDIARIO,"@E 99,999,999,999.99") , Nil, 10, "Courier-Bold", Nil, Nil )	
	oPDF:DrawBox( nLinha, 0, nLinha+3, nMaxCol, Nil, Nil, Nil )
	oPDF:DrawText( nLinha+2, 10, "TOTAL A RECEBER NO PERIODO ==> "+transform(TOTGERAL,"@E 99,999,999,999.99") , Nil, 12, "Courier-Bold", Nil, Nil )
	
	oPDF:End(  )

	oPDF:PrintPreview(  )

RETURN NIL	
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
jparada
Usuário Nível 1
Usuário Nível 1
Mensagens: 4
Registrado em: 20 Out 2021 18:01
Localização: México

ajuda sobre Pdfclass

Mensagem por jparada »

lamento não poder entender o código de exemplo no momento.

Javier
Responder