// Compilar assim: // hbmk2.exe acentopdf -mt hbct.hbc hbhpdf.hbc xhb.hbc #require "hbhpdf" REQUEST HB_LANG_PT REQUEST HB_CODEPAGE_PT850 //----------------------------------------------- Function Main() //----------------------------------------------- LOCAL cFileToSave:="Pdf_Acentuado.pdf" HB_SETCODEPAGE( "PT850" ) hb_langSelect( "PT" ) SETMODE(25,80) CLS IF DesignHaruPDF( cFileToSave ) WAPI_ShellExecute( NIL, "open", cFileToSave,,, "SW_SHOWNORMAL" ) Alert("Arquivo "+cFileToSave+" criado!") ELSE Alert("Arquivo "+cFileToSave+" não pode ser criado!") ENDIF RETURN //----------------------------------------------- FUNCTION DesignHaruPDF( cFileToSave ) //----------------------------------------------- LOCAL page, AlturaPdf, LarguraPdf, def_font LOCAL pdf := HPDF_New() LOCAL font_list := { ; "Courier", ;//01 "Courier-Bold", ;//02 "Courier-Oblique", ;//03 "Courier-BoldOblique", ;//04 "Helvetica", ;//05 "Helvetica-Bold", ;//06 "Helvetica-Oblique", ;//07 "Helvetica-BoldOblique", ;//08 "Times-Roman", ;//09 "Times-Bold", ;//10 "Times-Italic", ;//11 "Times-BoldItalic", ;//12 "Symbol", ;//13 "ZapfDingbats" ;//14 } hb_vfErase( cFileToSave ) IF pdf == NIL Alert("Arquivo "+cFileToSave+" não pode ser criado!") RETURN .F. ENDIF /* set compression mode */ HPDF_SetCompressionMode( pdf, HPDF_COMP_ALL ) page := HPDF_AddPage( pdf ) HPDF_Page_SetHeight(page, 841) HPDF_Page_SetWidth(page, 595) AlturaPdf := HPDF_Page_GetHeight( page ) // 841 São os DEFAULT, pode mudar acima LarguraPdf := HPDF_Page_GetWidth( page ) // 595 São os DEFAULT, pode mudar acima // Print the lines of the page. HPDF_Page_SetLineWidth( page, 1 ) // Espessura dos traços // Quadros Insere_retangulo( page , 20 , 10 , 820, 585) // Quadro externo maior Insere_retangulo( page , 100 , 340 , 180, 580) // Quadro Cnpj/Emissao Insere_retangulo( page , 140 , 340 , 140, 580) //Separador horizontal Quadro Cnpj/Emissao Insere_retangulo( page , 100 , 470 , 180, 470) //Separador vertical Quadro Cnpj/Emissao Insere_retangulo( page , 190 , 15 , 310, 580) // Quadro Destinatario Insere_retangulo( page , 230 , 15 , 230, 580) //Separador horizontal Quadro Destinatario Insere_retangulo( page , 270 , 15 , 270, 580) //Separador horizontal Quadro Destinatario Insere_retangulo( page , 190 , 400 , 230, 400) //Separador vertical apos NOME RAZAO Insere_retangulo( page , 190 , 470 , 230, 470) //Separador vertical apos VENCIMENTO Insere_retangulo( page , 230 , 485 , 270, 485) //Separador vertical apos BAIRRO Insere_retangulo( page , 270 , 470 , 310, 470) //Separador vertical apos MUNICIPIO Insere_retangulo( page , 335 , 15 , 640, 580) // Quadro Dados do documento Insere_retangulo( page, 350, 15, 350, 580) //Separador horizontal Quadro Dados do documento Insere_retangulo( page, 335, 330, 640, 330) //Separador vertical Quadro Dados do documento Insere_retangulo( page, 335, 390, 640, 390) //Separador vertical Quadro Dados do documento Insere_retangulo( page, 335, 480, 640, 480) //Separador vertical Quadro Dados do documento Insere_retangulo( page , 645, 390, 680, 580) // Quadro Valor Total da fatura Insere_retangulo( page , 685, 15, 760, 580) // Quadro Informacoes adicionais Insere_retangulo( page, 743, 15, 743, 580) //Separador horizontal Informacoes adicionais Insere_retangulo( page , 765 , 15 , 810, 580) // Quadro Final data do recebimento Insere_retangulo( page , 780 , 15, 780, 580) //Separador horizontal Quadro Final Insere_retangulo( page , 780 , 110, 810, 110) //Separador vertical Quadro Final Insere_retangulo( page , 780 , 265, 810, 265) //Separador vertical Quadro Final Insere_retangulo( page , 780 , 490, 810, 490) //Separador vertical Quadro Final HPDF_Page_Stroke( page ) // Obrigado a colocar APOS CONFECIONAR GRAFICOS. Salva um PATH (caminho) // Um PATH (caminho) é composto por segmentos de linhas retas e curvas, e caminhos definem formas e regiões. // Logotipo /* image1 = HPDF_LoadJPEGImageFromFile(pdf, "Logo.jpg") LarguraImagem := int ( HPDF_Image_GetWidth(image1) *.4) AlturaImagem := int ( HPDF_Image_GetHeight(image1) *.4 ) ImagemX := 30 ImagemY := HPDF_Page_GetHeight(page) - 30 - AlturaImagem HPDF_Page_DrawImage(page, image1, ImagemX, ImagemY, LarguraImagem, AlturaImagem) */ //----- BEGIN TEXT ----------------------------------------- HPDF_Page_BeginText( page ) // Mini cabecalhos dos quadros def_font := HPDF_GetFont( pdf, font_list[05], "WinAnsiEncoding" ) HPDF_Page_SetFontAndSize( page, def_font, 06 ) // Se colocar vetor direto na fonte ocorre erro 'parou de funcionar', entao atribui acima. HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 350) , AlturaPdf - 110 , "CNPJ") HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 495) , AlturaPdf - 110 , Acentua_No_Pdf("DATA da EMISSÃO")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 350) , AlturaPdf - 150 , Acentua_No_Pdf("INSCRIÇÃO ESTADUAL")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 185 , Acentua_No_Pdf("DESTINATÁRIO")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 200 , Acentua_No_Pdf("NOME/RAZÃO SOCIAL")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 410) , AlturaPdf - 200 , "VENCIMENTO") HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 485) , AlturaPdf - 200 , "CNPJ/CPF") HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 240 , Acentua_No_Pdf("ENDEREÇO")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 360) , AlturaPdf - 240 , "BAIRRO") HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 505) , AlturaPdf - 240 , "CEP") HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 280 , Acentua_No_Pdf("MUNICÍPIO-UF")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 485) , AlturaPdf - 280 , Acentua_No_Pdf("INSCRIÇÃO ESTADUAL")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 330 , "DADOS DO DOCUMENTO") HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 345 , Acentua_No_Pdf("DESCRIÇÃO")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 340) , AlturaPdf - 345 , "QUANTIDADE") HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 420) , AlturaPdf - 345 , Acentua_No_Pdf("VALOR UNITÁRIO")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 520) , AlturaPdf - 345 , "VALOR TOTAL") HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 405) , AlturaPdf - 655 , Acentua_No_Pdf("VALOR TOTAL DA FATURA DE LOCAÇÃO")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 680 , Acentua_No_Pdf("INFORMAÇÕES ADICIONAIS")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 775 , Acentua_No_Pdf("DECLARAMOS NOSSA CONCORDÂNCIA COM A PRESENTE FATURA DE LOCAÇÃO")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 790 , "DATA DO RECEBIMENTO") HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 115) , AlturaPdf - 790 , Acentua_No_Pdf("IDENTIFICAÇÃO E ASSINATURA DO RECEBEDOR")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 330) , AlturaPdf - 790 , Acentua_No_Pdf("NOME LEGÍVEL")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 495) , AlturaPdf - 790 , Acentua_No_Pdf("FATURA DE LOCAÇÃO Nº")) // Dados do emissor da nota (nossos dados) HPDF_Page_TextOut( page, LarguraPdf- (LarguraPdf - 25) , AlturaPdf - 115 , Acentua_No_Pdf("CAÇÃO NÃO É EQÜINO")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 130 , Acentua_No_Pdf("Ñ esqueça a acentuação")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 145 , Acentua_No_Pdf("Vamos à  loja" )) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 160 , Acentua_No_Pdf("Hélice, Vovô´, Pará" )) // Dados da nota def_font := HPDF_GetFont( pdf, font_list[05], "WinAnsiEncoding" ) HPDF_Page_SetFontAndSize( page, def_font, 10 ) // Se colocar vetor direto na fonte ocorre erro 'parou de funcionar', entao atribui acima. HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 25) , AlturaPdf - 755 , Acentua_No_Pdf("OPERÃÇÃO NÃO SUJEITA AO I.S.S CONFORME LEI COMPLEMENTAR 116/03.")) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 425) , AlturaPdf - 60 , Acentua_No_Pdf("Fatura de Locação Nº 12345" )) HPDF_Page_TextOut( page, LarguraPdf- ( LarguraPdf - 355) , AlturaPdf - 130 , "10,000.000/0001-00" ) HPDF_Page_EndText( page ) //----- END TEXT ----------------------------------------- IF HPDF_SaveToFile( pdf, cFileToSave ) != 0 // _PDF ? "0x" + hb_NumToHex( HPDF_GetError( pdf ), 4 ), hb_HPDF_GetErrorString( HPDF_GetError( pdf ) ), HPDF_GetErrorDetail( pdf ) ENDIF HPDF_Free( pdf ) // _PDF RETURN hb_vfExists( cFileToSave ) //--------------------------------------------------- // 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 //--------------------------------------------------------------------- // Substitui a HPDF_Page_Rectangle() , com a vantagem de ser feito o retangulo no PDF // de cima para baixo, ao inves do comando original que comeca de baixo para cima. Function Insere_retangulo( cPage , nTop , nEsq , nBot , nDireita) //--------------------------------------------------------------------- LOCAL Altura_do_Pdf := HPDF_Page_GetHeight( cPage ) LOCAL margem_esquerda := nEsq LOCAL margem_inferior := Altura_do_pdf-nBot LOCAL larg_esq_para_direita := nDireita-nEsq LOCAL comp_de_baixo_para_cima := nBot-nTop HPDF_Page_Rectangle(cPage, margem_esquerda , margem_inferior , larg_esq_para_direita , comp_de_baixo_para_cima ) return