Saltar al contenido
dte-sdk

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.

TypeScript
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.

Shell
npm install pdf-lib bwip-js

Las 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.

TypeScript
// 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[]
TipoDescripción
PrintableAdjustmentDscRcgGlobal — Descuento o recargo global.
PrintableDocumentLo 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.
PrintableIssuerEl emisor del documento impreso.
PrintableItemDetalle — Línea de detalle.
PrintablePartyUna parte del documento impreso, tal como viene en el XML.
PrintableReferenceReferencia — Referencia a otro documento.
PrintableTotalsLos totales que se imprimen; los ausentes quedan undefined.

Campos de PrintableAdjustment

CampoTipoDescripción
kind'D' | 'R'TpoMov — D descuento o R recargo.
valueType'%' | '$'TpoValor — % o $.
value?numberValorDR — Valor en esa unidad.

Campos de PrintableDocument

CampoTipoDescripción
typenumberTipoDTE — Tipo de documento; TD del TED si falta en IdDoc; 0 si no está en ninguno.
foliostringFolio — Folio; F del TED como respaldo.
issueDatestringFchEmis — Fecha de emisión tal como viene (AAAA-MM-DD); FE del TED como respaldo.
transferReasonnumber | nullIndTraslado — Tipo de traslado de una guía, null si falta.
grossAmountsbooleanMntBruto — Montos de las líneas con IVA incluido (1).
issuerPrintableIssuerEmisor — El emisor, con su sucursal.
receiverPrintablePartyReceptor — El receptor.
totalsPrintableTotalsTotales — Los cinco totales que se imprimen.
globalAdjustmentsreadonly PrintableAdjustment[]DscRcgGlobal — Descuentos y recargos globales.
itemsreadonly PrintableItem[]Detalle — Líneas de detalle.
referencesreadonly PrintableReference[]Referencia — Referencias a otros documentos.
tedXmlstringTED — El trozo <TED>…</TED> del XML de entrada, textual; vacío si no hay.

Campos de PrintableIssuer

CampoTipoDescripción
rutstringRUTEmisor / RUTRecep — RUT tal como viene.
namestringRznSoc (o RznSocEmisor) / RznSocRecep — Razón social.
activitystringGiroEmis / GiroRecep — Giro.
addressstringDirOrigen / DirRecep — Dirección.
communestringCmnaOrigen / CmnaRecep — Comuna.
branchstringSucursal — Sucursal, vacía si no hay.

Campos de PrintableItem

CampoTipoDescripción
codestringCdgItem/VlrCodigo — Código del ítem (el primero si hay varios).
namestringNmbItem — Nombre del ítem.
quantity?numberQtyItem — Cantidad.
unit?stringUnmdItem — Unidad de medida.
unitPrice?numberPrcItem — Precio unitario.
amount?numberMontoItem — Monto de la línea.
discountAmount?numberDescuentoMonto — Monto del descuento de la línea.
discountPercent?numberDescuentoPct — Porcentaje de descuento de la línea.

Campos de PrintableParty

CampoTipoDescripción
rutstringRUTEmisor / RUTRecep — RUT tal como viene.
namestringRznSoc (o RznSocEmisor) / RznSocRecep — Razón social.
activitystringGiroEmis / GiroRecep — Giro.
addressstringDirOrigen / DirRecep — Dirección.
communestringCmnaOrigen / CmnaRecep — Comuna.

Campos de PrintableReference

CampoTipoDescripción
documentTypestringTpoDocRef — Tipo del documento referenciado, tal como viene (SET y códigos no DTE incluidos).
foliostringFolioRef — Folio referenciado.
datestringFchRef — Fecha referenciada.
reasonstringRazonRef — Razón de la referencia.

Campos de PrintableTotals

CampoTipoDescripción
net?numberMntNeto — Monto neto.
exempt?numberMntExe — Monto exento.
vat?numberIVA — IVA.
vatRate?numberTasaIVA — Tasa del IVA.
total?numberMntTotal — 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.

TypeScript
// 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>
TipoDescripción
PrintedLogoUn logo para la esquina superior izquierda de la muestra.
PrintedSampleOptionsOpciones comunes a todas las muestras impresas.
RenderPrintedSampleOptionsOpciones de renderPrintedSample.

Campos de PrintedLogo

CampoTipoDescripción
bytesUint8ArrayBytes PNG o JPEG.
format'png' | 'jpeg'Formato de la imagen.

Campos de PrintedSampleOptions

CampoTipoDescripción
siiOffice?stringOficina 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?stringLínea de resolución bajo el timbre; por defecto Res. Ex. SII N° 0 del {año}.
logo?PrintedLogoLogo arriba a la izquierda; uno que la librería no pueda incrustar se ignora.
now?() => DateReloj para el año de la resolución por defecto.

Campos de RenderPrintedSampleOptions

CampoTipoDescripción
siiOffice?stringOficina 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?stringLínea de resolución bajo el timbre; por defecto Res. Ex. SII N° 0 del {año}.
logo?PrintedLogoLogo arriba a la izquierda; uno que la librería no pueda incrustar se ignora.
now?() => DateReloj para el año de la resolución por defecto.
transferable?booleanDibujar 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.

TypeScript
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
TypeScript
// 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 | null

Las 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.

TypeScript
// 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>
TipoDescripción
PrintedEnvelopeUn envío a imprimir: un nombre (el del archivo, la clave del artefacto) y su XML.
PrintedSampleUna muestra generada.
PrintedSampleFailureUn envío o documento que no se pudo generar.
PrintedSampleFileUn archivo de muestra como lo sube la certificación: su nombre base y sus bytes.
PrintedSampleSetLos dos conjuntos de muestras impresas que pide la certificación. Definido como 'tests' | 'simulation'.
PrintedSamplesInputEntrada de renderPrintedSamples.
PrintedSamplesResultResultado de renderPrintedSamples.

Campos de PrintedEnvelope

CampoTipoDescripción
namestringNombre; decide el conjunto.
xmlstringEl XML del envío.

Campos de PrintedSample

CampoTipoDescripción
namestringmuestra_{tipo}_{folio}.pdf, con _cedible antes de la extensión en una copia cedible.
setPrintedSampleSetEl conjunto al que pertenece la muestra.
sourcestringEl nombre del envío.
typenumberTipoDTE — Tipo de documento.
foliostringFolio — Folio.
transferablebooleanTrue en la copia cedible.
bytesUint8ArrayLos bytes del PDF.

Campos de PrintedSampleFailure

CampoTipoDescripción
sourcestringEl nombre del envío.
type?numberAusente cuando el envío mismo no se pudo parsear.
folio?stringFolio — Folio del documento que falló.
transferable?booleanTrue cuando falló la copia cedible.
code?DteErrorCodeEl código del DteError, cuando lo fue.
reasonstringEl mensaje del error.

Campos de PrintedSampleFile

CampoTipoDescripción
fileNamestringEl nombre de archivo, [A-Za-z0-9_.-]+.pdf.
bytesUint8ArrayLos bytes del PDF.

Campos de PrintedSamplesInput

CampoTipoDescripción
envelopesreadonly PrintedEnvelope[]Los envíos a generar, cada uno con su nombre.
options?PrintedSampleOptionsOpciones de generación compartidas por todas las muestras.
transferable?booleanProducir además la copia cedible de cada documento que la admite; por defecto false.

Campos de PrintedSamplesResult

CampoTipoDescripción
successbooleanTrue cuando nada falló.
samplesreadonly PrintedSample[]Las muestras generadas.
failuresreadonly PrintedSampleFailure[]Los envíos y documentos que fallaron.
documentsnumberDocumentos parseados.
testsnumberMuestras del conjunto de pruebas.
simulationnumberMuestras 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).

TypeScript
// 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>
TipoDescripción
WritePrintedSamplesInputEntrada de writePrintedSamples.
WritePrintedSamplesResultResultado de writePrintedSamples.
WrittenPrintedSampleUna muestra escrita en disco.

Campos de WritePrintedSamplesInput

CampoTipoDescripción
xmlFilesreadonly string[]Archivos XML de envíos.
outDirstringDirectorio de salida; dentro se crean SET-PRUEBAS y SET-SIMULACION.
options?PrintedSampleOptionsOpciones de generación compartidas por todas las muestras.
logoPath?stringArchivo 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?booleanEscribir también las copias cedibles; por defecto false.

Campos de WritePrintedSamplesResult

CampoTipoDescripción
documentsnumberDocumentos parseados.
simulationnumberMuestras del conjunto de simulación.
testsnumberMuestras del conjunto de pruebas.
successbooleanTrue cuando nada falló.
failuresreadonly PrintedSampleFailure[]Los envíos y documentos que fallaron.
samplesreadonly WrittenPrintedSample[]Las muestras escritas, con ruta y tamaño.

Campos de WrittenPrintedSample

CampoTipoDescripción
foliostringFolio — Folio.
typenumberTipoDTE — Tipo de documento.
namestringmuestra_{tipo}_{folio}.pdf, con _cedible antes de la extensión en una copia cedible.
setPrintedSampleSetEl conjunto al que pertenece la muestra.
sourcestringEl nombre del envío.
transferablebooleanTrue en la copia cedible.
pathstringRuta del PDF.
sizenumberTamaño en bytes.