Necesito crear un PDF a partir de un xml
Tengo que utilizar Harbour, hbxml, hbhpdf, hbzebra
En C:\hb32\include no encuentro hbhpdf.ch
En C:\hb32\contrib\hbhpdf\
encontre harupdf.ch
Este archivo lo renombre a hbhpdf.ch y lo copie a c:\hb32\include
(no se, si es lo correcto).
Versión de harbour:
Harbour Make (hbmk2) 3.2.0dev (r2026-01-09 16:42)
Copyright (c) 1999-present, Viktor Szakats
https://github.com/harbour/core/
Traducción (es): Guillermo Varona Silupú <gvaronas@gmail.com>
Harbour Build Info
---------------------------------------------------------------------------------------------
Version: Harbour 3.2.0dev (r2601091642)
Compiler: MinGW GNU C 7.3 (32-bit)
Platform: Windows 11 or newer 10.0.26200
PCode version: 0.3
ChangeLog last entry: 2026-01-09 17:42 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
ChangeLog ID: 186927c3a792d0c408b591155ef84b7b88e12c37
Built on: Jan 10 2026 05:07:50
Build options: (Clipper 5.3b) (Clipper 5.x undoc)
--------------------------------------------------------------------------------------------
Consulta de herramientas externas:
hbmk2 -find hbhpdf
hbhpdf.hbc (instalado):
__HBEXTERN__HBHPDF__()
hbmk2 -find hbzebra
hbzebra.hbc (instalado):
__HBEXTERN__HBZEBRA__()
hbmk2 -find hbmxml
hbmxml.hbc (instalado):
__HBEXTERN__HBMXML__()
Cómo debo incluir en mi archivo HBP las herramientas externas.
este es mi archivo HBP
*****************************************************************************
-oREP-PAGO
-inc
-w3 -es2
-mt
-compr=yes
-quiet
-lxhb
-lhbwin
-lhbct
-lhbnf
-lgrump
-lsuperlib
-lgtwvt
-lgtwvg
#-gui
PAGO-GEMI.prg
****************************************************************************
Cuando compilo, surgen estos errores:
hbmk2: Procesando opciones de entorno: -comp=mingw
Harbour 3.2.0dev (r2601091642)
Copyright (c) 1999-2025, https://harbour.github.io/
Compiling 'PAGO-GEMI.prg'...
Lines 1267, Functions/Procedures 5
Generating C source output to '.hbmk\win\mingw\PAGO-GEMI.c'... Done.
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0xa8): undefined reference to `HB_FUN_HPDF_NEW'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0xb8): undefined reference to `HB_FUN_HPDF_ADDPAGE'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0xc8): undefined reference to `HB_FUN_HPDF_PAGE_SETSIZE'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0xd8): undefined reference to `HB_FUN_HPDF_GETFONT'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0xe8): undefined reference to `HB_FUN_HPDF_LOADJPEGIMAGEFROMFILE'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0xf8): undefined reference to `HB_FUN_HPDF_PAGE_DRAWIMAGE'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x118): undefined reference to `HB_FUN_HPDF_PAGE_BEGINTEXT'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x128): undefined reference to `HB_FUN_HPDF_PAGE_SETFONT'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x138): undefined reference to `HB_FUN_HPDF_PAGE_TEXTOUT'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x158): undefined reference to `HB_FUN_HPDF_PAGE_ENDTEXT'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x1b8): undefined reference to `HB_FUN_HPDF_SAVETOFILE'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x1c8): undefined reference to `HB_FUN_HPDF_FREE'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x1d8): undefined reference to `HB_FUN_HPDF_PAGE_MOVETO'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x1e8): undefined reference to `HB_FUN_HPDF_PAGE_LINETO'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x1f8): undefined reference to `HB_FUN_HPDF_PAGE_STROKE'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x208): undefined reference to `HB_FUN_HPDF_PAGE_SETLINEWIDTH'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x218): undefined reference to `HB_FUN_HPDF_PAGE_RECTANGLE'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x238): undefined reference to `HB_FUN_HB_ZEBRA_CREATE_QR'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x248): undefined reference to `HB_FUN_HB_ZEBRA_DRAW'
.hbmk/win/mingw/PAGO-GEMI.o:PAGO-GEMI.c:(.data+0x258): undefined reference to `HB_FUN_HPDF_PAGE_FILL'
collect2.exe: error: ld returned 1 exit status
hbmk2[rep-pago]: Error: Ejecutando enlazador. 1
este es mi archivo PAGO-GEMI.PRG
Código: Selecionar todos
#include "hbxml.ch"
#include "hbhpdf.ch"
#include "hbzebra.ch"
#define MARGEN_IZQ 50
#define ANCHO_UTIL 512
PROCEDURE Main( cFileXml )
LOCAL oXmlDoc, oComprobante, oEmisor, oReceptor, oPagos, oPago, oDoctoRel, oTfd, oTotales
LOCAL oPdf, oPage, oFontBold, oFontNorm, nY := 750 //oFontTiny
LOCAL cXmlContent, oImage, cLogo := "logo.jpg"
IF Empty( cFileXml ) .OR. !File( cFileXml )
? "Error: Debe proporcionar un archivo XML valido."
? "Uso: rep_pago.exe PC000314.XML"
RETURN
ENDIF
// --- 1. CARGA DE DATOS ---
cXmlContent := MemoRead( cFileXml )
oXmlDoc := TXmlDocument():New( cXmlContent )
oComprobante := oXmlDoc:FindFirst( "cfdi:Comprobante" )
oEmisor := oComprobante:FindFirst( "cfdi:Emisor" )
oReceptor := oComprobante:FindFirst( "cfdi:Receptor" )
oTfd := oXmlDoc:FindFirst( "tfd:TimbreFiscalDigital" )
oPagos := oComprobante:FindFirst( "pago20:Pagos" )
oPago := oPagos:FindFirst( "pago20:Pago" )
oTotales := oPagos:FindFirst( "pago20:Totales" )
// --- 2. INICIALIZAR PDF ---
oPdf := HPDF_New()
oPage := HPDF_AddPage( oPdf )
*HPDF_Page_SetSize( oPage, HPDF_PAGE_SIZE_LETTER, HPDF_PAGE_PORTRAIT )
HPDF_Page_SetSize( oPage, 0, 0 )
oFontBold := HPDF_GetFont( oPdf, "Helvetica-Bold" )
oFontNorm := HPDF_GetFont( oPdf, "Helvetica" )
*oFontTiny := HPDF_GetFont( oPdf, "Helvetica", 6 )
// --- 3. ENCABEZADO Y LOGO ---
IF File( cLogo )
oImage := HPDF_LoadJpegImageFromFile( oPdf, cLogo )
HPDF_Page_DrawImage( oPage, oImage, MARGEN_IZQ, 715, 90, 45 )
ENDIF
// Cuadro Emisor
DibujarMarco( oPage, MARGEN_IZQ, 710, 250, 50 )
HPDF_Page_BeginText( oPage )
HPDF_Page_SetFont( oPage, oFontBold, 9 )
HPDF_Page_TextOut( oPage, MARGEN_IZQ + 5, 700, "EMISOR: " + oEmisor:GetAttribute("Nombre") )
HPDF_Page_SetFont( oPage, oFontNorm, 7 )
HPDF_Page_TextOut( oPage, MARGEN_IZQ + 5, 690, "RFC: " + oEmisor:GetAttribute("Rfc") )
HPDF_Page_TextOut( oPage, MARGEN_IZQ + 5, 680, "Regimen: " + oEmisor:GetAttribute("RegimenFiscal") )
HPDF_Page_EndText( oPage )
// Cuadro Receptor
DibujarMarco( oPage, 310, 710, 250, 50 )
HPDF_Page_BeginText( oPage )
HPDF_Page_SetFont( oPage, oFontBold, 9 )
HPDF_Page_TextOut( oPage, 315, 700, "RECEPTOR: " + oReceptor:GetAttribute("Nombre") )
HPDF_Page_SetFont( oPage, oFontNorm, 7 )
HPDF_Page_TextOut( oPage, 315, 690, "RFC: " + oReceptor:GetAttribute("Rfc") )
HPDF_Page_TextOut( oPage, 315, 680, "Uso CFDI: " + oReceptor:GetAttribute("UsoCFDI") )
HPDF_Page_EndText( oPage )
// --- 4. TABLA DE DOCUMENTOS ---
nY := 640
ImprimirEncabezadoTabla( oPage, oFontBold, @nY )
oDoctoRel := oPago:FindFirst( "pago20:DoctoRelacionado" )
HPDF_Page_SetFont( oPage, oFontNorm, 7 )
DO WHILE oDoctoRel != NIL
IF nY < 180 // Control de Salto de Pagina
oPage := HPDF_AddPage( oPdf )
nY := 750
ImprimirEncabezadoTabla( oPage, oFontBold, @nY )
HPDF_Page_SetFont( oPage, oFontNorm, 7 )
ENDIF
HPDF_Page_BeginText( oPage )
HPDF_Page_TextOut( oPage, 50, nY, oDoctoRel:GetAttribute("Serie") + oDoctoRel:GetAttribute("Folio") )
HPDF_Page_TextOut( oPage, 100, nY, oDoctoRel:GetAttribute("IdDocumento") )
HPDF_Page_TextOut( oPage, 350, nY, Transform(Val(oDoctoRel:GetAttribute("ImpSaldoAnt")), "@E 999,999.99") )
HPDF_Page_TextOut( oPage, 430, nY, Transform(Val(oDoctoRel:GetAttribute("ImpPagado")), "@E 999,999.99") )
HPDF_Page_TextOut( oPage, 510, nY, Transform(Val(oDoctoRel:GetAttribute("ImpSaldoInsoluto")), "@E 999,999.99") )
HPDF_Page_EndText( oPage )
nY -= 10
oDoctoRel := oPago:FindNext()
ENDDO
// --- 5. TOTALES ---
nY -= 10
DibujarMarco( oPage, 350, nY + 5, 230, 35 )
HPDF_Page_BeginText( oPage )
HPDF_Page_SetFont( oPage, oFontBold, 8 )
HPDF_Page_TextOut( oPage, 360, nY - 5, "Total IVA 16%:" )
HPDF_Page_TextOut( oPage, 500, nY - 5, Transform(Val(oTotales:GetAttribute("TotalTrasladosImpuestoIVA16")), "@E 999,999.99") )
HPDF_Page_TextOut( oPage, 360, nY - 15, "MONTO TOTAL PAGO:" )
HPDF_Page_TextOut( oPage, 500, nY - 15, Transform(Val(oPago:GetAttribute("Monto")), "@E 999,999.99") )
HPDF_Page_EndText( oPage )
// --- 6. PIE FISCAL ---
ImprimirBloqueFiscal( oPdf, oPage, oTfd, oEmisor, oReceptor )
HPDF_SaveToFile( oPdf, "Complemento_Pago.pdf" )
HPDF_Free( oPdf )
? "Archivo 'Complemento_Pago.pdf' generado exitosamente."
RETURN
// --- FUNCIONES DE APOYO ---
PROCEDURE ImprimirEncabezadoTabla( oPage, oFont, nY )
HPDF_Page_BeginText( oPage )
HPDF_Page_SetFont( oPage, oFont, 8 )
HPDF_Page_TextOut( oPage, 50, nY, "FOLIO" )
HPDF_Page_TextOut( oPage, 100, nY, "UUID RELACIONADO" )
HPDF_Page_TextOut( oPage, 350, nY, "SALDO ANT." )
HPDF_Page_TextOut( oPage, 430, nY, "PAGADO" )
HPDF_Page_TextOut( oPage, 510, nY, "INSOLUTO" )
HPDF_Page_EndText( oPage )
nY -= 5
HPDF_Page_MoveTo( oPage, 50, nY )
HPDF_Page_LineTo( oPage, 580, nY )
HPDF_Page_Stroke( oPage )
nY -= 12
RETURN
PROCEDURE DibujarMarco( oPage, nX, nY, nW, nH )
HPDF_Page_SetLineWidth( oPage, 0.5 )
HPDF_Page_Rectangle( oPage, nX, nY - nH, nW, nH )
HPDF_Page_Stroke( oPage )
RETURN
PROCEDURE ImprimirBloqueFiscal( oPdf, oPage, oTfd, oEmisor, oReceptor )
LOCAL cUrl := "https://verificacfdi.facturaelectronica.sat.gob.mx/default.aspx?" + ;
"id=" + oTfd:GetAttribute("UUID") + "&re=" + oEmisor:GetAttribute("Rfc") + ;
"&rr=" + oReceptor:GetAttribute("Rfc") + "&tt=0.00&fe=" + Right(oTfd:GetAttribute("SelloCFD"), 8)
LOCAL hZebra := hb_zebra_create_qr( cUrl, NIL )
LOCAL nY_F := 120
// QR
hb_zebra_draw( hZebra, {|x, y, w, h| HPDF_Page_Rectangle( oPage, 50 + x, nY_F - y, w, h ), HPDF_Page_Fill( oPage ) } )
// Datos Fiscales
HPDF_Page_BeginText( oPage )
HPDF_Page_SetFont( oPage, HPDF_GetFont( oPdf, "Helvetica-Bold" ), 6 )
HPDF_Page_TextOut( oPage, 140, nY_F, "Folio Fiscal (UUID): " + oTfd:GetAttribute("UUID") )
HPDF_Page_SetFont( oPage, HPDF_GetFont( oPdf, "Helvetica" ), 5 )
HPDF_Page_TextOut( oPage, 140, nY_F - 10, "Sello Digital del CFDI:" )
ImprimirWrap( oPage, 140, nY_F - 17, oTfd:GetAttribute("SelloCFD"), 115 )
HPDF_Page_EndText( oPage )
RETURN
PROCEDURE ImprimirWrap( oPage, nX, nY, cTexto, nLen )
LOCAL nI := 1
DO WHILE nI < Len(cTexto)
HPDF_Page_TextOut( oPage, nX, nY, SubStr(cTexto, nI, nLen) )
nI += nLen
nY -= 6
ENDDO
RETURN
Saludos!!

