Search by

nextpyme / dian-rut-reader

@dimas462

Lee los datos del RUT de la DIAN (Formulario 001) desde el PDF original: NIT, DV, tipo de persona, razón social, ubicación DANE, contacto y representantes legales.

Package info

gitlab.com/nextpyme/dian-rut-reader

Issues

pkg:composer/nextpyme/dian-rut-reader

Statistics

Installs: 3

Dependents: 0

Suggesters: 0

Stars: 0

v1.0.0 2026-11-02 18:45 UTC

This package is not auto-updated.

Last update: 2026-11-03 21:59:58 UTC


README

Lee los datos del RUT de la DIAN (Formulario 001) desde el PDF original descargado del portal de la DIAN.

Extrae: NIT y DV, tipo de persona, razón social o nombres, nombre comercial, ubicación principal (con código DANE), dirección, correo, teléfono y los representantes legales (principal y suplentes).

  • PHP 8.1 o superior. Única dependencia: smalot/pdfparser.
  • Funciona en cualquier proyecto PHP. En Laravel se registra solo (package discovery).
  • No guarda nada ni consulta servicios externos: solo lee el PDF.

Instalación

composer require nextpyme/dian-rut-reader
composer require nextpyme/dian-rut-reader:^1.0

Uso

use Nextpyme\DianRut\RutReader;
use Nextpyme\DianRut\Exceptions\RutException;

try {
    $rut = (new RutReader)->fromFile('/ruta/al/rut.pdf');
} catch (RutException $e) {
    // El mensaje está escrito para mostrárselo al usuario
    echo $e->getMessage();
}

$rut->nit;                        // "900123456"
$rut->dv;                         // "8" (puede ser "0")
$rut->hasValidDv();               // true
$rut->personType;                 // PersonType::Juridical | PersonType::Natural
$rut->name();                     // Razón social, o "APELLIDOS NOMBRES" si es persona natural
$rut->tradeName;                  // Nombre comercial
$rut->address;
$rut->email;
$rut->phone;                      // Teléfono 1, o el 2 si el 1 no es válido
$rut->location->daneCode();       // "68276" → búsquelo en su tabla de municipios
$rut->location->municipalityName; // "Floridablanca"
$rut->primaryLegalRepresentative()?->identification;
$rut->legalRepresentatives;       // list<LegalRepresentative>, el principal primero
$rut->toArray();

En Laravel también puede inyectarlo:

public function store(Request $request, RutReader $reader)
{
    $rut = $reader->fromFile($request->file('rut')->getRealPath());
}

Dígito de verificación

use Nextpyme\DianRut\Dv;

Dv::calculate('800197268');      // 4
Dv::isValid('800197268', '4');   // true

Errores

Todas extienden RutException, que a su vez extiende \DomainException.

ExcepciónCuándo
EncryptedRutExceptionEl PDF tiene contraseña. Hay que quitársela antes.
UnreadableRutExceptionEl PDF no tiene texto: escaneado, foto o RUT "impreso a PDF" desde el navegador.
NotARutExceptionEl PDF se lee pero no es el Formulario 001 (por ejemplo, una declaración de IVA).
RutExceptionEl archivo no existe o no es un PDF válido.

Cómo funciona

En el PDF del RUT las etiquetas vienen en un solo bloque de texto, pero cada valor está siempre en la misma coordenada de la página. El paquete lee cada casilla por su posición. Todas las coordenadas están en src/Form001Layout.php: si la DIAN cambia el formulario, se ajustan ahí.

Detalles del PDF de la DIAN que el paquete ya resuelve:

  • El último dígito del código DANE del municipio y el del Teléfono 1 aparecen fuera de su casilla.
  • El Teléfono 2 pierde su último dígito: solo se usa si viene completo.
  • La fila del lugar de expedición del documento no se confunde con la ubicación principal.
  • En la hoja de representación (normalmente la página 3), cada representante es un bloque a 96 puntos del anterior. Se omiten los bloques incompletos y los representantes que son empresas (documento NIT).

Si ya tiene los textos con su posición (por ejemplo de getDataTm() de smalot/pdfparser), use RutReader::fromPositions($paginaPrincipal, $hojasDeRepresentacion).

Pruebas

composer install
composer test