@nodecfdi/cfdi-to-pdf
TypeScript icon, indicating that this package has built-in type declarations

1.6.0 • Public • Published

@nodecfdi/cfdi-to-pdf

Source Code XO code style Npm Node Version Support Discord Latest Version Software License Build Status Reliability Maintainability Code Coverage Violations Total Downloads

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.

Acerca de @nodecfdi/cfdi-to-pdf

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.

Infaster

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.

Readme

Keywords

Package Sidebar

Install

npm i @nodecfdi/cfdi-to-pdf

Weekly Downloads

65

Version

1.6.0

License

MIT

Unpacked Size

288 kB

Total Files

10

Last publish

Collaborators

  • luffynando
  • celli33