nextpyme / dian-rut-reader
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.
Requires
- php: ^8.1
- smalot/pdfparser: ^2.12
Requires (Dev)
- phpunit/phpunit: ^10.5 || ^11.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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ón | Cuándo |
|---|---|
EncryptedRutException | El PDF tiene contraseña. Hay que quitársela antes. |
UnreadableRutException | El PDF no tiene texto: escaneado, foto o RUT "impreso a PDF" desde el navegador. |
NotARutException | El PDF se lee pero no es el Formulario 001 (por ejemplo, una declaración de IVA). |
RutException | El 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