Página 1 de 2

Dúvida Sumatra ignora tamanho de campo

Enviado: 08 Ago 2017 18:50
por porter
olá pessoal,
Estou utilizando o SUMATRA para gerar relatório, no comando abaixo, se o campo ENDFOR por exemplo estiver vazio,
o campo seguinte BAIFOR imprime na coluna ENDFOR, portanto é ignorado o espaço do campo DBF no caso Caracter de 30,
só gera o relatório corretamente nas colunas desejadas, se os campos forem preenchido, alguém encontrou esse problema ?

@ PROW()+1,00 SAY CODFOR + " " + NOMFOR + " " + ENDFOR + " " + LEFT(BAIFOR,30)

Habour 3.2.0dev console
DBF
Windows 7

Obrigado.

Dúvida Sumatra ignora tamanho de campo

Enviado: 08 Ago 2017 19:31
por Itamar M. Lins Jr.
Ola!
Cadê o link do SUMATRA ? ou os fontes ?

Saudações,
Itamar M. Lins Jr.

Dúvida Sumatra ignora tamanho de campo

Enviado: 08 Ago 2017 19:43
por porter
Estou gerando um arquivo texto e acionando dessa forma:

Código: Selecionar todos

SET DEVICE TO SCREEN
SET PRINTER TO
SET PRINTER OFF
cArqPrn := "C:\ESTOQUE\FORNECEDORES.TXT"
cArqPdf := "RELAT.PDF"
TXTtoPDF( cArqPrn, cArqPdf, .t., .t.)

Dúvida Sumatra ignora tamanho de campo

Enviado: 08 Ago 2017 22:41
por JoséQuintas
Depende do fonte usado no PDF.
Se for, por exemplo, Arial, o tamanho dos caracteres é flexível e não fixo.

Verifique essa função TxtToPdf()

Dúvida Sumatra ignora tamanho de campo

Enviado: 09 Ago 2017 09:14
por porter
Estou usando fonte Courier, gostaria que considerasse o espaço total de um campo quando estiver vazio,
se em um determinado campo gravar apenas um (.) ponto, ai sim considera o espaçamento total.

Código: Selecionar todos

	HPDF_SetCompressionMode( pdf, HPDF_COMP_ALL )
	page             := HPDF_AddPage(pdf)
	height	    := HPDF_Page_GetHeight(page)
	width 	    := HPDF_Page_GetWidth(page)
  	font 		    := HPDF_GetFont( pdf, "Courier", NIL )

Dúvida Sumatra ignora tamanho de campo

Enviado: 09 Ago 2017 15:12
por rubens
Porter,

Não é problema do Sumatra....
Para mim é problema da HaruPdf ou na TXTtoPDF. Pelo que percebi se você manda imprimir um texto que começa vazio e mandar posicionar em uma determinada coluna ele vai começar na coluna 0.
Se você mandar imprimir um campo em branco só com espaço vai ser ignorado o tamanho dele e o restante vai começar na coluna 0.
Para contornar o problema eu mando imprimir um CHR(255) mais o restante da linha, inclusive quando tiver formatação na linha não mande em colunas fixas, concatene o texto e mande imprimir a linha completa.
Ao invés de:
@ PROW()+1,00 SAY CODFOR + " " + NOMFOR + " " + ENDFOR + " " + LEFT(BAIFOR,30)
Mande:
@ PROW()+1,00 SAY CHR(255)+CODFOR + " " + NOMFOR + " " + ENDFOR + " " + LEFT(BAIFOR,30)

Teste assim para ver se funciona.

Rubens

Dúvida Sumatra ignora tamanho de campo

Enviado: 09 Ago 2017 17:33
por porter
olá Rubens,
Funcionou perfeitamente, muito obrigado por sua ajuda e atenção.

Dúvida Sumatra ignora tamanho de campo

Enviado: 09 Ago 2017 18:01
por JoséQuintas
Vai ver, no TxtToPdf tem um AllTrim().... rs

Dúvida Sumatra ignora tamanho de campo

Enviado: 09 Ago 2017 18:43
por Itamar M. Lins Jr.
Ola!
Onde encontramos a SUMATRA ?
E está errado a meu ver ai a lógica.
Pra mim deveria usar strtran(endfor," ",chr(255)) assim em todas as variáveis, mas mesmo assim seria gambiarra por causa das paginas de códigos,
PTISO,PT850,UTF...
Como já funcionou beleza, bola pra frente!

Saudações,
Itamar M. Lins Jr.

Dúvida Sumatra ignora tamanho de campo

Enviado: 09 Ago 2017 19:12
por Jairo Maia
Este post sim faz jus ao ditado:

O fácil se resolve na hora, o difícil se resolve rápido, o impossível se resolve em algumas horas, e o MILAGRE demora um pouco...

Esse Rubens e esse Porter são loucos de pedra... risos...

Dúvida Sumatra ignora tamanho de campo

Enviado: 09 Ago 2017 19:24
por JoséQuintas
Pois é.

A pergunta é sobre Sumatra.
A função é TxtToPdf.
a dica é sobre Harupdf .
E a solução Chr(255) NO TXT.

Isso lembra aquela frase:
Tem dia que de noite é phod.

Dúvida Sumatra ignora tamanho de campo

Enviado: 10 Ago 2017 08:41
por rubens
Bom dia...

Quando mexi na TXTtoPDF criada pelo Toledo... Ela imprimia linha a linha e eu precisava que lesse caracater a caracter para encontrar os códigos de negrito, sublinhado, condesado etc...

Daí quando o início da linha é " " o harupdf ignorava a coluna e começava na coluna zero... o que eu consegui foi isso, simular um caracter no inicio. A partir do momento em que existe um caracter no inicio da linha pode posicionar em qualquer coluna que dá certo..
A função é esta abaixo... se houver uma solução mais "lógica" seja bem vinda...

Código: Selecionar todos

********************************************************************************
Function TXTtoPDF( cFileToRead, cFileToSave, lAbre )
local x_ret
Local pdf := HPDF_New()
local tw
local l,a
LOCAL cTELA := SaveScreen()
Local cBuffer

Local chr_pcom:="CHR(15)"        			// ativa comprimido
Local chr_tcom:="CHR(18)"        			// desativa comprimido
 
Local chr_penf:="CHR(27)+'E'"      		// ativa enfatizado
Local chr_tenf:="CHR(27)+'F'"      		// desativa enfatizado
 
Local chr_pexp:="CHR(14)"  					// ativa expansao
Local chr_texp:="CHR(18)"  					// desativa expansao

if pdf == NIL
   return .F.
endif

HPDF_SetCompressionMode( pdf, HPDF_COMP_ALL )
page 		:= HPDF_AddPage(pdf)
height	:= HPDF_Page_GetHeight(page)
width 	:= HPDF_Page_GetWidth(page)
font 		:= HPDF_GetFont( pdf, "Courier", NIL )
fontsize := 12
txtfile	:= memoread(cFileToRead)
vpag:=.F.

Zebrado()

HPDF_Page_BeginText(page)                              
HPDF_Page_MoveTextPos(page,15,height-20)
nFIM_TEXTO := mlcount(txtfile,255)

for l=1 to nFIM_TEXTO

   Imprime2( L, nFIM_TEXTO, 'Gerando PDF!!! Aguarde...')

   cLIN:=AllTrim(memoline(txtfile,255,l,1,.f.))

   FOR X = 1 TO LEN( cLIN )   // faz a contagem dos bytes da linha
   
      cBUFFER := SubStr( cLIN, X, 1)
		
      // FIM DE PAGINA
      IF CHR(12) $ cBUFFER
         IF L = nFIM_TEXTO
            EXIT
         ELSE
            page := HPDF_AddPage(pdf)
            Zebrado()
            HPDF_Page_BeginText(page)
            HPDF_Page_MoveTextPos(page,15,height-20)
         ENDIF
         X++
         LOOP
         *cBUFFER := cBUFFER+SubStr( cLIN, X, 1)
      ENDIF
		
		// TECLA ESC, TEM QUE PEGAR A PROXIMA TECLA E DEIXA FAZER O TESTE
      IF cBUFFER==CHR(27) // LE CHR(27)+'E' OU CHR(27)+'F'
         X++
         cBUFFER := cBUFFER+SubStr( cLIN, X, 1)
      ENDIF
		
      // Ativa Condensado
      IF &chr_pcom. == cBUFFER
         fontsize=7
         font:= HPDF_GetFont( pdf, "Courier-Bold", NIL )
         LOOP
      ENDIF
	   
      IF &chr_tcom. == cBUFFER
         fontsize=12
         font:= HPDF_GetFont( pdf, "Courier", NIL )
         LOOP
      ENDIF
	   
      // ATIVA EXPANDIDO
      IF &chr_pexp. == cBUFFER
         fontsize=16
         font:= HPDF_GetFont( pdf, "Courier-Bold", NIL )
         LOOP
      ENDIF

      IF &chr_texp. == cBUFFER
         font := HPDF_GetFont( pdf, "Courier" , NIL )
         fontsize=12
         LOOP
      ENDIF
	   
	   
      // ATIVA NEGRITO
      IF &chr_penf. == cBUFFER
         font:= HPDF_GetFont( pdf, "Courier-Bold", NIL )
         LOOP
      ENDIF

      IF &chr_tenf. == cBUFFER
         font := HPDF_GetFont( pdf, "Courier" , NIL )
         LOOP
      ENDIF
	  
      HPDF_Page_SetFontAndSize(page, font, fontsize)
      hPDF_Page_ShowText(page, IF(cBUFFER=CHR(255),' ', cBUFFER) )  // IF(cBUFFER=' ',CHR(255),cBUFFER) )
		   
   NEXT X
	
   IF l != nFIM_TEXTO
      HPDF_Page_MoveTextPos(page,0,-12.5)
   ENDIF
    
next l

HPDF_Page_EndText(page)

x_ret= HPDF_SaveToFile( pdf, cFileToSave )

HPDF_Free( pdf )

If lAbre                       
	HB_RUN( 'START /MAX '+cPATH+'sumatra\sumatrapdf.exe -lang pt '+cFILETOSAVE)   //-restrict -fullscreen
EndIf

If !lAbre .and. cTipo_Prn="I" .and. !lMatricial
	HB_RUN( 'Start '+cPATH+'sumatra\sumatrapdf.exe -print-to "'+cUsbPrinter+'" '+cFILETOSAVE)   //-restrict -fullscreen
EndIf

RestScreen(,,,,cTELA)

Return file( cFileToSave )
Rubens

Dúvida Sumatra ignora tamanho de campo

Enviado: 13 Set 2017 17:02
por Claudio Soto
rubens escreveu:Bom dia...

Quando mexi na TXTtoPDF criada pelo Toledo... Ela imprimia linha a linha e eu precisava que lesse caracater a caracter para encontrar os códigos de negrito, sublinhado, condesado etc...

Daí quando o início da linha é " " o harupdf ignorava a coluna e começava na coluna zero... o que eu consegui foi isso, simular um caracter no inicio. A partir do momento em que existe um caracter no inicio da linha pode posicionar em qualquer coluna que dá certo..
A função é esta abaixo... se houver uma solução mais "lógica" seja bem vinda...

Código: Selecionar todos

********************************************************************************
Function TXTtoPDF( cFileToRead, cFileToSave, lAbre )
local x_ret
Local pdf := HPDF_New()
local tw
local l,a
LOCAL cTELA := SaveScreen()
Local cBuffer

Local chr_pcom:="CHR(15)"        			// ativa comprimido
Local chr_tcom:="CHR(18)"        			// desativa comprimido
 
Local chr_penf:="CHR(27)+'E'"      		// ativa enfatizado
Local chr_tenf:="CHR(27)+'F'"      		// desativa enfatizado
 
Local chr_pexp:="CHR(14)"  					// ativa expansao
Local chr_texp:="CHR(18)"  					// desativa expansao

if pdf == NIL
   return .F.
endif

HPDF_SetCompressionMode( pdf, HPDF_COMP_ALL )
page 		:= HPDF_AddPage(pdf)
height	:= HPDF_Page_GetHeight(page)
width 	:= HPDF_Page_GetWidth(page)
font 		:= HPDF_GetFont( pdf, "Courier", NIL )
fontsize := 12
txtfile	:= memoread(cFileToRead)
vpag:=.F.

Zebrado()

HPDF_Page_BeginText(page)                              
HPDF_Page_MoveTextPos(page,15,height-20)
nFIM_TEXTO := mlcount(txtfile,255)

for l=1 to nFIM_TEXTO

   Imprime2( L, nFIM_TEXTO, 'Gerando PDF!!! Aguarde...')

   cLIN:=AllTrim(memoline(txtfile,255,l,1,.f.))

   FOR X = 1 TO LEN( cLIN )   // faz a contagem dos bytes da linha
   
      cBUFFER := SubStr( cLIN, X, 1)
		
      // FIM DE PAGINA
      IF CHR(12) $ cBUFFER
         IF L = nFIM_TEXTO
            EXIT
         ELSE
            page := HPDF_AddPage(pdf)
            Zebrado()
            HPDF_Page_BeginText(page)
            HPDF_Page_MoveTextPos(page,15,height-20)
         ENDIF
         X++
         LOOP
         *cBUFFER := cBUFFER+SubStr( cLIN, X, 1)
      ENDIF
		
		// TECLA ESC, TEM QUE PEGAR A PROXIMA TECLA E DEIXA FAZER O TESTE
      IF cBUFFER==CHR(27) // LE CHR(27)+'E' OU CHR(27)+'F'
         X++
         cBUFFER := cBUFFER+SubStr( cLIN, X, 1)
      ENDIF
		
      // Ativa Condensado
      IF &chr_pcom. == cBUFFER
         fontsize=7
         font:= HPDF_GetFont( pdf, "Courier-Bold", NIL )
         LOOP
      ENDIF
	   
      IF &chr_tcom. == cBUFFER
         fontsize=12
         font:= HPDF_GetFont( pdf, "Courier", NIL )
         LOOP
      ENDIF
	   
      // ATIVA EXPANDIDO
      IF &chr_pexp. == cBUFFER
         fontsize=16
         font:= HPDF_GetFont( pdf, "Courier-Bold", NIL )
         LOOP
      ENDIF

      IF &chr_texp. == cBUFFER
         font := HPDF_GetFont( pdf, "Courier" , NIL )
         fontsize=12
         LOOP
      ENDIF
	   
	   
      // ATIVA NEGRITO
      IF &chr_penf. == cBUFFER
         font:= HPDF_GetFont( pdf, "Courier-Bold", NIL )
         LOOP
      ENDIF

      IF &chr_tenf. == cBUFFER
         font := HPDF_GetFont( pdf, "Courier" , NIL )
         LOOP
      ENDIF
	  
      HPDF_Page_SetFontAndSize(page, font, fontsize)
      hPDF_Page_ShowText(page, IF(cBUFFER=CHR(255),' ', cBUFFER) )  // IF(cBUFFER=' ',CHR(255),cBUFFER) )
		   
   NEXT X
	
   IF l != nFIM_TEXTO
      HPDF_Page_MoveTextPos(page,0,-12.5)
   ENDIF
    
next l

HPDF_Page_EndText(page)

x_ret= HPDF_SaveToFile( pdf, cFileToSave )

HPDF_Free( pdf )

If lAbre                       
	HB_RUN( 'START /MAX '+cPATH+'sumatra\sumatrapdf.exe -lang pt '+cFILETOSAVE)   //-restrict -fullscreen
EndIf

If !lAbre .and. cTipo_Prn="I" .and. !lMatricial
	HB_RUN( 'Start '+cPATH+'sumatra\sumatrapdf.exe -print-to "'+cUsbPrinter+'" '+cFILETOSAVE)   //-restrict -fullscreen
EndIf

RestScreen(,,,,cTELA)

Return file( cFileToSave )
Rubens
Talvez me perdí en el código y estoy diciendo bobada, pero el problema no está en el alltrim de esta línea

cLIN:=AllTrim(memoline(txtfile,255,l,1,.f.))

Talvez eliminarlo o cambiarlo por un RTrim sea la solución.

Dúvida Sumatra ignora tamanho de campo

Enviado: 13 Set 2017 19:55
por asimoes
Pessoal,

Só para tirar a duvida, onde estão as funções ?

Imprime2
Zebrado

Que estão na função TXTtoPDF

Dúvida Sumatra ignora tamanho de campo

Enviado: 13 Set 2017 22:56
por rubens
A Função Zebrado é só para definir se vai imprimir zebrado ou não.

Código: Selecionar todos

********************************************************************************
FUNCTION Zebrado()
LOCAL X 
LOCAL nINICIO 

If lZebrado 
	HPDF_Page_SetLineWidth( Page, 0.2 )
	HPDF_Page_SetRGBFill( Page, 0.9, 0.9, 0.9 )
	HPDF_Page_SetRGBStroke( Page, 0.9, 0.9, 0.9 )
	nINICIO := 744
	FOR X = 0 TO 28 
		HPDF_Page_Rectangle( Page, 10, nINICIO, 583, 12 )
		nINICIO-=25
	NEXT
	* HPDF_Page_Fill( oPage )    //Pinta dentro 
	* HPDF_Page_Stroke( oPage )  //Somente borda
	HPDF_Page_FillStroke( Page ) // Borda e Dentro
	HPDF_Page_SetRGBFill( Page, 0, 0, 0 )
	HPDF_Page_SetRGBStroke( Page, 0, 0, 0 )
EndIf

RETURN NIL
A Função Imprime2 é para mostrar um barra de progressão de linhas lidas, porque se o arquivo for grande demora para gerar o pdf...

Código: Selecionar todos

********************************************************************************
Function Imprime2(x1,y1,cMOD,nLINHA)
Local nPER:=(x1/y1)*100
LOCAL cTEXTO
Local Cor_:=SetColor()
HB_DEFAULT( @nLINHA,14 )
setcursor(0)

cTEXTO := cMOD+' '+Str(Nper,3,0)+"%" +' '+STR(X1,5,0)+'/'+STR(Y1,5,0) 

IF X1 <= 1
	JANELA( nLinha-1,09,nLinha+7,70, cMod )     
	setcolor("gr+/R")	
	@ nLINHA+3,15 SAY PADC(cTEXTO,50,' ' )
	setcolor("gr+/B")
	@ nLINHA+4, 15 SAY Repli("°",50) 
ENDIF
setcolor("gr+/R")
@ nLINHA+3, 15 SAY PADC( cTEXTO, 50, ' ' )
setcolor("gr+/B")                                        
@ nLINHA+4, 15 SAY Repli("Û",nPER/2) 
SetColor(Cor_)
Return( .T. )
Nessa postagem tem a função completa isolada para compilar e testar..
viewtopic.php?f=4&t=18184