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.
Print_to_PDF.7z
(1.35 MiB) Downloaded 207 times

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.. 8-)

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 :oops:

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. :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.

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!! :lol:

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!! :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.