PRINT TO PDF

HMG en Español

Moderator: Rathinagiri

User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

PRINT TO PDF

Post 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
Attachments
Print_to_PDF.rar
(1.33 MiB) Downloaded 155 times
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
edk
Posts: 911
Joined: Thu Oct 16, 2014 11:35 am
Location: Poland

Re: PRINT TO PDF

Post 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.
Print_to_PDF.7z
(1.35 MiB) Downloaded 180 times
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: PRINT TO PDF

Post by SALINETAS24 »

Muchas gracias EDK, es correcto tu ejemplo.
Una cervecita virtual para ti.. 8-)
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: PRINT TO PDF

Post by SALINETAS24 »

Bueno, perdonar que insista...,

¿no hay ninguna forma de que aparezcan los acentos "áéíóú" y las "ñ" utilizando SELECT PRINTER PDF ..?

Gracias de antemano.
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
edk
Posts: 911
Joined: Thu Oct 16, 2014 11:35 am
Location: Poland

Re: PRINT TO PDF

Post 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 :oops:
edk
Posts: 911
Joined: Thu Oct 16, 2014 11:35 am
Location: Poland

Re: PRINT TO PDF

Post 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
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: PRINT TO PDF

Post by SALINETAS24 »

Muy agradecido Edk, magnifica solución. :o

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.
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: PRINT TO PDF

Post 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!! :lol:
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
edk
Posts: 911
Joined: Thu Oct 16, 2014 11:35 am
Location: Poland

Re: PRINT TO PDF

Post 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!! :lol:
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.
Post Reply