API de PDF (dte-sdk/pdf)
Las muestras impresas: el timbre PDF417 y el PDF según el manual del SII. Solo Node, porque las funciones por lote leen y escriben archivos. Para saber cómo producir y revisar las muestras, ver Muestras impresas.
import { parsePrintableDocuments, renderPrintedSample } from 'dte-sdk/pdf'Dependencias peer#
pdf-lib (^1.17.1) y bwip-js (^4.11.4) son dependencias peer opcionales. Instálalas en tu proyecto; el SDK las carga en el primer uso, no al importar. Sin ellas, las funciones de render lanzan DEPENDENCY_UNAVAILABLE. Una falla dentro de la biblioteca de PDF al dibujar es PDF_RENDER_FAILED.
npm install pdf-lib bwip-jsLas muestras impresas aún no han sido revisadas por el SII. Están probadas con datos sintéticos. Ver Estado.
Las funciones que leen o escriben archivos reciben un último parámetro load que existe solo para que los tests del propio SDK reemplacen node:fs; se omite de las firmas de abajo.
Lectura#
Convierte cualquier XML EnvioDTE, EnvioBOLETA, SetDTE o DTE suelto en documentos imprimibles, con cada TED copiado tal cual.
// Los documentos imprimibles de un XML: un sobre `EnvioDTE`, `EnvioDTEB`, `EnvioDTETraslado` o
// `EnvioBOLETA`, un `SetDTE` suelto o un `DTE` suelto (lo que trae `SignedDocument.xml`).
// Cualquier otra raíz devuelve lista vacía.
function parsePrintableDocuments(xml: string): readonly PrintableDocument[]| Tipo | Descripción |
|---|---|
PrintableAdjustment | DscRcgGlobal — Descuento o recargo global. |
PrintableDocument | Lo que la muestra impresa necesita de un documento, parseado de su XML. Los strings quedan vacíos y los números undefined cuando falta la etiqueta. |
PrintableIssuer | El emisor del documento impreso. |
PrintableItem | Detalle — Línea de detalle. |
PrintableParty | Una parte del documento impreso, tal como viene en el XML. |
PrintableReference | Referencia — Referencia a otro documento. |
PrintableTotals | Los totales que se imprimen; los ausentes quedan undefined. |
Campos de PrintableAdjustment
| Campo | Tipo | Descripción |
|---|---|---|
kind | 'D' | 'R' | TpoMov — D descuento o R recargo. |
valueType | '%' | '$' | TpoValor — % o $. |
value? | number | ValorDR — Valor en esa unidad. |
Campos de PrintableDocument
| Campo | Tipo | Descripción |
|---|---|---|
type | number | TipoDTE — Tipo de documento; TD del TED si falta en IdDoc; 0 si no está en ninguno. |
folio | string | Folio — Folio; F del TED como respaldo. |
issueDate | string | FchEmis — Fecha de emisión tal como viene (AAAA-MM-DD); FE del TED como respaldo. |
transferReason | number | null | IndTraslado — Tipo de traslado de una guía, null si falta. |
grossAmounts | boolean | MntBruto — Montos de las líneas con IVA incluido (1). |
issuer | PrintableIssuer | Emisor — El emisor, con su sucursal. |
receiver | PrintableParty | Receptor — El receptor. |
totals | PrintableTotals | Totales — Los cinco totales que se imprimen. |
globalAdjustments | readonly PrintableAdjustment[] | DscRcgGlobal — Descuentos y recargos globales. |
items | readonly PrintableItem[] | Detalle — Líneas de detalle. |
references | readonly PrintableReference[] | Referencia — Referencias a otros documentos. |
tedXml | string | TED — El trozo <TED>…</TED> del XML de entrada, textual; vacío si no hay. |
Campos de PrintableIssuer
| Campo | Tipo | Descripción |
|---|---|---|
rut | string | RUTEmisor / RUTRecep — RUT tal como viene. |
name | string | RznSoc (o RznSocEmisor) / RznSocRecep — Razón social. |
activity | string | GiroEmis / GiroRecep — Giro. |
address | string | DirOrigen / DirRecep — Dirección. |
commune | string | CmnaOrigen / CmnaRecep — Comuna. |
branch | string | Sucursal — Sucursal, vacía si no hay. |
Campos de PrintableItem
| Campo | Tipo | Descripción |
|---|---|---|
code | string | CdgItem/VlrCodigo — Código del ítem (el primero si hay varios). |
name | string | NmbItem — Nombre del ítem. |
quantity? | number | QtyItem — Cantidad. |
unit? | string | UnmdItem — Unidad de medida. |
unitPrice? | number | PrcItem — Precio unitario. |
amount? | number | MontoItem — Monto de la línea. |
discountAmount? | number | DescuentoMonto — Monto del descuento de la línea. |
discountPercent? | number | DescuentoPct — Porcentaje de descuento de la línea. |
Campos de PrintableParty
| Campo | Tipo | Descripción |
|---|---|---|
rut | string | RUTEmisor / RUTRecep — RUT tal como viene. |
name | string | RznSoc (o RznSocEmisor) / RznSocRecep — Razón social. |
activity | string | GiroEmis / GiroRecep — Giro. |
address | string | DirOrigen / DirRecep — Dirección. |
commune | string | CmnaOrigen / CmnaRecep — Comuna. |
Campos de PrintableReference
| Campo | Tipo | Descripción |
|---|---|---|
documentType | string | TpoDocRef — Tipo del documento referenciado, tal como viene (SET y códigos no DTE incluidos). |
folio | string | FolioRef — Folio referenciado. |
date | string | FchRef — Fecha referenciada. |
reason | string | RazonRef — Razón de la referencia. |
Campos de PrintableTotals
| Campo | Tipo | Descripción |
|---|---|---|
net? | number | MntNeto — Monto neto. |
exempt? | number | MntExe — Monto exento. |
vat? | number | IVA — IVA. |
vatRate? | number | TasaIVA — Tasa del IVA. |
total? | number | MntTotal — Monto total. |
Generación#
Un PDF de una página por documento, y el timbre PDF417 solo, como PNG. RenderPrintedSampleOptions agrega transferable a las opciones que comparten todas las muestras.
// El timbre PDF417 de un TED como PNG: nivel de corrección 5, los bytes del TED exactamente como
// se firmaron. El renderizador lo incrusta bajo los totales; quien arma su propia diagramación lo
// usa directo.
function renderTedBarcode(tedXml: string): Promise<Uint8Array>
// True cuando el documento impreso lleva copia cedible: 33, 34, 43 y 46 siempre; 52 solo cuando el
// traslado es venta (tipo 1 o 9, 1 si falta), porque el manual excluye los traslados que no son
// venta; nunca notas ni boletas.
function needsTransferableCopy(doc: PrintableDocument): boolean
// La muestra impresa de un documento como PDF de una página según el manual de muestras impresas
// del SII: emisor y recuadro rojo del tipo, fecha de emisión, receptor, tipo de traslado (guías),
// referencias, detalle, totales, el acuse de recibo y la marca `CEDIBLE` en una copia cedible, y
// el timbre PDF417 con sus leyendas.
function renderPrintedSample(
doc: PrintableDocument,
options?: RenderPrintedSampleOptions,
): Promise<Uint8Array>| Tipo | Descripción |
|---|---|
PrintedLogo | Un logo para la esquina superior izquierda de la muestra. |
PrintedSampleOptions | Opciones comunes a todas las muestras impresas. |
RenderPrintedSampleOptions | Opciones de renderPrintedSample. |
Campos de PrintedLogo
| Campo | Tipo | Descripción |
|---|---|---|
bytes | Uint8Array | Bytes PNG o JPEG. |
format | 'png' | 'jpeg' | Formato de la imagen. |
Campos de PrintedSampleOptions
| Campo | Tipo | Descripción |
|---|---|---|
siiOffice? | string | Oficina del SII bajo el recuadro; por defecto la oficina de la comuna del emisor (CmnaOrigen), según siiOfficeForCommune, o S.I.I. - SANTIAGO CENTRO si la tabla no tiene la comuna. |
resolution? | string | Línea de resolución bajo el timbre; por defecto Res. Ex. SII N° 0 del {año}. |
logo? | PrintedLogo | Logo arriba a la izquierda; uno que la librería no pueda incrustar se ignora. |
now? | () => Date | Reloj para el año de la resolución por defecto. |
Campos de RenderPrintedSampleOptions
| Campo | Tipo | Descripción |
|---|---|---|
siiOffice? | string | Oficina del SII bajo el recuadro; por defecto la oficina de la comuna del emisor (CmnaOrigen), según siiOfficeForCommune, o S.I.I. - SANTIAGO CENTRO si la tabla no tiene la comuna. |
resolution? | string | Línea de resolución bajo el timbre; por defecto Res. Ex. SII N° 0 del {año}. |
logo? | PrintedLogo | Logo arriba a la izquierda; uno que la librería no pueda incrustar se ignora. |
now? | () => Date | Reloj para el año de la resolución por defecto. |
transferable? | boolean | Dibujar la copia cedible (acuse de recibo y marca CEDIBLE) cuando el documento la admite; por defecto false. |
Oficinas del SII#
La tabla detrás del siiOffice por defecto: la oficina de cada comuna, con la leyenda que se imprime bajo el recuadro del tipo como clave. Ambas exportaciones son puras y no necesitan pdf-lib ni bwip-js.
import { SII_OFFICES, siiOfficeForCommune } from 'dte-sdk/pdf'
siiOfficeForCommune(' ÑUÑOA ') // 'S.I.I. - ÑUÑOA'
siiOfficeForCommune('Nunoa') // 'S.I.I. - ÑUÑOA'
siiOfficeForCommune('Atlantis') // null// La oficina del SII de cada comuna: 355 nombres de comuna en 40 oficinas, con todas las comunas
// oficiales. Las claves son la leyenda que se imprime bajo el recuadro del tipo (`S.I.I. - {oficina}`);
// los valores son las comunas que atiende esa oficina, en minúsculas, sin tildes y con un solo espacio.
const SII_OFFICES: Readonly<Record<string, readonly string[]>>
// La leyenda para una comuna (la `CmnaOrigen` del emisor), o null si la tabla no la tiene. Se
// ignoran mayúsculas, espacios alrededor y tildes.
function siiOfficeForCommune(commune: string): string | nullLas muestras impresas la usan cuando no se indica siiOffice: imprimen siiOfficeForCommune(issuer.commune), y S.I.I. - SANTIAGO CENTRO solo para una comuna que la tabla no tiene.
Lotes en memoria#
Genera todos los documentos de todos los sobres en memoria, en los sets de pruebas y de simulación. Las fallas se informan como datos y el lote continúa.
// Genera cada documento de cada envío, en memoria: una muestra por documento y, con
// `transferable`, una segunda por cada documento que admite copia cedible.
function renderPrintedSamples(input: PrintedSamplesInput): Promise<PrintedSamplesResult>| Tipo | Descripción |
|---|---|
PrintedEnvelope | Un envío a imprimir: un nombre (el del archivo, la clave del artefacto) y su XML. |
PrintedSample | Una muestra generada. |
PrintedSampleFailure | Un envío o documento que no se pudo generar. |
PrintedSampleFile | Un archivo de muestra como lo sube la certificación: su nombre base y sus bytes. |
PrintedSampleSet | Los dos conjuntos de muestras impresas que pide la certificación. Definido como 'tests' | 'simulation'. |
PrintedSamplesInput | Entrada de renderPrintedSamples. |
PrintedSamplesResult | Resultado de renderPrintedSamples. |
Campos de PrintedEnvelope
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Nombre; decide el conjunto. |
xml | string | El XML del envío. |
Campos de PrintedSample
| Campo | Tipo | Descripción |
|---|---|---|
name | string | muestra_{tipo}_{folio}.pdf, con _cedible antes de la extensión en una copia cedible. |
set | PrintedSampleSet | El conjunto al que pertenece la muestra. |
source | string | El nombre del envío. |
type | number | TipoDTE — Tipo de documento. |
folio | string | Folio — Folio. |
transferable | boolean | True en la copia cedible. |
bytes | Uint8Array | Los bytes del PDF. |
Campos de PrintedSampleFailure
| Campo | Tipo | Descripción |
|---|---|---|
source | string | El nombre del envío. |
type? | number | Ausente cuando el envío mismo no se pudo parsear. |
folio? | string | Folio — Folio del documento que falló. |
transferable? | boolean | True cuando falló la copia cedible. |
code? | DteErrorCode | El código del DteError, cuando lo fue. |
reason | string | El mensaje del error. |
Campos de PrintedSampleFile
| Campo | Tipo | Descripción |
|---|---|---|
fileName | string | El nombre de archivo, [A-Za-z0-9_.-]+.pdf. |
bytes | Uint8Array | Los bytes del PDF. |
Campos de PrintedSamplesInput
| Campo | Tipo | Descripción |
|---|---|---|
envelopes | readonly PrintedEnvelope[] | Los envíos a generar, cada uno con su nombre. |
options? | PrintedSampleOptions | Opciones de generación compartidas por todas las muestras. |
transferable? | boolean | Producir además la copia cedible de cada documento que la admite; por defecto false. |
Campos de PrintedSamplesResult
| Campo | Tipo | Descripción |
|---|---|---|
success | boolean | True cuando nada falló. |
samples | readonly PrintedSample[] | Las muestras generadas. |
failures | readonly PrintedSampleFailure[] | Los envíos y documentos que fallaron. |
documents | number | Documentos parseados. |
tests | number | Muestras del conjunto de pruebas. |
simulation | number | Muestras del conjunto de simulación. |
Archivos#
El mismo lote sobre archivos: buscar los archivos de sobres, escribir los PDF bajo SET-PRUEBAS y SET-SIMULACION, y volver a leerlos para subirlos al portal de muestras (uploadPrintedSamples en dte-sdk/portal).
// Los archivos de envío bajo una ruta: el archivo mismo, o todo `.xml` bajo un directorio
// (recursivo) cuyo nombre contenga `envio-set-`, `envio-simulacion` o `envioboleta`, así se saltan
// las respuestas y los envíos de recibos del intercambio, que no traen DTE.
function findEnvelopeFiles(inputPath: string): Promise<readonly string[]>
// Todo `.pdf` bajo un directorio, recursivo, en orden de nombre en cada nivel, así la carpeta del
// set de pruebas (`SET-PRUEBAS`) va antes que la de la simulación (`SET-SIMULACION`) como las deja
// `writePrintedSamples`; cada uno con su nombre base y sus bytes, listos para el paso de muestras
// impresas.
function readPrintedSamples(dir: string): Promise<readonly PrintedSampleFile[]>
// Genera las muestras de cada archivo en `{outDir}/SET-PRUEBAS` y `{outDir}/SET-SIMULACION`, un
// PDF por muestra con su nombre de muestra.
function writePrintedSamples(input: WritePrintedSamplesInput): Promise<WritePrintedSamplesResult>| Tipo | Descripción |
|---|---|
WritePrintedSamplesInput | Entrada de writePrintedSamples. |
WritePrintedSamplesResult | Resultado de writePrintedSamples. |
WrittenPrintedSample | Una muestra escrita en disco. |
Campos de WritePrintedSamplesInput
| Campo | Tipo | Descripción |
|---|---|---|
xmlFiles | readonly string[] | Archivos XML de envíos. |
outDir | string | Directorio de salida; dentro se crean SET-PRUEBAS y SET-SIMULACION. |
options? | PrintedSampleOptions | Opciones de generación compartidas por todas las muestras. |
logoPath? | string | Archivo del logo, leído una vez; reemplaza options.logo. Un archivo que falta o una extensión distinta de png, jpg o jpeg significa sin logo. |
transferable? | boolean | Escribir también las copias cedibles; por defecto false. |
Campos de WritePrintedSamplesResult
| Campo | Tipo | Descripción |
|---|---|---|
documents | number | Documentos parseados. |
simulation | number | Muestras del conjunto de simulación. |
tests | number | Muestras del conjunto de pruebas. |
success | boolean | True cuando nada falló. |
failures | readonly PrintedSampleFailure[] | Los envíos y documentos que fallaron. |
samples | readonly WrittenPrintedSample[] | Las muestras escritas, con ruta y tamaño. |
Campos de WrittenPrintedSample
| Campo | Tipo | Descripción |
|---|---|---|
folio | string | Folio — Folio. |
type | number | TipoDTE — Tipo de documento. |
name | string | muestra_{tipo}_{folio}.pdf, con _cedible antes de la extensión en una copia cedible. |
set | PrintedSampleSet | El conjunto al que pertenece la muestra. |
source | string | El nombre del envío. |
transferable | boolean | True en la copia cedible. |
path | string | Ruta del PDF. |
size | number | Tamaño en bytes. |