Форум » [x]Harbour » PDF с кириллицей в UTF8 » Ответить

PDF с кириллицей в UTF8

Sergy: Добрый день. Бьюсь с выводом кириллицы в PDF файл - не могу победить: вместо "привет" - кракозябры. Подскажите плиз - что делаю не так ? [more][pre2]#require "hbhpdf" REQUEST HB_CODEPAGE_UTF8EX REQUEST HB_LANG_RU // RU866 REQUEST HB_CODEPAGE_RU866 PROCEDURE Main( cFileToSave ) hb_cdpSelect("UTF8EX") hb_CDPSelect("RU866") // must be BEFORE hb_LangSelect() ! hb_LangSelect("RU") // RU866 CLS IF ! HB_ISSTRING( cFileToSave ) .OR. hb_LeftEq( cFileToSave, "-" ) cFileToSave := "hpdf_rus.pdf" ENDIF IF DesignHaruPDF( cFileToSave ) ? "PDF File <" + cFileToSave + "> is created!" WAIT ELSE Alert( "Some problems in creating the PDF!" ) ENDIF RETURN * --------------------------------- * FUNCTION DesignHaruPDF( cFileToSave ) LOCAL cFont, page, height, width, def_font, tw, samp_text, font LOCAL page_title := "hbhpdf cyr test" LOCAL font_list := { ; "Courier" , ; "Courier-Bold" , ; "Courier-Oblique" , ; "Courier-BoldOblique" , ; "Helvetica" , ; "Helvetica-Bold" , ; "Helvetica-Oblique" , ; "Helvetica-BoldOblique" , ; "Times-Roman" , ; "Times-Bold" , ; "Times-Italic" , ; "Times-BoldItalic" , ; "Symbol" , ; "ZapfDingbats" } LOCAL pdf := HPDF_New() // hb_vfErase( cFileToSave ) IF pdf == NIL Alert( "PDF could not be created!" ) RETURN .F. ENDIF HPDF_UseUTFEncodings( pdf ) HPDF_SetCurrentEncoder( pdf, "UTF-8" ) page := HPDF_AddPage( pdf ) height := HPDF_Page_GetHeight( page ) width := HPDF_Page_GetWidth( page ) /* Print the lines of the page. */ HPDF_Page_SetLineWidth( page, 1 ) HPDF_Page_Rectangle( page, 50, 50, width - 100, height - 110 ) HPDF_Page_Stroke( page ) /* Print the title of the page(with positioning center). */ def_font := HPDF_GetFont( pdf, "Helvetica", NIL ) HPDF_Page_SetFontAndSize( page, def_font, 24 ) tw := HPDF_Page_TextWidth( page, page_title ) HPDF_Page_BeginText( page ) HPDF_Page_TextOut( page, ( width - tw ) / 2, height - 50, page_title ) HPDF_Page_EndText( page ) /* output subtitle. */ HPDF_Page_BeginText( page ) HPDF_Page_SetFontAndSize( page, def_font, 16 ) HPDF_Page_TextOut( page, 60, height - 80, "<Standard Type1 fonts samples>" ) HPDF_Page_EndText( page ) HPDF_Page_BeginText( page ) HPDF_Page_MoveTextPos( page, 60, height - 105 ) FOR EACH cFont IN font_list samp_text := hb_STRTOUTF8("abc ABC Привет PDF !","RU866") font := HPDF_GetFont( pdf, cFont, NIL ) HPDF_Page_SetFontAndSize( page, def_font, 9 ) HPDF_Page_ShowText( page, cFont ) HPDF_Page_MoveTextPos( page, 0, -18 ) HPDF_Page_SetFontAndSize( page, font, 20 ) HPDF_Page_ShowText( page, samp_text ) HPDF_Page_MoveTextPos( page, 0, -20 ) NEXT HPDF_Page_EndText( page ) // IF HPDF_SaveToFile( pdf, cFileToSave ) != HPDF_OK ? "0x" + hb_NumToHex( HPDF_GetError( pdf ), 4 ), hb_HPDF_GetErrorString( HPDF_GetError( pdf ) ), HPDF_GetErrorDetail( pdf ) ENDIF HPDF_Free( pdf ) RETURN hb_vfExists( cFileToSave )[/pre2] [/more] Спасибо.

Ответов - 1

Sergy: Удалось вывести кириллицу, но не в UTF8, а в CP1251 при помощи загрузки внешнего шрифта. В принципе, подойдет любой кириллический из папки Windows\fonts. [pre2]STATIC cEncoder := "CP1251" // "UTF-8" #require "hbhpdf" REQUEST HB_CODEPAGE_UTF8EX REQUEST HB_LANG_RU // RU866 для Harbour 3.2 REQUEST HB_CODEPAGE_RU866 REQUEST HB_CODEPAGE_RU1251 PROCEDURE Main( cFileToSave ) *hb_cdpSelect("UTF8EX") hb_CDPSelect("RU866") // in Harbour 3.4 must be BEFORE hb_LangSelect() ! hb_LangSelect("RU") // RU866 for Harbour 3.2 CLS IF ! HB_ISSTRING( cFileToSave ) cFileToSave := "hpdf_rus.pdf" ENDIF IF DesignHaruPDF( cFileToSave ) ? "PDF File <" + cFileToSave + "> is created!" WAIT ELSE Alert( "Some problems in creating the PDF!" ) ENDIF RETURN * --------------------------------- * FUNCTION DesignHaruPDF( cFileToSave ) LOCAL cFont, page, height, width, def_font, tw, font LOCAL page_title := "Русификация hb_HPDF" LOCAL samp_text := "abc ABC Съешь еще этих булок." LOCAL font_list := { ; "Courier" , ; "Courier-Bold" , ; "Courier-Oblique" , ; "Courier-BoldOblique" , ; "Helvetica" , ; "Helvetica-Bold" , ; "Helvetica-Oblique" , ; "Helvetica-BoldOblique" , ; "Times-Roman" , ; "Times-Bold" , ; "Times-Italic" , ; "Times-BoldItalic" , ; "Symbol" , ; "ZapfDingbats" } LOCAL pdf := HPDF_New(),hFont // hb_vfErase( cFileToSave ) IF pdf == NIL Alert( "PDF could not be created!" ) RETURN .F. ENDIF IF cEncoder == "UTF-8" HPDF_UseUTFEncodings( pdf ) ENDIF HPDF_SetCurrentEncoder( pdf, cEncoder ) cFont := HPDF_LoadTTFontFromFile(pdf, getenv("SystemRoot")+"\fonts\arial.ttf",.f.) // простой текст ? "used font: "+cFont hFont := HPDF_GetFont(pdf,cFont,cEncoder) // page := HPDF_AddPage( pdf ) height := HPDF_Page_GetHeight( page ) width := HPDF_Page_GetWidth( page ) /* Print the lines of the page. */ HPDF_Page_SetLineWidth( page, 1 ) HPDF_Page_Rectangle( page, 50, 50, width - 100, height - 110 ) HPDF_Page_Stroke( page ) /* Print the title of the page(with positioning center). */ def_font := HPDF_GetFont( pdf, "Helvetica", NIL) HPDF_Page_SetFontAndSize( page, hFont, 24 ) tw := HPDF_Page_TextWidth( page, Str2pdf(page_title) ) HPDF_Page_BeginText( page ) HPDF_Page_TextOut( page, ( width - tw ) / 2, height - 50, Str2pdf(page_title)) HPDF_Page_EndText( page ) /* output subtitle. */ HPDF_Page_BeginText( page ) HPDF_Page_SetFontAndSize( page, hFont, 16 ) HPDF_Page_TextOut( page, 60, height - 80, Str2pdf("<Стандартные примеры шрифтов Type1>") ) HPDF_Page_EndText( page ) HPDF_Page_BeginText( page ) HPDF_Page_MoveTextPos( page, 60, height - 105 ) FOR EACH cFont IN font_list font := HPDF_GetFont( pdf, cFont, cEncoder) HPDF_Page_SetFontAndSize( page, def_font, 9 ) HPDF_Page_ShowText( page, cFont ) HPDF_Page_MoveTextPos( page, 0, -18 ) HPDF_Page_SetFontAndSize( page, font, 20 ) HPDF_Page_ShowText( page, Str2pdf(samp_text ) ) HPDF_Page_MoveTextPos( page, 0, -20 ) NEXT HPDF_Page_EndText( page ) // IF HPDF_SaveToFile( pdf, cFileToSave ) != HPDF_OK ? "0x" + hb_NumToHex( HPDF_GetError( pdf ), 4 ), ; hb_HPDF_GetErrorString( HPDF_GetError( pdf ) ), ; HPDF_GetErrorDetail( pdf ) ENDIF // HPDF_Free( pdf ) // RETURN hb_vfExists( cFileToSave ) * --------------------- * FUNCTION Str2pdf(cString) // в 1251 или UTF8 // IF cEncoder == "UTF-8" RETURN hb_StrToUTF8(cString,"RU866") ENDIF // RETURN hb_Translate(cString,"RU866","RU1251")[/pre2] Но все равно какая-то фигня со встроенными в PDF Base14 шрифтами: Courier не имеет 1251 кодировки, а остальные выглядят странно: 1) Как это вылечить ? Хотелось-бы по максимуму использовать встроенные шрифты, чтобы ни от чего не зависеть. 2) при установке cEncoder := "UTF-8" все встроенные шрифты генерят ошибку на font := HPDF_GetFont( pdf, cFont, cEncoder ). Подходит только NIL Получается, поддержки UTF-8 в них нет ? Или это зависит от версии hpdf ?



полная версия страницы