Page 1 of 2
PRINT TO PDF
Posted: Mon Feb 22, 2021 12:46 pm
by SALINETAS24
Hola a todos
Estoy haciendo una prueba para poder crear un PDF sin necesidad de previsualizarlo, que no intervenga el usuario, pero tengo problemas con los acentos, con los caracteres especiales y con las imagenes.
Acompaño el ejemplo de samples con una pequeña modificación.
Si elegimos cualquiera de las dos primeras opciones, nos creará el PDF y será previsualizado correctamente, pero si elegimos la tercera opción..., crear el PDF sin presivualización...., entonces da errores varios, no carga el BMP y los caracteres especiales "áéí ññ etc" son modificados.
El tema es que la misma opción tendría que servir, para crear una factura y previsualizarla o solo para crear su PDF y archivarlo sin necesidad de que el usuario intervenga en esta acción.
¿Es que no sirve el mismo código...?
¿Porqué tantos problemas con los acentos y demás zarandajas...?
¿Alguna solución...?
Muchas gracias
Re: PRINT TO PDF
Posted: Mon Feb 22, 2021 2:53 pm
by edk
Personalmente, uso comandos nativos de HMG HPDF para crear archivos PDF, en lugar de la pseudofunción SELECT PRINTER PDF
Hay varias razones:
- las imágenes en PDF solo pueden ser de tipo PNG o JPG, si es de tipo JPG, este tipo debe declararse junto a HPDFPRINT IMAGE .... TYPE JPG
- No hay declaración de atributos de imagen STRETCH, TRANSPARENT, TRANSPARENTCOLOR en PDF. Las imágenes son siempre ESTIRADAS, por eso es tan importante dar las dimensiones correctas en mm.
- La compatibilidad con UTF-8 en PDF requiere declaraciones adicionales: HPDF_UseUTFEncodings, SET HPDFDOC ENCODING TO "UTF-8" que no se puede definir en la solución SELECT PRINTER PDF debido al hecho de que en el momento de la "declaración de documento PDF" no es realmente allí todavía declarado como objeto.
Re: PRINT TO PDF
Posted: Mon Feb 22, 2021 3:28 pm
by SALINETAS24
Muchas gracias EDK, es correcto tu ejemplo.
Una cervecita virtual para ti..

Re: PRINT TO PDF
Posted: Mon Feb 22, 2021 6:48 pm
by mol
Edward, tú hablas español?
Re: PRINT TO PDF
Posted: Mon Feb 22, 2021 7:19 pm
by SALINETAS24
Bueno, perdonar que insista...,
¿no hay ninguna forma de que aparezcan los acentos "áéíóú" y las "ñ" utilizando SELECT PRINTER PDF ..?
Gracias de antemano.
Re: PRINT TO PDF
Posted: Mon Feb 22, 2021 9:40 pm
by edk
mol wrote: ↑Mon Feb 22, 2021 6:48 pm
Edward, tú hablas español?
Marku, niestety nie umiem, znam kilka słów i zwrotów, nauczyłem się w Stanach jak byłem dawno temu przez 3 miesiące i za sąsiadów miałem Portorykańczyków, notabene bardzo sympatyczni ludzie
PS. Używam translatora

Re: PRINT TO PDF
Posted: Mon Feb 22, 2021 9:42 pm
by edk
SALINETAS24 wrote: ↑Mon Feb 22, 2021 7:19 pm
Bueno, perdonar que insista...,
¿no hay ninguna forma de que aparezcan los acentos "áéíóú" y las "ñ" utilizando SELECT PRINTER PDF ..?
Gracias de antemano.
Debe cambiar temporalmente a una página de códigos que no sea UTF8, por ejemplo, Win1252, y convertir las cadenas de UTF8 a la página de códigos actual mientras genera las impresiones.
Code: Select all
#include "hmg.ch"
#include "hmg_hpdf.ch"
*------------------------------------------------------------------------------*
Function Main()
*------------------------------------------------------------------------------*
REQUEST HB_CODEPAGE_ESWIN
// AVAILABLE LIBRARY INTERFACE LANGUAGES
// SET LANGUAGE TO ENGLISH (DEFAULT)
// SET LANGUAGE TO SPANISH
// SET LANGUAGE TO PORTUGUESE
// SET LANGUAGE TO ITALIAN
// SET LANGUAGE TO GERMAN
// SET LANGUAGE TO FRENCH
Private aColor [10]
aColor [1] := YELLOW
aColor [2] := PINK
aColor [3] := RED
aColor [4] := FUCHSIA
aColor [5] := BROWN
aColor [6] := ORANGE
aColor [7] := GREEN
aColor [8] := PURPLE
aColor [9] := BLACK
aColor [10] := BLUE
DEFINE WINDOW Win_1 ;
AT 0,0 ;
WIDTH 400 ;
HEIGHT 400 ;
TITLE 'MiniPrint Library Test' ;
MAIN
DEFINE MAIN MENU
DEFINE POPUP 'File'
MENUITEM 'Default Printer' ACTION PrintTest1()
* MENUITEM 'User Selected Printer' ACTION PrintTest2()
* MENUITEM 'User Selected Printer And Settings' ACTION PrintTest3()
MENUITEM 'User Selected Printer And Settings (Preview)' ACTION PrintTest4()
MENUITEM 'PDF Print' ACTION PrintTest5()
END POPUP
END MENU
END WINDOW
MAXIMIZE WINDOW Win_1
ACTIVATE WINDOW Win_1
Return
*------------------------------------------------------------------------------*
Procedure PrintTest1()
*------------------------------------------------------------------------------*
Local i
SELECT PRINTER DEFAULT PREVIEW;
ORIENTATION PRINTER_ORIENT_PORTRAIT ;
PAPERSIZE PRINTER_PAPER_LETTER ;
QUALITY PRINTER_RES_MEDIUM
PrintDoc()
MsgInfo('Print Finished')
Return
*------------------------------------------------------------------------------*
Procedure PrintTest2()
*------------------------------------------------------------------------------*
Local i
Local cPrinter
cPrinter := GetPrinter()
If Empty (cPrinter)
Return
EndIf
SELECT PRINTER cPrinter ;
ORIENTATION PRINTER_ORIENT_PORTRAIT ;
PAPERSIZE PRINTER_PAPER_LETTER ;
QUALITY PRINTER_RES_MEDIUM
PrintDoc()
MsgInfo('Print Finished')
Return
*------------------------------------------------------------------------------*
Procedure PrintTest3()
*------------------------------------------------------------------------------*
Local i
Local lSuccess
// Measure Units Are Millimeters
SELECT PRINTER DIALOG TO lSuccess
If lSuccess == .T.
PrintDoc()
MsgInfo('Print Finished')
EndIf
Return
*------------------------------------------------------------------------------*
Procedure PrintTest4()
*------------------------------------------------------------------------------*
Local i
Local lSuccess
SELECT PRINTER DIALOG TO lSuccess PREVIEW
If lSuccess == .T.
PrintDoc()
MsgInfo('Print Finished')
EndIf
Return
*------------------------------------------------------------------------------*
Procedure PrintTest5()
*------------------------------------------------------------------------------*
Local i
Local lSuccess
SELECT PRINTER PDF 'pdfprintdemo.pdf' TO lSuccess
If lSuccess == .T.
PrintDoc()
MsgInfo('Print Finished')
if file( 'pdfprintdemo.pdf')
execute file 'pdfprintdemo.pdf'
endif
EndIf
Return
*------------------------------------------------------------------------------*
Procedure PrintDoc
*------------------------------------------------------------------------------*
Local i
HB_SETCODEPAGE("ESWIN")
// Measure Units Are Millimeters
IF _HMG_SYSDATA [ 513 ] == .T. //SELECT PRINTER PDF
SET HPDFDOC ENCODING TO "CP1252"
ENDIF
START PRINTDOC
START PRINTPAGE
@ 5,020 PRINT IMAGE "Dibus.png" WIDTH 70 HEIGHT 25
@ 20,20 PRINT hb_UTF8TOSTR("José ÁÉÍÓÚ ÑOÑA ESPAÑA") ;
FONT "Arial" ;
SIZE 20
@ 30,20 PRINT RECTANGLE ;
TO 40,190 ;
PENWIDTH 0.1;
COLOR {255,255,0}
@ 60,20 PRINT RECTANGLE ;
TO 100,190 ;
PENWIDTH 0.1;
COLOR {255,255,0};
FILLED
@ 110,20 PRINT RECTANGLE ;
TO 150,190 ;
PENWIDTH 0.1;
COLOR {255,255,0};
ROUNDED
@ 160,20 PRINT RECTANGLE ;
TO 200,190 ;
PENWIDTH 0.1;
COLOR {255,255,0};
FILLED;
ROUNDED
END PRINTPAGE
START PRINTPAGE
@ 20,20 PRINT "Filled Rectangle Sample:" ;
FONT "Arial" ;
SIZE 20
@ 30,20 PRINT RECTANGLE ;
TO 40,190 ;
PENWIDTH 0.1
@ 60,20 PRINT RECTANGLE ;
TO 100,190 ;
PENWIDTH 0.1;
FILLED
@ 110,20 PRINT RECTANGLE ;
TO 150,190 ;
PENWIDTH 0.1;
ROUNDED
@ 160,20 PRINT RECTANGLE ;
TO 200,190 ;
PENWIDTH 0.1;
FILLED;
ROUNDED
END PRINTPAGE
END PRINTDOC
HB_SETCODEPAGE("UTF8")
Return
PD Prg está codificado en UTF8
Re: PRINT TO PDF
Posted: Mon Feb 22, 2021 11:06 pm
by SALINETAS24
Muy agradecido Edk, magnifica solución.
He tenido que hacer una modificación, ya que cuando se trata de cambiar el contenido de una variable, no lo hace.
Code: Select all
local cVar:="José ÁÉÍÓÚ ÑOÑA ESPAÑA"
@ 10,20 PRINT hb_UTF8TOSTR("José ÁÉÍÓÚ ÑOÑA ESPAÑA") ; // resultado OK
FONT "Arial" ;
SIZE 20
@ 20,20 PRINT hb_UTF8TOSTR(cVAr) ; // resultado NO OK
FONT "Arial" ;
SIZE 20
He cambiado por esto
Code: Select all
LOCAL cPage:="UTF8"
IF _HMG_SYSDATA [ 513 ] == .T. //SELECT PRINTER PDF
SET HPDFDOC ENCODING TO "CP1252"
cPage:="ESWIN"
ENDIF
@ 10,20 PRINT HB_TRANSLATE("José ÁÉÍÓÚ ÑOÑA ESPAÑA",,cPage) ; // RESULTADO OK
FONT "Arial" ;
SIZE 20
@ 20,10 PRINT HB_TRANSLATE(cVar,,cPage) // RESULTADO OK
De todas formas mañana le daré un nuevo repaso.
Un saludo y una cerveza virtual..., agradecido.
Re: PRINT TO PDF
Posted: Tue Feb 23, 2021 8:17 am
by SALINETAS24
edk wrote: ↑Mon Feb 22, 2021 9:42 pm
Debe cambiar temporalmente a una página de códigos que no sea UTF8, por ejemplo, Win1252, y convertir las cadenas de UTF8 a la página de códigos actual mientras genera las impresiones.
Code: Select all
#include "hmg.ch"
#include "hmg_hpdf.ch"
... / ...
HB_SETCODEPAGE("UTF8")
Return
PD Prg está codificado en UTF8
Hola EDK, perdón por molestar, solo para decirte que tu código funciona correctamente. ¡¡MAGNIFICO!!
Solo un par de curiosidades, (me estaba volviendo loco).
Defino mi entorno
Utilizo NOTEPAD ++ con codificación UTF-8
En mi programa MAIN cargo
SET LANGUAGE TO SPANISH
SET CODEPAGE TO UNICODE
Y en programa que EDK ha creado
Code: Select all
REQUEST HB_CODEPAGE_ESWIN
HB_SETCODEPAGE("ESWIN")
// Measure Units Are Millimeters
IF _HMG_SYSDATA [ 513 ] == .T. //SELECT PRINTER PDF
SET HPDFDOC ENCODING TO "CP1252"
ENDIF
... /...
y para terminar
HB_SETCODEPAGE("UTF8")
Pues con todo esto resulta que ....
Si lo que quiero mostar son "ñññ, ááééíí".., etc como una cadena o variable tengo que hacerlo así
Code: Select all
@ 10,20 PRINT hb_UTF8TOSTR("José ÁÉÍÓÚ ÑOÑA ESPAÑA") ; // OK
FONT "Arial" ;
SIZE 20
@ 20,20 PRINT hb_UTF8TOSTR(cVAr[1]) ; // OK
FONT "Arial" ;
SIZE 20
Perooooo, (y aquí viene mi locura), cuando el dato es leído de un fichero NO HACE FALTA, SE VISUALIZARA MAL...
Code: Select all
@ 20,20 PRINT hb_UTF8TOSTR(Datos->DIRECCION) ; // MAL...,
FONT "Arial" ;
SIZE 20
@ 20,20 PRINT Datos->DIRECCION ; // OK,
FONT "Arial" ;
SIZE 20
Desconozco porque en unos casos hay que usarlo y en otros no.....,
En fin.., por si alguno esta enganchado con PRINT PDF.., gracias a EDK ya tengo solución.
EDK, te mando saludos cordiales con "caja" de botellines de cerveza fresquita incluida!!

Re: PRINT TO PDF
Posted: Tue Feb 23, 2021 9:31 am
by edk
SALINETAS24 wrote: ↑Tue Feb 23, 2021 8:17 am
Perooooo, (y aquí viene mi locura), cuando el dato es leído de un fichero NO HACE FALTA, SE VISUALIZARA MAL...
Code: Select all
@ 20,20 PRINT hb_UTF8TOSTR(Datos->DIRECCION) ; // MAL...,
FONT "Arial" ;
SIZE 20
@ 20,20 PRINT Datos->DIRECCION ; // OK,
FONT "Arial" ;
SIZE 20
Desconozco porque en unos casos hay que usarlo y en otros no.....,
En fin.., por si alguno esta enganchado con PRINT PDF.., gracias a EDK ya tengo solución.
EDK, te mando saludos cordiales con "caja" de botellines de cerveza fresquita incluida!!
Aquí debe prestar atención a la página de códigos que ha guardado los datos en la base de datos. Probablemente codifique prg en UTF8, por lo que necesita convertir cadenas prg para PDF a Win1252, y ya tiene datos de Win1252 almacenados en la base de datos, por lo que la conversión de estos datos da como resultado caracteres incorrectos, creo.
Aún puede intentar verificar si la cadena contiene caracteres UTF8 y luego decidir si realizar la conversión o no.
Existe tal función (no verifiqué si funciona correctamente):
Code: Select all
hb_StrIsUTF8( <cString> ) ➜ .T|.F.
check if a string contains UTF8 characters(?).
Gracias por la "caja" de cerveza, pero ¿qué tipo de cerveza es esta? Necesito saber qué comprar, jeje.