- Pure Zig implementation, zero dependencies - PDF 1.4 format output - Standard Type1 fonts (Helvetica, Times, Courier) - Text rendering with colors - Graphics primitives (lines, rectangles) - Hello world and invoice examples 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
186 lines
4.5 KiB
Markdown
186 lines
4.5 KiB
Markdown
# zpdf - Generador PDF para Zig
|
|
|
|
> **Fecha creación**: 2025-12-08
|
|
> **Versión Zig**: 0.15.2
|
|
> **Estado**: En desarrollo inicial
|
|
|
|
## Descripción del Proyecto
|
|
|
|
Librería pura Zig para generación de documentos PDF. Sin dependencias externas, compila a un binario único.
|
|
|
|
**Filosofía**:
|
|
- Zero dependencias (100% Zig)
|
|
- API simple y directa
|
|
- Enfocado en generación de facturas/documentos comerciales
|
|
- Soporte para texto, tablas, imágenes y formas básicas
|
|
|
|
## Arquitectura
|
|
|
|
```
|
|
zpdf/
|
|
├── CLAUDE.md # Este archivo
|
|
├── build.zig # Sistema de build
|
|
├── src/
|
|
│ ├── root.zig # Exports públicos
|
|
│ ├── document.zig # Documento PDF principal
|
|
│ ├── page.zig # Páginas
|
|
│ ├── stream.zig # Content streams
|
|
│ ├── text.zig # Renderizado de texto
|
|
│ ├── graphics.zig # Líneas, rectángulos, etc.
|
|
│ ├── image.zig # Imágenes embebidas
|
|
│ ├── fonts.zig # Fuentes Type1 básicas
|
|
│ └── writer.zig # Serialización PDF
|
|
└── examples/
|
|
├── hello.zig # PDF mínimo
|
|
└── invoice.zig # Factura ejemplo
|
|
```
|
|
|
|
## Formato PDF
|
|
|
|
Usamos PDF 1.4 (compatible con todos los lectores). Estructura básica:
|
|
|
|
```
|
|
%PDF-1.4
|
|
1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj
|
|
2 0 obj << /Type /Pages /Kids [3 0 R] /Count 1 >> endobj
|
|
3 0 obj << /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R >> endobj
|
|
4 0 obj << /Length ... >> stream ... endstream endobj
|
|
xref
|
|
0 5
|
|
0000000000 65535 f
|
|
...
|
|
trailer << /Size 5 /Root 1 0 R >>
|
|
startxref
|
|
...
|
|
%%EOF
|
|
```
|
|
|
|
## API Objetivo
|
|
|
|
```zig
|
|
const std = @import("std");
|
|
const pdf = @import("zpdf");
|
|
|
|
pub fn main() !void {
|
|
var allocator = std.heap.page_allocator;
|
|
|
|
var doc = pdf.Document.init(allocator);
|
|
defer doc.deinit();
|
|
|
|
var page = try doc.addPage(.a4);
|
|
|
|
// Texto
|
|
try page.setFont(.helvetica_bold, 24);
|
|
try page.drawText(50, 750, "Factura #001");
|
|
|
|
try page.setFont(.helvetica, 12);
|
|
try page.drawText(50, 700, "Cliente: Empresa S.L.");
|
|
|
|
// Línea
|
|
try page.setLineWidth(0.5);
|
|
try page.drawLine(50, 690, 550, 690);
|
|
|
|
// Rectángulo
|
|
try page.setFillColor(.{ .r = 240, .g = 240, .b = 240 });
|
|
try page.fillRect(50, 600, 500, 20);
|
|
|
|
// Tabla (helper)
|
|
try page.drawTable(.{
|
|
.x = 50,
|
|
.y = 580,
|
|
.columns = &.{ 200, 100, 100, 100 },
|
|
.headers = &.{ "Descripción", "Cantidad", "Precio", "Total" },
|
|
.rows = &.{
|
|
&.{ "Producto A", "2", "10.00", "20.00" },
|
|
&.{ "Producto B", "1", "25.00", "25.00" },
|
|
},
|
|
});
|
|
|
|
// Guardar
|
|
try doc.save("factura.pdf");
|
|
}
|
|
```
|
|
|
|
## Funcionalidades Planificadas
|
|
|
|
### Fase 1 - Core (Actual)
|
|
- [ ] Estructura documento PDF 1.4
|
|
- [ ] Páginas (A4, Letter, custom)
|
|
- [ ] Texto básico (fuentes Type1 built-in)
|
|
- [ ] Líneas y rectángulos
|
|
- [ ] Serialización correcta
|
|
|
|
### Fase 2 - Texto Avanzado
|
|
- [ ] Múltiples fuentes en mismo documento
|
|
- [ ] Colores (RGB, CMYK, grayscale)
|
|
- [ ] Alineación (izquierda, centro, derecha)
|
|
- [ ] Word wrap automático
|
|
|
|
### Fase 3 - Imágenes
|
|
- [ ] JPEG embebido
|
|
- [ ] PNG embebido (con alpha)
|
|
- [ ] Escalado y posicionamiento
|
|
|
|
### Fase 4 - Utilidades
|
|
- [ ] Helper para tablas
|
|
- [ ] Numeración de páginas
|
|
- [ ] Headers/footers
|
|
|
|
## Fuentes Type1 Built-in
|
|
|
|
PDF incluye 14 fuentes estándar que no necesitan embeber:
|
|
- Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique
|
|
- Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic
|
|
- Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique
|
|
- Symbol, ZapfDingbats
|
|
|
|
## Tamaños de Página
|
|
|
|
```zig
|
|
pub const PageSize = enum {
|
|
a4, // 595 x 842 points (210 x 297 mm)
|
|
letter, // 612 x 792 points (8.5 x 11 inches)
|
|
legal, // 612 x 1008 points
|
|
a3, // 842 x 1191 points
|
|
a5, // 420 x 595 points
|
|
};
|
|
```
|
|
|
|
## Referencias
|
|
|
|
- [PDF Reference 1.4](https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/pdfreference1.4.pdf)
|
|
- [pdf-nano (Zig)](https://github.com/GregorBudweiser/pdf-nano) - Referencia minimalista
|
|
|
|
---
|
|
|
|
## Equipo y Metodología
|
|
|
|
### Normas de Trabajo
|
|
|
|
**IMPORTANTE**: Todas las normas de trabajo están en:
|
|
```
|
|
/mnt/cello2/arno/re/recode/TEAM_STANDARDS/
|
|
```
|
|
|
|
### Control de Versiones
|
|
|
|
```bash
|
|
# Remote
|
|
git remote: git@git.reugenio.com:reugenio/zpdf.git
|
|
|
|
# Branches
|
|
main # Código estable
|
|
develop # Desarrollo activo
|
|
```
|
|
|
|
### Zig Path
|
|
|
|
```bash
|
|
ZIG=/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2/zig
|
|
```
|
|
|
|
---
|
|
|
|
## Notas de Desarrollo
|
|
|
|
*Se irán añadiendo conforme avance el proyecto*
|