Articulo Original: Saving a VFP Report at a higher resolution with FoxyPreviewer
http://vfpimaging.blogspot.com/2021/03/saving-vfp-report-at-higher-resolution.html
Autor: Cesar Ch.
Traducido por: Luis María Guayán
Visual FoxPro 9 trajo la posibilidad de guardar nuestros informes como imágenes, utilizando la clase ReportListener y el método OutputPage:
loListener.OutputPage(lnPage, "\MyReportImage.PNG", 104) && PNG file type
Esto nos trae algunas imágenes útiles, pero pésimas en cuanto a calidad. Por ejemplo, la muestra "COLORS.FRX" me brinda una imagen de 816 x 1056 píxeles, una imagen de muy mala calidad, y mas aun si estamos pensando en imprimirla o manipularla.
Pero el método "OutputPage" también nos permite dibujar la página del informe en cualquier tamaño de imagen deseado, pasando un identificador GDI+ Graphics en lugar del nombre de archivo ampliamente utilizado.
Aquí está la muestra de trabajo: observe que el motor de informes funciona solo con 96 DPI, por lo que para tener una mejor calidad, debe gurdar en dimensiones más grandes.
Use la función GETREPORTPAGEEX para obtener sus informes con mayor resolución, aquí está la lista de parámetros
- tcFile: el nombre del archivo de la imagen de destino
- toListener: el ReportListener asociado con el informe actual
- tnPage: el número de página del informe
- tnEncoder: 100=EMF, 101=TIFF, 102=JPEG, 103=GIF, 104=PNG, 105=BMP
- tnScale: el factor de escala que se aplicará a la imagen. 1=Predeterminado (baja calidad), 10=Super alta calidad
- tnWidth: el ancho de la imagen de salida (opcional, si se usa "tnScale")
- tnHeight: la altura de la imagen de salida (opcional, si se usa "tnScale")
DO FoxyPreviewer.App LOCAL loListener AS REPORTLISTENER LOCAL lcFile, lnPage, lnFileType m.loListener = CREATEOBJECT("FoxyListener") m.loListener.LISTENERTYPE = 3 REPORT FORM (ADDBS(_Samples) + "Solution\Reports\Colors.FRX") OBJECT m.loListener m.lnFileType = 104 && PNG && 100 - EMF && 101 - TIFF && 102 - JPEG && 103 - GIF && 104 - PNG && 105 - BMP FOR m.lnPage = 1 TO m.loListener.PAGETOTAL m.lcFile = "c:\temp\Test__" + SYS(2015) + "__" + ALLTRIM(STR(m.lnPage)) + ".png" GetReportPageEx(m.lcFile, m.loListener, m.lnPage, m.lnFileType, 5) && 5 times bigger image than default * For the default lower quality image, use: * loListener.OutputPage(lnPage, "c:\Test" + ALLTRIM(STR(lnPage)) + ".png", lnFileType) ENDFOR m.loListener = NULL RETURN PROCEDURE GetReportPageEx(tcFile, toListener AS REPORTLISTENER, tnPage, tnEncoder, tnScale, tnWidth, tnHeight) LOCAL lhGfx *!* 100 - image type EMF *!* 101 - image type TIFF *!* 102 - image type JPEG *!* 103 - image type GIF *!* 104 - image type PNG *!* 105 - image type BMP m.tnEncoder = EVL(m.tnEncoder, 104) && Default = 104-PNG m.tnScale = EVL(m.tnScale, 1) IF EMPTY(m.tnWidth) m.tnWidth = m.toListener.GETPAGEWIDTH() / 10 * m.tnScale m.tnHeight = m.toListener.GETPAGEHEIGHT() / 10 * m.tnScale ENDIF #DEFINE Gdiplus_PixelFormat_32BppArgb 0x0026200a #DEFINE OUTPUTDEVICETYPE_GDIPLUS 1 LOCAL loBMP AS GpBitmap OF ADDBS(HOME()) + "/FFC/_GDIPLUS.VCX" m.loBMP = NEWOBJECT("GpBitmap", ADDBS(HOME()) + "/FFC/_GDIPLUS.VCX") m.loBMP.CREATE(m.tnWidth, m.tnHeight, Gdiplus_PixelFormat_32BppArgb) LOCAL loGfx AS GpGraphics OF ADDBS(HOME()) + "/FFC/_GDIPLUS.VCX" m.loGfx = NEWOBJECT('GpGraphics', ADDBS(HOME()) + "/FFC/_GDIPLUS.VCX") m.loGfx.CreateFromImage(m.loBMP) m.lhGfx = m.loGfx.GetHandle() m.toListener.OUTPUTPAGE(m.tnPage, m.lhGfx, OUTPUTDEVICETYPE_GDIPLUS, 0, 0, m.tnWidth, m.tnHeight, 0, 0, m.tnWidth, m.tnHeight) m.loBMP.SaveToFile(m.tcFile, "image/png") ENDPROC