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