Página 1 de 1

HaruPDF - Como imprimir com acentuação?

Enviado: 02 Abr 2025 11:05
por clodoaldomonteiro
Olá.

Estou implementando o haruPDF nos meus PDFs e percebi que as letras acentuadas não saem no PDF, usando CoedePage ANSI.
Como Setar para ANSI ou outra CodePage?

Uso o xHarbour 123 com BCC 7.3.

Desde já agradeço a ajuda.

Meus fontes:

Código: Selecionar todos

Function Main()
...
...
         nCol     := 06
         sOrient  := 'R'

         nLBrasao := 07
         nCBrasao := 13

         nLeft    := 32
         nRight   := 820
         nHeight  := 09

         nFonte   := 08
         nLpi     := 06
         nMAXLI   := 53

         nLAss    := 170
         nCAss1   := 22
         nCAss2   := 190
         nPosBras := 3

         oPdf := HPDF_New()
         IF oPdf == NIL
            MsgAtencao( "Erro ao criar o documento PDF" )
            Break
         ENDIF

         HPDF_SetCompressionMode( oPdf, HPDF_COMP_ALL )

         pgheight := nil
         pgwidth  := nil

         pg_ := 0
         cl  := 500

         rel_cab(1)

... 
...
Return

STATIC Procedure REL_CAB(qt)                           // cabecalho do relatorio
   Local Fonte, Img

   If qt > 0                                                      // se parametro maior que 0
      cl := cl + qt                                                  // soma no contador de linhas
   EndIf

   If cl > nmaxli .or. qt = 0                                        // quebra de pagina

      //REL_RDP( oPage )                                        // imprime rodape' do relatorio

      sCnpj       =''
      sTituloFundo='Fundo:'

      sGestor1 =''
      sGestor2 =''
      sGestor3 =''
      nGestor3 =0
      nGestor4 =0

      sSec1    = ''
      sSec2    = ''
      nSec3    = 0
      nSec4    = 0

      sAlm1   = ''
      sAlm2   = ''
      nAlm3   = 0
      nAlm4   = 0
      
      pg_++

      //PegaAssinatura( sFundo )

      oPage    := HPDF_AddPage(opdf)                 // HPDF_PAGE_PORTRAIT
      HPDF_Page_SetSize(oPage, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE)
      pgHeight := HPDF_Page_GetHeight(opage) - 40
      pgWidth  := HPDF_Page_GetWidth(opage)

      //HPdfAtSay( "Relatório de Teste", 1, 1, "Helvetica", 12, {0, 0, 255})
      //HPdfAtSay( "Página " + LTrim(Str(pg_)), 1, 50, "Helvetica", 10, {100, 100, 100})

      hPdfAtSay( HB_OemToAnsi(cl_GetNomeUf( M->par_UF, .t. ))            , 01, 2 + MMVBrasao1 + nPosBras, 'Times-Roman', 8 )
      hPdfAtSay( "Página: " + Transform(pg_, "999") + '/   ' , 01, 104, 'Times-Roman', 8 ) //   

      hPdfAtSay( HB_OemToAnsi( nEmp ), 02, 2 + MMVBrasao1 + nPosBras, 'Times-Roman', 8 )
      hPdfAtSay( "LEI Nº 4.320/64"   , 02, 104, 'Times-Roman', 9 )

      hPdfAtSay( "C.N.P.J.: " + Transform(sCNPJ, "@R 99.999.999/9999-99"), 03, 2 + MMVBrasao1 + nPosBras, 'Times-Roman', 8 )
      hPdfAtSay( ALLTrim(HB_OemToAnsi(M->PAR_RESOL)), 03, 104, 'Times-Roman', 8 )

      //If mCab = 1
         hPdfAtSay( "PAGAMENTOS ORÇAMENTÁRIOS REALIZADOS ", 04, 2 + MMVBrasao1 + nPosBras, 'Times-Roman', 8 )

      //ElseIf mCab = 2
      //   PdfAtSay( "PAGAMENTOS DE RESTOS A PAGAR REALIZADOS ", 05, nCol + MMVBrasao1 + nPosBras, "R" )
      //
      //Endif

      hPdfAtSay( "ANEXO IX", 04, 104, 'Times-Roman', 8 )

      hPdfAtSay( HB_OemToAnsi(sTITULOFundo), 05, 2 + MMVBrasao1 + nPosBras, 'Times-Roman', 8 )
      hPdfAtSay( "Competência: " + AllTrim(HB_OemToAnsi(nmes(Val(mMesRel)))) + ' / ' + par_aa, 5, 104, 'Times-Roman', 8 )


      ofont := HPDF_GetFont(oPdf, "Courier", NIL)
      HPDF_Page_SetFontAndSize(oPage, ofont, 8)

      cl := qt + 09; pg_++
    EndIf
   Return

FUNCTION HPdfAtSay( cTexto, nLinha, nCol, cFonteName, nTamanho, cOrient, nCorRGB)
   Local nEspaco := INT( (pgHeight / 11) / nLPI)
   LOCAL nX, nY := pgHeight - ((nLinha - 1) * nEspaco)
   LOCAL oFont

   cFonteName  := If(cFonteName = Nil, 'Courier', cFonteName)
   oFont       := HPDF_GetFont(oPage, cFonteName, NIL)

   nTamanho := If(nTamanho = Nil, nFonte, nTamanho)
   
   If nTamanho = 6
      nX := INT(nCol * 3.6) //+ 50

   ElseIf nTamanho = 7
      nX := INT(nCol * 4.2) //+ 50

   ElseIf nTamanho = 8
      nX := INT(nCol * 4.8) //+ 50

   ElseIf nTamanho = 9
      nX := INT(nCol * 5.4) //+ 50

   ElseIf nTamanho = 10
      nX := INT(nCol * 6) //+ 50

   ElseIf nTamanho = 11
      nX := INT(nCol * 6.6) //+ 50

   ElseIf nTamanho = 12
      nX := INT(nCol * 7.2) //+ 50

   Else
      nX := INT(nCol * 6) //+ 50

   Endif

   // Orientação do texto (opcional)
   // cOrient pode ser: "L2R", "R2L", "U2D", "D2U", "ROT90", "ROT270"
   DO CASE
   CASE cOrient == "R2L"     // Direita para esquerda
      a := -1 ; b := 0 ; c := 0 ; d := 1
      nX += 0   // Pode ajustar margem se quiser
   CASE cOrient == "U2D"     // De cima para baixo
      a := 0 ; b := -1 ; c := 1 ; d := 0
   CASE cOrient == "D2U"     // De baixo para cima
      a := 0 ; b := 1 ; c := -1 ; d := 0
   CASE cOrient == "ROT90"   // Roda 90° (escreve de baixo para cima)
      a := 0 ; b := 1 ; c := -1 ; d := 0
   CASE cOrient == "ROT270"  // Roda 270° (cima para baixo)
      a := 0 ; b := -1 ; c := 1 ; d := 0
   OTHERWISE                 // "L2R" ou padrão
      a := 1 ; b := 0 ; c := 0 ; d := 1
   ENDCASE

   IF nCorRGB != NIL
      HPDF_Page_SetRGBFill(oPage, (nCorRGB[1]/255), (nCorRGB[2]/255), (nCorRGB[3]/255))
   ENDIF

   ofonte := HPDF_GetFont(oPdf, cFonte, NIL)
   HPDF_Page_BeginText( opage )
   HPDF_Page_SetFontAndSize( opage, oFonte, nTamanho )

   If cOrient = Nil
      HPDF_Page_TextOut( opage, nX, nY, cTexto)
   Else
      HPDF_Page_SetTextMatrix(oPage, a, b, c, d, nX, nY)
      HPDF_Page_ShowText(oPage, HB_OemToAnsi(cTexto))
   Endif
   
   HPDF_Page_EndText( opage )

   RETURN NIL


HaruPDF - Como imprimir com acentuação?

Enviado: 02 Abr 2025 13:21
por developer
Você está usando HaruPDF então dá uma olhada nisso: Encoding

Também aqui na documentação.

Você usa ANSI no código Harbour? Então vai precisar configurar HaruPDF para usar o mesmo.

Se não me engano o padrão é StandardEncoding mas sugiro você tentar com WinAnsiEncoding

Até é uma questão interessante... que "codepage" é usado no padrão da libHarbu, no caso: StandardEncoding? Alguém sabe?

HaruPDF - Como imprimir com acentuação?

Enviado: 02 Abr 2025 14:21
por JoséQuintas

Código: Selecionar todos

   VAR    cCodePage         INIT "WinAnsiEncoding"
...
      ::oPdf := HPDF_New()
      HPDF_SetCompressionMode( ::oPDF, HPDF_COMP_ALL )
      HPDF_SetCurrentEncoder( ::oPDF, ::cCodePage )

HaruPDF - Como imprimir com acentuação?

Enviado: 02 Abr 2025 21:35
por clodoaldomonteiro
Consegui, com a dica do Quintas e uns testes coloquei WinAnsiEncoding no lugar do NIL.

Ficou assim:

Código: Selecionar todos

...
...
   ofonte := HPDF_GetFont(oPdf, cFonteName, "WinAnsiEncoding")
   HPDF_Page_BeginText( opage )
      HPDF_Page_SetFontAndSize( opage, oFonte, nTamanho )

      //If cOrient = Nil
      //   HPDF_Page_TextOut( opage, nX, nY, cTexto)
      //Else
         HPDF_Page_SetTextMatrix(oPage, a, b, c, d, nX, nY)
         HPDF_Page_ShowText(oPage, cTexto )
      //Endif
   
   HPDF_Page_EndText( opage )
...
...
Fico grato pela ajuda de todos.