FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Como crear PDF que pueda ser leido creado con EASYREPORT
Posts: 3382
Joined: Fri Oct 07, 2005 08:20 PM

Como crear PDF que pueda ser leido creado con EASYREPORT

Posted: Tue Sep 01, 2026 05:28 PM

Saludos al foro:

En mi aplicaciΓ³n desde la vista previa creo el PDF con Img2pdf sin mayor problema.

El tema es que mi cliente quiere abrir el PDF y copiar ciertos datos para pegarlos en otra aplicaciΓ³n y eso no es posible desde el PDF que creo.

Alguna sugerencia?

Muy agradecido

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: Como crear PDF que pueda ser leido

Posted: Tue Sep 01, 2026 07:47 PM
JoΓ£o Santos - SΓ£o Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Como crear PDF que pueda ser leido

Posted: Wed Sep 02, 2026 06:02 AM

Estimado Armando,

Usa Haru con FWH:

REQUEST FWHARU // aΓ±adir arriba del todo

TPrinter():lUseHaruPDF := .T.

Haru genera texto en vez de imΓ‘genes y por lo tanto es copiable :idea:

Revisa samples/report/pdfharu1.prg

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 3382
Joined: Fri Oct 07, 2005 08:20 PM

Re: Como crear PDF que pueda ser leido

Posted: Thu Sep 03, 2026 03:09 PM

Amigos:

Muchas gracias por sus respuestas.

Por ahora estoy creando el PDF desde la vista previa usando img2pdf

Master Antonio:

En FWH2307\Samples\Report no tengo PdfHaru.Prg y ΒΏ FWSavePreviewToPDF( ) no es funcional?

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Como crear PDF que pueda ser leido

Posted: Thu Sep 03, 2026 03:52 PM

El soporte para Haru se implementΓ³ un aΓ±o despues :?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 3382
Joined: Fri Oct 07, 2005 08:20 PM

Re: Como crear PDF que pueda ser leido

Posted: Thu Sep 03, 2026 04:54 PM

MAster:

Lo encontrΓ© en FWH2512, le tirare un ojo.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 3382
Joined: Fri Oct 07, 2005 08:20 PM

Re: Como crear PDF que pueda ser leido

Posted: Fri Sep 04, 2026 02:29 AM

Amigos:

Estoy usando EasyReport para crear el reporte, de hecho es una factura, alguien que me tire un ejemplo?

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Como crear PDF que pueda ser leido creado con EASYREPORT

Posted: Fri Sep 04, 2026 04:37 AM

en FWH ya hay una factura hecha con EasyReport.

El diseΓ±o estΓ‘ en samples\yinvoice\invoice.vrd y el cΓ³digo que la rellena en samples\misc\yunus.prg (ViewInvoiceER())

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Como crear PDF que pueda ser leido creado con EASYREPORT

Posted: Fri Sep 04, 2026 04:38 AM

La idea es: el .vrd pinta la factura; el PRG solo inyecta valores por ID de Γ­tem.

CΓ³mo estΓ‘ montada la factura

El invoice.vrd tiene 6 Γ‘reas:

β”Œβ”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Área β”‚ Archivo β”‚ QuΓ© es β”‚
β”œβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 1 β”‚ invoice.v01 β”‚ Cabecera: empresa, cliente, nΒΊ, fecha, vencimiento β”‚
β”œβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 2 β”‚ invoice.v02 β”‚ TΓ­tulos de columnas (cΓ³digo, descripciΓ³n, cantidad…) β”‚
β”œβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 3 β”‚ invoice.v03 β”‚ LΓ­nea de detalle (fila clara) β”‚
β”œβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 6 β”‚ invoiceSchatten.v03 β”‚ LΓ­nea de detalle (fila sombreada, cebra) β”‚
β”œβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 4 β”‚ invoice.v04 β”‚ Totales: base, IVA, total β”‚
β”œβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 5 β”‚ Ganze Seite β”‚ Fondo de pΓ‘gina (se imprime primero) β”‚
β””β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Cada texto del diseΓ±ador tiene un ID. Ese ID es el que usas en ITEMIDS.

CΓ³digo mΓ­nimo para imprimirla

#include "FiveWin.ch"
#include "easyrep.ch"

FUNCTION PrintInvoice( lPreview, oWnd )

LOCAL oVRD, n, nPrintArea := 3
LOCAL nTotal := 0, nVAT := 0
LOCAL aLines

// Cabecera de la factura (puedes venir de un DBF)
LOCAL cCompany := "EasyReport Comp."
LOCAL cAddress := "Calle Mayor 12" + CRLF + "28013 Madrid"
LOCAL cCIF := "B-12345678"
LOCAL cInvNum := "2026-0042"
LOCAL dDate := Date()
LOCAL dPayDate := Date() + 30
LOCAL nTaxRate := 21

// LΓ­neas: cΓ³digo, descripciΓ³n, cantidad, precio, dto
aLines := { ;
{ "A001", "Monitor 27 pulgadas", 2, 189.00, 0 }, ;
{ "A002", "Teclado mecanico", 1, 79.50, 5 }, ;
{ "A003", "Cable HDMI 2m", 3, 12.00, 0 } }

EASYREPORT oVRD NAME "yinvoice\invoice.vrd" ;
PREVIEW lPreview OF oWnd MODAL

IF oVRD:lDialogCancel
RETURN .F.
ENDIF

// 5 = fondo de pΓ‘gina
PRINTAREA 5 OF oVRD

// 1 = cabecera (IDs del invoice.v01)
PRINTAREA 1 OF oVRD ;
ITEMIDS { 201, 500, 501, 602, 502, 603 } ;
ITEMVALUES { cCompany, cAddress, cCIF, cInvNum, ;
DToC( dDate ), DToC( dPayDate ) }

// 2 = tΓ­tulos de columnas
PRINTAREA 2 OF oVRD

// 3 / 6 = lΓ­neas (cebra)
FOR n := 1 TO Len( aLines )
nTotal += aLines[ n, 3 ] * aLines[ n, 4 ] - aLines[ n, 5 ]

  PRINTAREA nPrintArea OF oVRD ;
     ITEMIDS    { 200, 201, 202, 203, 204, 205 } ;
     ITEMVALUES { aLines[ n, 1 ], ;
                  aLines[ n, 2 ], ;
                  AllTrim( Str( aLines[ n, 3 ] ) ), ;
                  AllTrim( Str( aLines[ n, 4 ], 10, 2 ) ), ;
                  AllTrim( Str( aLines[ n, 5 ] ) ), ;
                  AllTrim( Str( aLines[ n, 3 ] * aLines[ n, 4 ] - aLines[ n, 5 ], 12, 2 ) ) }

  nPrintArea := If( nPrintArea == 3, 6, 3 )   // fila clara / sombreada

NEXT

nVAT := nTotal * nTaxRate / 100

// 4 = pie de totales
PRINTAREA 4 OF oVRD ;
ITEMIDS { 310, 311, 312, 313 } ;
ITEMVALUES { AllTrim( Str( nTotal, 12, 2 ) ), ;
AllTrim( Str( nTaxRate, 5, 2 ) ), ;
AllTrim( Str( nVAT, 12, 2 ) ), ;
AllTrim( Str( nTotal + nVAT, 12, 2 ) ) }

END EASYREPORT oVRD

RETURN .T.

Los IDs tienen que coincidir con los del diseΓ±ador. En invoice.v01 / invoice.v03 / invoice.v04 estΓ‘n asΓ­:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ID β”‚ Campo β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 201 β”‚ Empresa β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 500 β”‚ DirecciΓ³n cliente β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 501 β”‚ CIF β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 602 β”‚ NΒΊ factura β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 502 β”‚ Fecha β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 603 β”‚ Vencimiento β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 200–205 β”‚ CΓ³digo, descripciΓ³n, cantidad, precio, dto, importe β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 310–313 β”‚ Base, % IVA, cuota IVA, total β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Si el texto no sale, casi siempre es que el ID del PRG no es el del .v01.

CΓ³mo verlo y editarlo

  1. DiseΓ±ador:

cd C:\fwteam\samples\EasyReport
C:\fwteam\samples\build_new.bat erdsample hb32

Abre ..\yinvoice\invoice.vrd y mira cada Γ‘rea. En cada texto, el ID es el nΓΊmero que luego pasas en ITEMIDS.

  1. App de facturaciΓ³n completa (clientes, lΓ­neas, preview):

cd C:\fwteam\samples\misc
C:\fwteam\samples\build_new.bat yunus hb32

En Invoices hay un botΓ³n que llama a ViewInvoiceER().

Flujo tΓ­pico de una factura

PRINTAREA 5 // fondo / membrete de pΓ‘gina
PRINTAREA 1 // cabecera (datos fijos de esta factura)
PRINTAREA 2 // tΓ­tulos de columnas
loop lΓ­neas:
PRINTAREA 3 o 6 // cada fila
si se acaba la pΓ‘gina: PAGEBREAK + cabecera otra vez
PRINTAREA 4 // totales (reserva sitio: oVRD:nPageBreak - oVRD:aAreaHeight[4])
END EASYREPORT

Si hay muchas lΓ­neas, mira samples\EasyReport\examples\SourceExample2.prg: comprueba oVRD:nNextRow > oVRD:nPageBreak y hace PAGEBREAK oVRD antes de que los totales se corten.

PDF directo (sin diΓ‘logo):

EASYREPORT oVRD NAME "yinvoice\invoice.vrd" PREVIEW .T. FILE "factura.pdf"

Otra vΓ­a: expresiones (Cargo)

En SourceExample1.prg (albarΓ‘n/pedido) no se pasan todos los IDs. El diseΓ±ador usa expresiones tipo oVRD:Cargo[1] y el PRG solo rellena el array:

oVRD:Cargo := { "Nr. 12345 Date: 5.9.2004", ; // 1
"Testclient", ; // 2
... }
PRINTAREA 5 OF oVRD // el .vrd ya sabe quΓ© Cargo[n] pintar

Para una factura, ITEMIDS/ITEMVALUES (como yunus) suele ser mΓ‘s claro.

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion