@nodecfdi/cfdi-to-pdf
Create a generic PDF file from a CFDI 3.3, CFDI 4.0, Retenciones 1.0 and Retenciones 2.0
🇺🇸 The documentation of this project is in spanish as this is the natural language for intended audience.
🇲🇽 La documentación del proyecto está en español porque ese es el lenguaje principal de los usuarios.
@nodecfdi/cfdi-to-pdf
Acerca de En algunos casos necesitas generar un archivo PDF desde un CFDI (Comprobante fiscal Digital por Internet), o constancia de retenciones. Esta librería te ayuda a crear un pdf genérico. Además puedes crear un boceto a tu gusto y acomodarlo a como lo requieras. Inspirada por la versión de php https://github.com/phpcfdi/cfditopdf
Instalación
NPM
npm i @nodecfdi/cfdi-to-pdf --save
YARN
yarn add @nodecfdi/cfdi-to-pdf
PNPM
pnpm add @nodecfdi/cfdi-to-pdf
CDN - Browser
Usa la versión mas reciente publicada cambiando <latest-version>
por la última version. Ex. ...cfdi-to-pdf@1.6.0/dist...
<script src="https://unpkg.com/@nodecfdi/cfdi-to-pdf@<latest-version>/dist/cfdi-to-pdf.global.js"></script>
Uso básico
Ejemplo en nodejs usando xmldom para CFDI 3.3 y CFDI 4.0
import { installPdfMake, GenericCfdiTranslator, PdfMakerBuilder, CfdiData } from '@nodecfdi/cfdi-to-pdf';
import { XmlNodeUtils, install } from '@nodecfdi/cfdiutils-common';
import { DOMImplementation, XMLSerializer, DOMParser } from '@xmldom/xmldom';
import PdfPrinter from 'pdfmake';
import { join } from 'path';
import { readFileSync } from 'fs';
const inputCfdiPath = './cfdi40or33-real.xml';
const outputCfdiPath = './cfdi40or33-real.pdf';
// from version 1.2.x on @nodecfdi/cfdiutils-common required install dom resolution
install(new DOMParser(), new XMLSerializer(), new DOMImplementation());
// PDFMAKE on nodejs require font path not included on distributable files
installPdfMake(
new PdfPrinter({
Roboto: {
normal: join('.', 'fonts', 'Roboto-Regular.ttf'),
bold: join('.', 'fonts', 'Roboto-Medium.ttf'),
italics: join('.', 'fonts', 'Roboto-Italic.ttf'),
bolditalics: join('.', 'fonts', 'Roboto-MediumItalic.ttf')
}
})
);
const xml = readFileSync(inputCfdiPath).toString();
const comprobante = XmlNodeUtils.nodeFromXmlString(xml);
const cfdiData = new CfdiData(comprobante, null, null, 'mylogoBase64');
const builder = new PdfMakerBuilder(new GenericCfdiTranslator());
await builder.build(cfdiData, outputCfdiPath);
// Optional: You can pass catalogs class implements CatalogsInterface
// await builder.build(cfdiData, outputCfdiPath, catalogs);
Ejemplo en nodejs usando jsDom para CFDI 3.3 y CFDI 4.0
import { installPdfMake, GenericCfdiTranslator, PdfMakerBuilder, CfdiData } from '@nodecfdi/cfdi-to-pdf';
import { XmlNodeUtils, install } from '@nodecfdi/cfdiutils-common';
import { JSDOM } from 'jsdom';
import PdfPrinter from 'pdfmake';
import { join } from 'path';
import { readFileSync } from 'fs';
const inputCfdiPath = './cfdi40or33-real.xml';
const outputCfdiPath = './cfdi40or33-real.pdf';
const dom = new JSDOM();
const jsDOMParser = new dom.window.DOMParser();
const jsXMLSerializer = new dom.window.XMLSerializer();
const jsDOMImplementation = dom.window.document.implementation;
// from version 1.2.x on @nodecfdi/cfdiutils-common required install dom resolution
install(jsDOMParser, jsXMLSerializer, jsDOMImplementation);
// PDFMAKE on nodejs require font path not included on distributable files
installPdfMake(
new PdfPrinter({
Roboto: {
normal: join('.', 'fonts', 'Roboto-Regular.ttf'),
bold: join('.', 'fonts', 'Roboto-Medium.ttf'),
italics: join('.', 'fonts', 'Roboto-Italic.ttf'),
bolditalics: join('.', 'fonts', 'Roboto-MediumItalic.ttf')
}
})
);
const xml = readFileSync(inputCfdiPath).toString();
const comprobante = XmlNodeUtils.nodeFromXmlString(xml);
const cfdiData = new CfdiData(comprobante, null, null, 'mylogoBase64');
const builder = new PdfMakerBuilder(new GenericCfdiTranslator());
await builder.build(cfdiData, outputCfdiPath);
// Optional: You can pass catalogs class implements CatalogsInterface
// await builder.build(cfdiData, outputCfdiPath, catalogs);
Ejemplo en nodejs usando xmldom para RET 1.0 y RET 2.0
import { installPdfMake, GenericRetencionesTranslator, PdfMakerBuilder, RetencionesData } from '@nodecfdi/cfdi-to-pdf';
import { XmlNodeUtils, install } from '@nodecfdi/cfdiutils-common';
import { DOMImplementation, XMLSerializer, DOMParser } from '@xmldom/xmldom';
import PdfPrinter from 'pdfmake';
import { join } from 'path';
import { readFileSync } from 'fs';
const inputRetPath = './ret10or20-real.xml';
const outputRetPath = './ret10or20-real.pdf';
// from version 1.2.x on @nodecfdi/cfdiutils-common required install dom resolution
install(new DOMParser(), new XMLSerializer(), new DOMImplementation());
// PDFMAKE on nodejs require font path not included on distributable files
installPdfMake(
new PdfPrinter({
Roboto: {
normal: join('.', 'fonts', 'Roboto-Regular.ttf'),
bold: join('.', 'fonts', 'Roboto-Medium.ttf'),
italics: join('.', 'fonts', 'Roboto-Italic.ttf'),
bolditalics: join('.', 'fonts', 'Roboto-MediumItalic.ttf')
}
})
);
const xml = readFileSync(inputRetPath).toString();
const comprobante = XmlNodeUtils.nodeFromXmlString(xml);
const retencionesData = new RetencionesData(comprobante, null, null, 'mylogoBase64');
const builder = new PdfMakerBuilder(new GenericRetencionesTranslator());
await builder.build(retencionesData, outputRetPath);
// Optional: You can pass catalogs class implements CatalogsInterface
// await builder.build(retencionesData, outputRetPath, catalogs);
Ejemplo en nodejs usando jsDom para RET 1.0 y RET 2.0
import { installPdfMake, GenericRetencionesTranslator, PdfMakerBuilder, RetencionesData } from '@nodecfdi/cfdi-to-pdf';
import { XmlNodeUtils, install } from '@nodecfdi/cfdiutils-common';
import { JSDOM } from 'jsdom';
import PdfPrinter from 'pdfmake';
import { join } from 'path';
import { readFileSync } from 'fs';
const inputRetPath = './ret10or20-real.xml';
const outputRetPath = './ret10or20-real.pdf';
const dom = new JSDOM();
const jsDOMParser = new dom.window.DOMParser();
const jsXMLSerializer = new dom.window.XMLSerializer();
const jsDOMImplementation = dom.window.document.implementation;
// from version 1.2.x on @nodecfdi/cfdiutils-common required install dom resolution
install(jsDOMParser, jsXMLSerializer, jsDOMImplementation);
// PDFMAKE on nodejs require font path not included on distributable files
installPdfMake(
new PdfPrinter({
Roboto: {
normal: join('.', 'fonts', 'Roboto-Regular.ttf'),
bold: join('.', 'fonts', 'Roboto-Medium.ttf'),
italics: join('.', 'fonts', 'Roboto-Italic.ttf'),
bolditalics: join('.', 'fonts', 'Roboto-MediumItalic.ttf')
}
})
);
const xml = readFileSync(inputRetPath).toString();
const comprobante = XmlNodeUtils.nodeFromXmlString(xml);
const retencionesData = new RetencionesData(comprobante, null, null, 'mylogoBase64');
const builder = new PdfMakerBuilder(new GenericRetencionesTranslator());
await builder.build(retencionesData, outputRetPath);
// Optional: You can pass catalogs class implements CatalogsInterface
// await builder.build(retencionesData, outputRetPath, catalogs);
Puedes ver mas ejemplos en examples
Nota: Actualmente la librería requiere que según el tipo de projecto (Nodejs | browser) se le pase el pdfmake ejecutable, según la documentación de pdfmake y esto se puede ejecutando el instalador proporcionado por @nodecfdi/cfdi-to-pdf
.
Elementos soportados
Elementos base soportados:
Tipo | Soportado |
---|---|
CFDI3.3 | ✅ |
CFDI4.0 | ✅ |
RET1.0 | ✅ |
RET2.0 | ✅ |
Complementos:
Complemento | Soportado |
---|---|
PAGO1.0 | ✅ |
PAGO2.0 | ✅ |
IMPUESTOS LOCALES | ✅ |
PLATAFORMAS TECNOLÓGICAS | ✅ |
Patrocinadores
@nodecfdi/cfdi-to-pdf
es un projecto de licencia abierta MIT donde el continuo desarrollo es realizado por el apoyo de la comunidad y de los patrocinadores.
Soporte
Puedes obtener soporte abriendo un ticket en Github.
Adicionalmente, esta librería pertenece a la comunidad OcelotlStudio, así que puedes usar los mismos canales de comunicación para obtener ayuda de algún miembro de la comunidad.
Compatibilidad
Esta librería se mantendrá compatible con al menos la versión con soporte activo de Node más reciente.
También utilizamos Versionado Semántico 2.0.0 por lo que puedes usar esta librería sin temor a romper tu aplicación.
Contribuciones
Las contribuciones con bienvenidas. Por favor lee CONTRIBUTING para más detalles y recuerda revisar el archivo CHANGELOG.
Copyright and License
The @nodecfdi/cfdi-to-pdf
library is copyright © NodeCfdi - OcelotlStudio and licensed for use under the MIT License (MIT). Please see LICENSE for more information.