Acentuação PDF - Via HaruPdf

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

Moderador: Moderadores

Robson Davila
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 03 Mai 2021 12:20
Localização: FORTALEZA - CE

Acentuação PDF - Via HaruPdf

Mensagem por Robson Davila »

Estou gerando um PDF (HaruPDF), utilizando um relatório já gerado em arquivo e utilizando os comandos Haru para criar o PDF.
O que está acontecendo: o PDF é gerado, mas os caracteres com acentuação, não está conseguindo exibir de forma correta.
Estou executando no Linux com o Harbour 3.2
Anexos
Parte do código fonte utilizado para gerar o PDF
Parte do código fonte utilizado para gerar o PDF
PDF gerado, mas os caracteres acentuados não são exibidos normalmente.
PDF gerado, mas os caracteres acentuados não são exibidos normalmente.
Tela02.png (10.62 KiB) Exibido 1324 vezes
Linhas do relatório no Linux, caracteres acentuados normalmente.
Linhas do relatório no Linux, caracteres acentuados normalmente.
Tela01.png (7.12 KiB) Exibido 1324 vezes
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

Acentuação PDF - Via HaruPdf

Mensagem por Fernando queiroz »

E porque nao gerar o PDF em vez de utilizar um relatorio gerado em arquivo ??????????

utilize a PDFCLASS do Quintas e saia desse problema

modo de utilizacao de PDFCLASS

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  " , 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, 3, "PERIODO DE "+DTOC(::dPERINI)+" A "+DTOC(::dPERFIN), Nil, 10, "Helvetica-Bold", Nil, Nil )

			oPDF:DrawBox( 12, 0, 15, nMaxCol, Nil, Nil, Nil )  
			oPDF:DrawText( 14, 3, "CLIENTE: "+STRZERO(oQuery:Fields( "CLIENTES_ID" ):Value,11,0)+"-"+oQuery:Fields( "nraz_soc" ):Value , Nil, 10, "Helvetica-Bold", Nil, Nil )

			oPDF:DrawBox( 15, 0, 17.5, nMaxCol, Nil, Nil, Nil )
			oPDF:DrawText( 17, 01, "TITULO", Nil, 10, "Helvetica-Bold", Nil, Nil )
			oPDF:DrawText( 17, 21, "VENCIMENTO" , Nil, 10, "Helvetica-Bold", Nil, Nil )
			oPDF:DrawText( 17, 41, "DIAS" , Nil, 10, "Helvetica-Bold", Nil, Nil )
			oPDF:DrawText( 17, 52, "MORA" , Nil, 10, "Helvetica-Bold", Nil, Nil )
			oPDF:DrawText( 17, 64, "JUROS" , Nil, 10, "Helvetica-Bold", Nil, Nil )
			oPDF:DrawText( 17, 76, "VALOR TITULO", Nil, 10, "Helvetica-Bold", Nil, Nil )		
			oPDF:DrawText( 17, 99, "ACRESCIMOS", Nil, 10, "Helvetica-Bold", Nil, Nil )	
			oPDF:DrawText( 17, 124, "TOTAL RECEBER", Nil, 10, "Helvetica-Bold", Nil, Nil )

			nLinha := 19
			nPagina += 1

		ENDIF

		nMULTA:=0.00
		nJUROS:=0.00
		IF (M->DAT_HOJE-oQuery:Fields( "DATVEN" ):Value) > 0
			IF M->DAT_HOJE > oQuery:Fields( "VENPRO" ):Value
				nMULTA=oQuery:Fields( "MORA" ):Value*(M->DAT_HOJE-oQuery:Fields( "DATVEN" ):Value)
				nJUROS=(oQuery:Fields( "VALOR" ):Value*oQuery:Fields( "PER_MULTA" ):Value*(M->DAT_HOJE-oQuery:Fields( "DATVEN" ):Value))/3000
			END 
		END
		nACRESCIMOS+=nMULTA+nJUROS
		nTOTALARECEBER+=oQuery:Fields( "VALOR" ):Value+nMULTA+nJUROS			
	
		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, 22, oQuery:Fields( "DATVEN" ):Value, Nil, 10, "Courier-Bold", Nil, Nil )

		IF (M->DAT_HOJE-oQuery:Fields( "DATVEN" ):Value) > 0
			oPDF:DrawText( nLinha, 41, (M->DAT_HOJE-oQuery:Fields( "DATVEN" ):Value), "9999", 10, "Courier-Bold", Nil, Nil )
		ENDIF	
			
		oPDF:DrawText( nLinha, 50, oQuery:Fields( "MORA" ):Value, "@E 999.99", 10, "Courier-Bold", Nil, Nil )
		oPDF:DrawText( nLinha, 64, oQuery:Fields( "PER_MULTA" ):Value, "@E 999.99", 10, "Courier-Bold", Nil, Nil )
		oPDF:DrawText( nLinha, 75, oQuery:Fields( "VALOR" ):Value, "@E 99,999,999.99", 10, "Courier-Bold", Nil, Nil )
		oPDF:DrawText( nLinha, 103, nMULTA+nJUROS, "@E 99,999.99", 10, "Courier-Bold", Nil, Nil )
		oPDF:DrawText( nLinha, 126, oQuery:Fields( "VALOR" ):Value+nMULTA+nJUROS, "@E 99,999,999.99", 10, "Courier-Bold", Nil, Nil )
		nLinha +=2
		nTOTGERAL+=oQuery:Fields( "VALOR" ):Value

		oQuery:MoveNext()
	ENDDO   
	IF nTOTGERAL # 0.00
		oPDF:DrawBox( nLinha, 0, nLinha+3, nMaxCol, Nil, Nil, Nil )
		oPDF:DrawText( nLinha+2, 75, transform(nTOTGERAL,"@E 99,999,999.99") , Nil, 10, "Courier-Bold", Nil, Nil )
		oPDF:DrawText( nLinha+2, 103, transform(nACRESCIMOS,"@E 99,999.99") , Nil, 10, "Courier-Bold", Nil, Nil )
		oPDF:DrawText( nLinha+2, 126, transform(nTOTALARECEBER,"@E 99,999,999.99") , Nil, 10, "Courier-Bold", Nil, Nil )
	ENDIF
	oPDF:End(  )

	oPDF:PrintPreview(  )


RETURN NIL	
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
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

Acentuação PDF - Via HaruPdf

Mensagem por Fernando queiroz »

O RELATORIO EM PDF
O RELATORIO EM PDF
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Acentuação PDF - Via HaruPdf

Mensagem por JoséQuintas »

Na Harupdf também existe codepage.
Se o relatório está com codepage diferente da Harupdf, não vai mostrar certo.
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/
Robson Davila
Usuário Nível 1
Usuário Nível 1
Mensagens: 12
Registrado em: 03 Mai 2021 12:20
Localização: FORTALEZA - CE

Acentuação PDF - Via HaruPdf

Mensagem por Robson Davila »

Quintas, fiz dessa forma:

Def_Font := HPDF_GetFont( oPdf, "Courier", "CP1252" )
*
HPDF_Page_SetFontAndSize( oPagina, Def_Font, 24 )
HPDF_SetCurrentEncoder( oPagina, "CP1252" )

no momento da impressão da linha é assim:

C_BUF_SAIDA := "Relação de empresas Página: 001"

HPDF_Page_ShowText( oPagina, C_BUF_SAIDA )

Mas mesmo assim... não faz a impressão do caracter acentuado de forma correta.
Fica assim:

Rela‡Æo de empresas P gina : 001

O que pode estar havendo para não realizar a acentuação de forma correta?

Só um detalhe, estou utilizando no Lixux.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Acentuação PDF - Via HaruPdf

Mensagem por JoséQuintas »

Talvez a pergunta melhor seja: como faz pra enxergar esse relatório TXT com acentuação??
Qual a codepage do "visualizador" ?
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/
ssflavio
Usuário Nível 2
Usuário Nível 2
Mensagens: 86
Registrado em: 10 Jul 2008 09:57
Localização: São Paulo / SP

Acentuação PDF - Via HaruPdf

Mensagem por ssflavio »

Já quebrei muito a cabeça com isso!
as aplicações no modo console utilizam OEM-850 e o Windows ISO
se voce utiliza o editor notepad++ tem a facilidade de trocar a forma de mostrar o conteudo dos fontes.
o maior problema é quando o usuario utiliza a acentuação e é salvo nos bancos de dados, ai a coisa fica mais complicada porque vai estar salvo em OEM-850 e tem que mostrar como iso
fiz uma função de conversão que utilizo

Código: Selecionar todos

substr(PTXT, I, 1)
    CHAR_ASC := asc(substr(PTXT, I, 1))
    INDICE := ascan(v850, CHAR_ASC)
    if INDICE > 0
      CHAR_ASC := alltrim(str(vUTF[INDICE]))
      RET += "\uc1\u" + CHAR_ASC + "G"
    else
      RET += chr(CHAR_ASC)
    endif
next

return(RET)
***************************************************************************************************

***
*** CONVERTE OS CARACTERES ASCII EM ANSI (DOS -> WINDOWS)
***
***  +-----------+-----------+-----------+
***  |CARACTER   |ANSI       | ASCII     |
***  +-----------+-----------+-----------+
***  |CEDILHA    |þà 231 199 | çÇ 135 128|
***  |A + TIL    |Ò├ 228 195 | ãà 198 199|
***  |A + TREMA  | ─     196 |  Ä     142|
***  |A + ACENTO |ß┴ 225 193 | áÁ 160 181|
***  |A + CRASE  |Ó└ 224 192 | àÀ 133 183|
***  |O + ACENTO |¾Ë 243 211 | óÓ 162 224|
***  |O + CIRCUNF|¶È 244 212 | ôÔ 147 226|
***  |O + TIL    |§ı 245 213 | õÕ 228 229|
***  |O + TREMA  |÷  246     | öÖ 148 153|
***  |U + ACENTO |·┌ 250 218 | úÚ 163 233|
***  |E + ACENTO |Ú╔ 233 201 | éÉ 130 144|
***  |E + CIRCUNF|Û╩ 234 202 | êÊ 136 210|
***  |I + ACENTO |Ý═ 237 205 | íÍ 161 214|
***  +-----------+-----------+-----------+
***

function ASCII_ANSI(PTXT)
private RET, TAMTXT, CHAR_TXT, I

if valtype(PTXT) # "C"
   return(PTXT)
endif

vANSI := {231,228,225,224,243,244,245,246,250,233,234,237,199,195,196,193,192,211,212,213,218,201,202,205}
v850  := {135,198,160,133,162,147,228,148,163,130,136,161,128,199,142,181,183,224,226,229,233,144,210,214}
*Letras     ç,  ã,  á,  à,  ó,  ô,  õ,  ö,  ú,  é,  ê,  í,  Ç,  Ã,  Ä,  Á,  À,  Ó,  Ô,  Õ,  Ú,  É,  Ê,  Í

RET := ""
TAMTXT := len(PTXT)
for I = 1 to TAMTXT
    CHAR_TXT := asc(substr(PTXT, I, 1))
    INDICE := ascan(v850, CHAR_TXT)
    if INDICE > 0
       CHAR_TXT := vANSI[INDICE]
    endif
    RET += chr(CHAR_TXT)
next

return(RET)
***************************************************************************************************
um exemplo de utilização seria:

Código: Selecionar todos

@ 0,0 say ascii_ansi(ENDERE_CLI)
Flávio dos Santos Szelbracikowski
ssflavio@osite.com.br
Avatar do usuário
carlaoonline
Usuário Nível 3
Usuário Nível 3
Mensagens: 190
Registrado em: 24 Ago 2014 22:38
Localização: Porto Alegre-RS

Acentuação PDF - Via HaruPdf

Mensagem por carlaoonline »

Boa tarde!

Esse negócio de codepage é um infern... demora pro cara pegar os macetes...

No caso de editores também é um problema as vezes, conforme o editor que você cria o PRG fonte, se editar e gravar em outro...lá se foi toda sua acentuação...Tem que ter cuidado nas configurações.



Eu resolvi meu problema de acentuação no PDF com essa função de substituição de caracteres que criei, apenas seto a fonte a ser usada no PDF para WinAnsiEncoding --> def_font := HPDF_GetFont( pdf, font_list[05], "WinAnsiEncoding" )

e uso assim:

cTexto=NOME (Nome é o campo do DBF)

String_Q_Vai_Ao_Pdf = Acentua_No_Pdf(cTexto)

HPDF_Page_TextOut( page, 50 ,20 , String_Q_Vai_Ao_Pdf)

Código: Selecionar todos

//---------------------------------------------------
// Substitui caracteres da string por codigos WinAnsiEncoding para acentuar no PDF
Function Acentua_No_Pdf(cTexto)
//---------------------------------------------------
Local aCaracters:={"Ç",Chr(199),;
                  "ç",Chr(231),;
                  "Á",Chr(193),;
                  "á",Chr(225),;
                  "Ã",Chr(195),;
                  "ã",Chr(227),;
                  "À",Chr(192),;
                  "à",Chr(224),;
                  "Â",Chr(194),;
                  "â",Chr(226),;
                  "Ä",Chr(196),;
                  "ä",Chr(228),;
                  "É",Chr(201),;
                  "é",Chr(233),;
                  "Ê",Chr(202),;
                  "ê",Chr(234),;
                  "Ë",Chr(203),;
                  "ë",Chr(235),;
                  "Í",Chr(205),;
                  "í",Chr(237),;
                  "Ó",Chr(211),;
                  "ó",Chr(243),;
                  "Õ",Chr(213),;
                  "õ",Chr(245),;
                  "Ô",Chr(212),;
                  "ô",Chr(244),;
                  "Ú",Chr(218),;
                  "ú",Chr(250),;
                  "Ü",Chr(220),;
                  "ü",Chr(252),;
                  "Ñ",Chr(209),;
                  "ñ",Chr(241),;
                  "ª",Chr(170),;
                  "º",Chr(176)}


FOR F=1 TO LEN(aCaracters)/2 step 2
    cCaracterAtual=aCaracters[f]
    cCaracterNovo=aCAracters[f+1]
    cTexto=ATREPL(cCaracterAtual,cTexto, cCaracterNovo)
NEXT

Return cTexto

Caso os caracteres sejam diferentes, é só descobrir qual é o correto e substituir na função.

Segue um exemplo em anexo que cria um modelinha de fatura, notem que fica com os acentos normais.
A linha de comando para a compilação está no início do arquivo PRG.
Anexos
Pdf_Acentuado.pdf
Criado pelo programa.
(1.48 KiB) Baixado 55 vezes
acentopdf.prg
A linha de comando para a compilação está no início do arquivo.
(11.5 KiB) Baixado 55 vezes
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Acentuação PDF - Via HaruPdf

Mensagem por alxsts »

Olá!

Talvez consiga usar uma das funções de conversão disponíveis:
C:\hb32\Test>HBMK2 -FIND ANSI |MORE
hbtip.hbc (instalado):
ANSIToHtml()
HtmlToANSI()
hbwin.hbc (instalado):
win_ANSIToOEM()
win_ANSIToWide()
win_OEMToANSI()
win_WideToansi()
hbxpp.hbc (instalado):
ConvToANSICP()
xhb.hbc (instalado):
ANSIToWide()
WideToANSI()
Núcleo Harbour (instalado):
hb_ANSIToOEM()
hb_OEMToANSI()



C:\hb32\Test>
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Acentuação PDF - Via HaruPdf

Mensagem por JoséQuintas »

Sei lá, vocês que complicam.
No Windows só sigo o padrão do Windows.
E NÃO permito acentuação, só mesmo acentuação aonde quero.

No Harbour é PTISO, default do Windows brasileiro.
No MySQL idem.
No PDF WinAnsi, que é o default do Windows brasileiro.
No editor Programmers Notepad, o default já é o do Windows, que no Windows brasileiro é PTISO.
Em HTML aparece normalmente o que sai do MySQL.
Na GTWVG, ela faz parte do Harbour, não precisa configurar nada.

Agora em minigui talvez seja diferente, porque minigui tem seu próprio esquema de codepage.

Em webservice.... tem a ver com o webservice e não com o Harbour.
Que eu me lembre, nem os webservices de nota fiscal do Brasil respeitam codepage.

Agora... quer ficar aproveitando informação antiga junto com nova.... aí não tem codepage que resolva, e nem conversor que resolva.
Quer ler páginas de internet feitas pra outros idiomas? aí também não tem codepage que resolva.
Quer ler webservices lixo, que a maioria é, aí também não tem codepage que resolva.
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
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Acentuação PDF - Via HaruPdf

Mensagem por Vlademiro »

Infelizmente a libharu não suporta utf-8. E OEM também não é suportada, acho que por ser muito antiga. Caso o seu sistema use uma dessas tem que converter para winansi
Responder