Documentación API - Generador de PDFs
Guía completa para integrar el generador de PDFs en tu aplicación
Introducción
API REST para generar facturas y recibos en formato PDF con múltiples plantillas profesionales.
Características
- 13 plantillas diferentes (8 facturas + 2 recibos + 3 especiales)
- Certificación SAT Guatemala
- Logo personalizable (Base64 o texto)
- Cálculos automáticos
- Productos/conceptos dinámicos
- Respuesta en Base64 o descarga directa
Información Técnica
- URL Base: https://pdf.mayansource.com/
- Método: POST
- Content-Type: application/json
- Librería: FPDF
- PHP: 8.2+
- Encoding: UTF-8
Autenticación
Actualmente la API no requiere autenticación. Todas las peticiones son públicas.
Endpoint Principal
/generate_pdf.php
Genera un PDF basado en el template y datos proporcionados.
Parámetros del Body (JSON)
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
template |
string | Requerido | Nombre del template a usar. Ver lista completa abajo. |
company_name |
string | Requerido | Nombre de la empresa emisora |
company_address |
string | Opcional | Dirección de la empresa |
logo_base64 |
string | Opcional | Logo en formato Base64 (data:image/png;base64,...) |
logo_text |
string | Opcional | Texto alternativo si no se proporciona logo |
products |
array | Requerido | Array de productos (para facturas) |
concepts |
array | Requerido | Array de conceptos (para recibos) |
Templates Disponibles
Facturas
invoice- Factura básicainvoice_certified- Factura certificada SATmodern_invoice- Factura modernamodern_certified- Factura moderna certificadaitech_invoice- Factura iTechitech_certified- Factura iTech certificadadual_color- Factura dual colordual_color_certified- Factura dual color certificada
Recibos
receipt- Recibo simple (6 por página)receipt2- Recibo profesional
Especiales
borcelle- Template Borcelle
Ejemplo de Request
curl -X POST https://pdf.mayansource.com/generate_pdf.php \
-H "Content-Type: application/json" \
-d '{
"template": "invoice",
"company_name": "Mi Empresa S.A.",
"company_address": "Calle Principal 123",
"logo_text": "ME",
"invoice_number": "001-2024",
"date": "30/09/2025",
"customer_name": "Cliente Ejemplo",
"customer_nit": "12345678",
"products": [
{
"description": "Producto 1",
"quantity": 2,
"unit_price": 100.00
}
]
}'
Respuesta Exitosa
{
"success": true,
"pdf_base64": "JVBERi0xLjMKJeLjz9MKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMiAwIFIKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFszIDAgUl0KL0NvdW50IDEKL01lZGlhQm94IFswIDAgNTk1LjI4IDg0MS44OV0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCAyIDAgUgovUmVzb3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA0IDAgUgo+Pgo+PgovQ29udGVudHMgNSAwIFIKPj4KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvSGVsdmV0aWNhCj4+CmVuZG9iago1IDAgb2JqCjw8Ci9MZW5ndGggNDQKPj4Kc3RyZWFtCkJUCi9GMSA0OCBUZgoxMDAgNzAwIFRkCihIZWxsbywgV29ybGQhKSBUagpFVAplbmRzdHJlYW0KZW5kb2JqCnhyZWYKMCA2CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAwOSAwMDAwMCBuIAowMDAwMDAwMDU4IDAwMDAwIG4gCjAwMDAwMDAxNDUgMDAwMDAgbiAKMDAwMDAwMDI2NiAwMDAwMCBuIAowMDAwMDAwMzQ1IDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgNgovUm9vdCAxIDAgUgo+PgpzdGFydHhyZWYKNDM4CiUlRU9GCg==",
"filename": "factura_001-2024.pdf",
"timestamp": "2025-09-30 17:30:00"
}
Facturas Básicas
Template: invoice
Factura básica con datos de empresa, cliente, productos y totales automáticos.
Ejemplo JSON:
{
"template": "invoice",
"company_name": "Mi Empresa S.A.",
"company_address": "Calle Principal 123, Zona 10",
"company_phone": "2345-6789",
"company_email": "info@miempresa.com",
"logo_text": "ME",
"invoice_number": "001-2024",
"date": "30/09/2025",
"customer_name": "Cliente Ejemplo",
"customer_nit": "12345678-9",
"customer_address": "Dirección del cliente",
"products": [
{
"description": "Producto 1",
"quantity": 2,
"unit_price": 100.00
},
{
"description": "Producto 2",
"quantity": 1,
"unit_price": 250.00
}
],
"notes": "Gracias por su compra"
}
Template: invoice_certified
Factura certificada con campos SAT Guatemala (NIT, Serie, DTE, Autorización).
Campos adicionales requeridos:
nit_emisor- NIT del emisornit_comprador- NIT del compradorserie- Serie del DTEnumero_dte- Número del DTEnumero_autorizacion- Número de autorización SATfecha_certificacion- Fecha de certificación
Facturas Modernas
Templates Modernos Disponibles
modern_invoice- Factura modernamodern_certified- Factura moderna certificada SATitech_invoice- Factura iTechitech_certified- Factura iTech certificada SATdual_color- Factura dual colordual_color_certified- Factura dual color certificada SAT
Template: modern_invoice
Diseño minimalista y contemporáneo con layout de dos columnas. Incluye elementos visuales modernos, colores accent y tipografía limpia.
Características:
- Diseño minimalista moderno
- Layout de dos columnas
- Colores accent personalizables
- Logo circular elegante
Ejemplo JSON:
{
"template": "modern_invoice",
"company_name": "Tech Solutions S.A.",
"company_address": "Avenida Reforma 10-00, Zona 10",
"company_phone": "2345-6789",
"company_email": "info@techsolutions.com",
"logo_text": "TS",
"invoice_number": "INV-2024-001",
"date": "30/09/2025",
"customer_name": "Cliente Corporativo",
"customer_nit": "12345678-9",
"customer_address": "Ciudad de Guatemala",
"products": [
{
"description": "Desarrollo de Software",
"quantity": 1,
"unit_price": 5000.00
},
{
"description": "Soporte Técnico Mensual",
"quantity": 3,
"unit_price": 500.00
}
],
"notes": "Pago a 30 días"
}
Template: itech_invoice
Diseño tecnológico con estilo corporativo. Ideal para empresas de tecnología y servicios digitales.
Características:
- Estilo tecnológico
- Diseño corporativo
- Layout profesional
- Colores oscuros elegantes
Template: dual_color
Diseño vibrante con degradados de color. Perfecto para empresas creativas y modernas.
Características:
- Degradados de color
- Diseño vibrante
- Estilo creativo
- Colores personalizables
Versiones Certificadas
Todos los templates modernos tienen su versión certificada SAT. Solo agrega _certified al nombre del template y los campos SAT requeridos (nit_emisor, nit_comprador, serie, numero_dte, numero_autorizacion, fecha_certificacion).
Recibos de Caja
Template: receipt
Recibo simple con formato desprendible (6 recibos por página).
Ejemplo JSON:
{
"template": "receipt",
"receipt_number": "000488",
"date": "30/09/2025",
"received_from": "Irving Lorenzana",
"amount": 1500.00,
"concept": "Pago de cuota de mantenimiento",
"payment_method": "Efectivo",
"received_by": "Administración"
}
Template: receipt2
Recibo profesional con tabla de conceptos, métodos de pago y sección administrativa.
Ejemplo JSON:
{
"template": "receipt2",
"company_name": "Vecinos de Burgos S.A.",
"company_address": "Avenida Las Americas 7-62 Zone 3",
"company_office": "Oficina 803",
"company_phone": "Teléfono: 7930-4280",
"company_whatsapp": "WhatsApp: 4034-2532",
"company_city": "Quetzaltenango",
"logo_text": "VB",
"receipt_number": "000488",
"date": ["30", "09", "2025"],
"received_from": "Irving Lorenzana",
"address": "Ciudad",
"total": 1500.00,
"concepts": [
{
"code": "001",
"concept": "CUOTA DE MANTENIMIENTO",
"lot": "15-B",
"amount": 1000.00
},
{
"code": "002",
"concept": "SERVICIO DE AGUA",
"lot": "15-B",
"amount": 300.00
},
{
"code": "003",
"concept": "MORA",
"lot": "15-B",
"amount": 200.00
}
],
"checks": [
{
"number": "12345678",
"bank": "Banco Industrial",
"amount": 1000.00
}
],
"cash": 500.00,
"ticket_number": "BOL-2024-0250"
}
Ejemplos de Código
PHP con cURL
<?php
$data = [
'template' => 'receipt2',
'company_name' => 'Vecinos de Burgos S.A.',
'receipt_number' => '000488',
'date' => ['30', '09', '2025'],
'received_from' => 'Irving Lorenzana',
'total' => 1500.00,
'concepts' => [
[
'code' => '001',
'concept' => 'CUOTA DE MANTENIMIENTO',
'lot' => '15-B',
'amount' => 1000.00
]
]
];
$ch = curl_init('https://pdf.mayansource.com/generate_pdf.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if ($result['success']) {
// Guardar PDF
file_put_contents('recibo.pdf', base64_decode($result['pdf_base64']));
echo "PDF generado exitosamente!";
}
?>
JavaScript con Fetch API
const data = {
template: 'receipt2',
company_name: 'Vecinos de Burgos S.A.',
receipt_number: '000488',
date: ['30', '09', '2025'],
received_from: 'Irving Lorenzana',
total: 1500.00,
concepts: [
{
code: '001',
concept: 'CUOTA DE MANTENIMIENTO',
lot: '15-B',
amount: 1000.00
}
]
};
fetch('https://pdf.mayansource.com/generate_pdf.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(result => {
if (result.success) {
// Descargar PDF
const link = document.createElement('a');
link.href = 'data:application/pdf;base64,' + result.pdf_base64;
link.download = result.filename;
link.click();
}
})
.catch(error => console.error('Error:', error));
Python con Requests
import requests
import base64
data = {
'template': 'receipt2',
'company_name': 'Vecinos de Burgos S.A.',
'receipt_number': '000488',
'date': ['30', '09', '2025'],
'received_from': 'Irving Lorenzana',
'total': 1500.00,
'concepts': [
{
'code': '001',
'concept': 'CUOTA DE MANTENIMIENTO',
'lot': '15-B',
'amount': 1000.00
}
]
}
response = requests.post(
'https://pdf.mayansource.com/generate_pdf.php',
json=data,
headers={'Content-Type': 'application/json'}
)
result = response.json()
if result['success']:
# Guardar PDF
pdf_data = base64.b64decode(result['pdf_base64'])
with open('recibo.pdf', 'wb') as f:
f.write(pdf_data)
print("PDF generado exitosamente!")
Manejo de Errores
Respuesta de Error
{
"error": true,
"message": "Descripción del error",
"timestamp": "2025-09-30 17:30:00"
}
Códigos de Error Comunes
| Error | Descripción | Solución |
|---|---|---|
JSON inválido |
El JSON enviado tiene errores de sintaxis | Verificar que el JSON esté bien formado. No usar números con ceros a la izquierda. |
Plantilla no válida |
El template especificado no existe | Usar uno de los templates disponibles en la lista |
Faltan campos requeridos |
No se proporcionaron todos los campos obligatorios | Revisar la documentación del template y agregar los campos faltantes |
Error al generar PDF |
Error interno al crear el PDF | Verificar que los datos sean válidos y contactar soporte |
Colección Postman
Descarga la colección completa de Postman con todos los endpoints pre-configurados.
Cómo Importar
- Abre Postman
- Click en "Import"
- Selecciona el archivo JSON descargado
- La colección aparecerá en tu workspace
- Configura la URL base si es necesario
Tip
La colección incluye variables de entorno para facilitar el cambio entre desarrollo y producción.