{"_id":"@bairon_ramirez/pdf-auto","_rev":"3-b990fdfdae8664fd0b633f2cbad8d443","name":"@bairon_ramirez/pdf-auto","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@bairon_ramirez/pdf-auto","version":"1.0.0","keywords":["pdf","pdfkit","pdfkit-table","typescript","azure","report"],"author":{"name":"Bairon Stiven Ramirez Marin"},"license":"MIT","_id":"@bairon_ramirez/pdf-auto@1.0.0","maintainers":[{"name":"bairon_ramirez","email":"Bairon.ramirez@visionymarketing.com.co"}],"dist":{"shasum":"a64a706c84734f626523397327ea7bb8cfb4490a","tarball":"https://registry.npmjs.org/@bairon_ramirez/pdf-auto/-/pdf-auto-1.0.0.tgz","fileCount":20,"integrity":"sha512-GcoyRV1l2BJp5Z0qy7VVR7xyJCO09W4RHpURv4zG74c7NhpnrTlgdQTaro4zUrGLotpVoWhldf43vUhA1fy2Qg==","signatures":[{"sig":"MEUCIAbCh8Sd1lvaNwHyckNIac7b4KivxfrGZN6n7RhODW7vAiEAgxqf20aY8F+SPcKNPQrSVKxlWw4I4a9/Hj45TPhJwls=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81751},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ca272488bc65f1b28fc1de42452fc59773f7681c","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rimraf dist && tsc","test1":"npx ts-node ./src/test/test1.ts","test2":"npx ts-node ./src/test/test2.ts","test3":"npx ts-node ./src/test/test3.ts","test4":"npx ts-node ./src/test/test4.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"bairon_ramirez","email":"Bairon.ramirez@visionymarketing.com.co"},"_npmVersion":"10.8.2","description":"Motor de maquetación de PDFs ultra-eficiente sobre PDFKit-Table y TypeScript","directories":{},"_nodeVersion":"20.19.4","dependencies":{"dotenv":"^17.4.2","pdfkit-table":"^0.2.11","@azure/storage-blob":"^12.31.0"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","ts-node":"^10.9.2","typescript":"^6.0.3","@types/node":"^25.9.1"},"_npmOperationalInternal":{"tmp":"tmp/pdf-auto_1.0.0_1779747540550_0.23739544532637114","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bairon_ramirez/pdf-auto","version":"1.0.1","keywords":["pdf","pdfkit","pdfkit-table","typescript","azure","report"],"author":{"name":"Bairon Stiven Ramirez Marin"},"license":"MIT","_id":"@bairon_ramirez/pdf-auto@1.0.1","maintainers":[{"name":"bairon_ramirez","email":"Bairon.ramirez@visionymarketing.com.co"}],"dist":{"shasum":"2ff222b4a45aeded615f5fef3175a2e76004b506","tarball":"https://registry.npmjs.org/@bairon_ramirez/pdf-auto/-/pdf-auto-1.0.1.tgz","fileCount":20,"integrity":"sha512-jMgfmxC1DS5HD64LhjoGCR4lcfam/qGH8MN5ONj5SocwH8yHXWhMfym63EF3TH4Il9I2Kb67Pr11rJMDQC0xXg==","signatures":[{"sig":"MEYCIQC27qsnr9wovtgjT2tGN4wxcw20+ULffF2c1CmV9po0GAIhAJF7HCVX7lq0tR13OURCLJiSUjZPt5e4Qg5BjJ12gjgQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81738},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c7fb14ddf05add46dad04e50a84c05f7e5d708fc","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rimraf dist && tsc","test1":"npx ts-node ./src/test/test1.ts","test2":"npx ts-node ./src/test/test2.ts","test3":"npx ts-node ./src/test/test3.ts","test4":"npx ts-node ./src/test/test4.ts","prepublishOnly":"npm run build"},"_npmUser":{"name":"bairon_ramirez","email":"Bairon.ramirez@visionymarketing.com.co"},"_npmVersion":"10.8.2","description":"Motor de maquetación de PDFs ultra-eficiente sobre PDFKit-Table y TypeScript","directories":{},"_nodeVersion":"20.19.4","dependencies":{"dotenv":"^17.4.2","pdfkit-table":"^0.2.11","@azure/storage-blob":"^12.31.0"},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.1.3","ts-node":"^10.9.2","typescript":"^6.0.3","@types/node":"^25.9.1"},"_npmOperationalInternal":{"tmp":"tmp/pdf-auto_1.0.1_1779799198889_0.5410026332386177","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bairon_ramirez/pdf-auto","version":"1.0.2","description":"Motor de maquetación de PDFs ultra-eficiente sobre PDFKit-Table y TypeScript","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"test":"echo \"Error: no test specified\" && exit 1","test1":"npx ts-node ./src/test/test1.ts","test2":"npx ts-node ./src/test/test2.ts","test3":"npx ts-node ./src/test/test3.ts","test4":"npx ts-node ./src/test/test4.ts","build":"rimraf dist && tsc","prepublishOnly":"npm run build"},"keywords":["pdf","pdfkit","pdfkit-table","typescript","azure","report"],"author":{"name":"Bairon Stiven Ramirez Marin"},"license":"MIT","devDependencies":{"@types/node":"^25.9.1","rimraf":"^6.1.3","ts-node":"^10.9.2","typescript":"^6.0.3"},"dependencies":{"@azure/storage-blob":"^12.31.0","dotenv":"^17.4.2","pdfkit-table":"^0.2.11"},"_id":"@bairon_ramirez/pdf-auto@1.0.2","gitHead":"75deb904838bbfe747771faa06e7eb7611434d9b","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-stdn6WpVdES7j+ed58G/Gny1WesOWHrxgt4OtxIll5czq4HyUe90d472HqSWAxZmrRnDsukoLR/U0Ma+mRqJFQ==","shasum":"8fa9d3dff12c767ed96e5b0ce823cd13408a806a","tarball":"https://registry.npmjs.org/@bairon_ramirez/pdf-auto/-/pdf-auto-1.0.2.tgz","fileCount":20,"unpackedSize":81895,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCCFnlc9/tC9/L3el4nu+6aAn7yrYTe1aXmK5rxJCCGfAIgUKXz9HEyl1KSVMF+hFoH4WsrjXZqc2Tj26O3H/2SHX4="}]},"_npmUser":{"name":"bairon_ramirez","email":"Bairon.ramirez@visionymarketing.com.co"},"directories":{},"maintainers":[{"name":"bairon_ramirez","email":"Bairon.ramirez@visionymarketing.com.co"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pdf-auto_1.0.2_1779809876275_0.969680821490023"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T22:19:00.369Z","modified":"2026-05-26T15:37:56.547Z","1.0.0":"2026-05-25T22:19:00.688Z","1.0.1":"2026-05-26T12:39:59.040Z","1.0.2":"2026-05-26T15:37:56.424Z"},"author":{"name":"Bairon Stiven Ramirez Marin"},"license":"MIT","keywords":["pdf","pdfkit","pdfkit-table","typescript","azure","report"],"description":"Motor de maquetación de PDFs ultra-eficiente sobre PDFKit-Table y TypeScript","maintainers":[{"name":"bairon_ramirez","email":"Bairon.ramirez@visionymarketing.com.co"}],"readme":"# PDFAuto 🚀\r\n\r\nUn motor de maquetación de PDFs ultra-eficiente y agnóstico construido sobre **PDFKit-Table** y **TypeScript**. Diseñado específicamente para sistemas que requieren alta disponibilidad, bajo consumo de memoria RAM y flujos automatizados que interactúan con almacenamiento local, remoto o proveedores de nube como Azure.\r\n\r\n## ✨ Características Principales\r\n\r\n* **Low-Memory Optimization:** Procesa flujos de imágenes (`URLs` o paths locales) convirtiéndolos inmediatamente en `Buffers` binarios puros, evitando la sobrecarga de strings en Base64.\r\n* **Caché Volátil Integrada:** Cuenta con una caché por instancia para evitar lecturas repetidas en disco duro o descargas redundantes mediante peticiones HTTPS simultáneas.\r\n* **Tablas Inteligentes:** Distribución de columnas mediante píxeles o porcentajes exactos (`width: '20%'`), con centrado matemático perfecto de imágenes internas e inmunidad ante pre-renderizados erráticos de grilla.\r\n* **Grid de Filas Fluido (`addGridRow`):** Permite construir estructuras tipo bloque/ficha técnica con bordes controlados y fondos de color.\r\n* **Columnas Dinámicas (`addColumn`):** Soporta maquetaciones automáticas de texto de 1 a N columnas con diseños paralelos (`inline`) o en bloque (`stacked`).\r\n* **Logotipos Flexibles (`addLogo`):** Manejo de escalas estándar (`small`, `medium`, `large`) o dimensiones explícitas con posicionamiento por coordenadas fijas.\r\n* **Firmas de Auditoría Avanzadas (`addSignatures`):** Sistema multi-firma (horizontal o vertical) con líneas divisorias simétricas y bloques laterales flotantes para estampar metadatos de seguridad (IPs, correos, timestamps, hashes).\r\n* **Estrategia de Salida Dual:** Retorna un `Buffer` para consumo directo en memoria o se integra nativamente vía streams a proveedores como Azure Blob Storage.\r\n\r\n---\r\n\r\n## 📦 Requisitos e Instalación\r\n\r\nAsegúrate de contar con las siguientes dependencias instaladas en tu proyecto de Node.js:\r\n\r\n```bash\r\nnpm install pdfkit-table\r\nnpm install -D typescript @types/node\r\n\r\n```\r\n\r\n## 🛠️ Arquitectura de Uso Rápido\r\n\r\n### 1. Inicialización Base\r\n\r\n```typescript\r\nimport { PDFAuto } from './core/pdf-auto';\r\n\r\nconst pdf = new PDFAuto({\r\n  size: 'A4',\r\n  margin: 40,\r\n  colors: {\r\n    primary: '#1E3A8A',   // Color corporativo para Títulos, Cabeceras de Tabla y Labels\r\n    secondary: '#9CA3AF', // Color para líneas y bordes divisorios\r\n    text: '#1F2937'       // Color base del texto de lectura\r\n  }\r\n});\r\n\r\n```\r\n\r\n### 2. Insertar Encabezados y Logotipos\r\n\r\n```typescript\r\n// Coloca el logo de la empresa arriba a la derecha con escala pequeña\r\nawait pdf.addLogo('[https://tuservidor.com/assets/logo-empresa.png](https://tuservidor.com/assets/logo-empresa.png)', {\r\n  position: 'right',\r\n  size: 'small'\r\n});\r\n\r\npdf.addHeading('INVENTARIO INTERNO DE ACTIVOS TI', {\r\n  align: 'center',\r\n  fontSize: 22,\r\n  moveDown: 1\r\n});\r\n\r\n```\r\n\r\n### 3. Texto en Bloques de Columnas\r\n\r\n```typescript\r\n// Datos básicos organizados lado a lado de forma automática\r\npdf.addColumn([\r\n  { label: 'Sede', value: 'Cali Principal' },\r\n  { label: 'Área', value: 'Infraestructura' },\r\n  { label: 'Responsable', value: 'Ing. Alejandro Gómez' }\r\n], { layout: 'inline', fontSize: 10 });\r\n\r\n```\r\n\r\n### 4. Tablas Robustas con Imágenes Dinámicas\r\n\r\n```typescript\r\nawait pdf.addTable({\r\n  headers: [\r\n    { label: 'Vista previa', width: '25%' },\r\n    { label: 'Descripción del Elemento', width: '75%' }\r\n  ],\r\n  rows: [\r\n    [\r\n      { source: './assets/fotos/laptop.png', width: 40, height: 40 },\r\n      'Laptop ASUS ExpertBook Intel i7, 16GB RAM, 512GB SSD. Sello de seguridad intacto.'\r\n    ],\r\n    [\r\n      '[https://servidor-remoto.com/imagenes/periferico.png](https://servidor-remoto.com/imagenes/periferico.png)', // Usa tamaño por defecto de tabla\r\n      'Teclado Mecánico Corporativo USB-C.'\r\n    ]\r\n  ]\r\n});\r\n\r\n```\r\n\r\n### 5. Bloque de Firmas Estructuradas con Datos de Auditoría\r\n\r\n```typescript\r\nawait pdf.addSignatures([\r\n  {\r\n    source: '[https://tuservidor.com/firmas/firma_jefe.png](https://tuservidor.com/firmas/firma_jefe.png)',\r\n    userData: [\r\n      { text: 'Ing. Carlos Mendoza', isBold: true },\r\n      { text: 'Director de Infraestructura TI' }\r\n    ]\r\n  },\r\n  {\r\n    source: './assets/firmas/mi_firma.png',\r\n    userData: [\r\n      { text: 'Alejandro Gómez', isBold: true },\r\n      { text: 'Técnico de Soporte Asignado' }\r\n    ],\r\n    // Metadatos que se estamparán al lado derecho de esta firma\r\n    metadata: [\r\n      { label: 'IP Origen', value: '192.168.1.45' },\r\n      { label: 'Registro UTC', value: '25-May-2026 16:27 COT' }\r\n    ]\r\n  }\r\n], { layout: 'inline', spaceBefore: 2 });\r\n\r\n```\r\n\r\n### 6. Exportación del Archivo\r\n\r\n```typescript\r\n// Opción A: Obtener Buffer binario para enviar por HTTP, guardar en disco, etc.\r\nconst pdfBuffer = await pdf.toBuffer();\r\n\r\n// Opción B: Subir directamente a Azure Storage mediante Streams optimizados\r\nconst azureUrl = await pdf.toAzure(azureStorageProvider, 'reporte-activos-2026.pdf');\r\n\r\n```\r\n\r\n---\r\n\r\n## 🛠️ Métodos Disponibles\r\n\r\n| Método | Parámetros Clave | Propósito |\r\n| --- | --- | --- |\r\n| `addPage()` | Ninguno | Añade de forma limpia una nueva página restableciendo fuentes y pinceles. |\r\n| `addHeading()` | `text`, `options` (fontSize, color, align, moveDown) | Renderiza títulos con aislamiento de estado gráfico. |\r\n| `addText()` | `text` (soporta `<br>`), `options` (isBold, size, align) | Inserta texto multi-línea fluido sin alterar configuraciones globales. |\r\n| `addImage()` | `source`, `options` (width, height, align, x, y) | Dibuja una imagen en el cursor actual o en coordenadas absolutas. |\r\n| `addTable()` | `tableData` (headers, rows, options) | Genera grillas complejas adaptando anchos dinámicos e imágenes en celdas. |\r\n| `addGridRow()` | `cells`, `options` (height, spaceAfter) | Diseña registros horizontales con fondos de color personalizados. |\r\n| `addColumn()` | `columns`, `options` (layout: 'inline'/'stacked', colors) | Distribuye textos de tipo clave-valor equitativamente en el ancho de página. |\r\n| `addLogo()` | `source`, `options` (size: s/m/l, position: l/c/r o {x,y}) | Sitúa isotipos y logos empresariales de forma inteligente. |\r\n| `addSignatures()` | `signatures`, `options` (layout: inline/stacked, metadataOptions) | Estampa bloques formales de firma con trazado de línea y datos de auditoría. |\r\n| `toBuffer()` | Ninguno | Procesa el flujo del documento y retorna un `Promise<Buffer>` optimizado en memoria. |\r\n| `toAzure()` | `provider`, `blobName` | Transmite el PDF directamente a un contenedor de Azure Blob Storage mediante streams. |\r\n\r\n## 📝 Licencia\r\n\r\nEste proyecto es de uso privado e interno para la automatización y optimización de documentos digitales.\r\n\r\n```\r\n\r\n```","readmeFilename":"README.md"}