Mejores prácticas para leer PDFs en Laravel
〜¿Cómo deberíamos combinar pdftotext, OCR y la IA generativa?〜
1. Conclusión primero: la mejor práctica de “tres capas”
Si priorizas la precisión,
la mejor práctica para leer PDFs en Laravel puede resumirse en tres capas:
-
Determinar el tipo de PDF
- ¿Es un PDF con texto incrustado?
- ¿Un PDF escaneado (sin texto seleccionable)?
- ¿O un híbrido donde conviven ambos?
-
Separar la capa de extracción
- PDFs con texto → extraer con herramientas tipo
pdftotext(p. ej.,spatie/pdf-to-text) - PDFs escaneados → OCR (p. ej., Tesseract + wrapper en PHP / LaraOCR, o servicios cloud OCR)
- PDFs con texto → extraer con herramientas tipo
-
Usar IA generativa para estructurar, resumir y extraer campos
- Pasar el texto extraído a un LLM para interpretarlo y estructurarlo
- Cosas como “extraer campos de una factura,” “extraer historial de trabajo de un CV,” o “resumir” se hacen aquí
La idea clave es:
“Leer caracteres” = pdftotext / OCR
“Entender y organizar el significado” = IA generativa
Haz explícita esta separación.
Si mezclas todo en una sola capa:
- Procesamiento lento
- Coste alto
- Más “alucinaciones” de la IA — respuestas plausibles pero incorrectas
…lo cual reduce la precisión.
A continuación veremos las fortalezas relativas de cada enfoque
y cómo combinarlos de manera concreta en Laravel.
2. Por qué leer PDFs es difícil y cómo distinguir los “tipos”
2-1. Dos tipos principales de PDF
Aunque se vean iguales en pantalla, internamente pueden ser muy distintos:
-
PDFs con texto incrustado (digitales)
- Generados desde sistemas web, Word/Excel, LaTeX, etc.
- El texto está incrustado como “objetos de texto”
- Puedes seleccionar y copiar texto
-
PDFs imagen (PDFs escaneados)
- Creado escaneando papel y agrupando imágenes
- Internamente son solo imágenes: no hay texto incrustado
- No puedes seleccionar texto
También hay muchos PDF híbridos, por ejemplo:
- Solo la portada es una imagen
- Las páginas interiores son PDF de texto
2-2. Primero agrega una verificación “¿es texto o no?”
En Laravel, un flujo robusto sería:
- El usuario sube un PDF
- Intentar extraer texto con
spatie/pdf-to-text - Juzgar según la cantidad de texto extraído
- Si hay suficiente → “PDF de texto”
- Si casi no hay → “PDF escaneado” → OCR
use Spatie\PdfToText\Pdf;
$text = Pdf::getText(storage_path('app/'.$path));
if (mb_strlen(trim($text)) < 50) {
// Muy pocos caracteres → probablemente escaneado
} else {
// Tratar como PDF de texto
}
spatie/pdf-to-text usa internamente pdftotext,
y es un estándar de facto para extraer texto en Laravel.
3. Enfoque ①: pdftotext (para PDFs con texto)
3-1. Cómo funciona y uso típico en Laravel
pdftotext es una herramienta CLI incluida en Poppler.
Lee los objetos de texto de un PDF y produce texto plano.
En Laravel, el paquete estándar es:
spatie/pdf-to-text- Wrapper simple de
pdftotext - Muy común en tutoriales de Laravel
- Wrapper simple de
3-2. Ventajas
1. Precisión casi del 100% en PDFs de texto
- Lee texto incrustado directamente → prácticamente sin errores.
- A diferencia del OCR, no “adivina” caracteres.
2. Rápido y barato
- Procesamiento liviano
- Ideal para grandes volúmenes
- Sin costes de API
3. Privacidad fuerte (on-premise)
No hay necesidad de enviar datos fuera.
3-3. Desventajas
- Devuelve muy poco o nada para PDFs escaneados
- Se pierde el layout fácilmente (tablas, columnas)
En resumen:
Es “rápido y preciso” para PDFs de texto,
pero no preserva estructura.
4. Enfoque ②: OCR (para PDFs escaneados)
4-1. OCR vs extracción de texto
- Extracción de texto: lee textos incrustados
- OCR: interpreta caracteres desde una imagen
4-2. Motores OCR usados con Laravel
1. Tesseract OCR
- Open source
- Soporta muchos idiomas
- Wrappers PHP:
thiagoalessio/tesseract_ocrLaraOCR
2. Paquetes Laravel “todo en uno”
NilGems/laravel-textract(pdftotext + Tesseract)laravelsmartocr/laravel-smart-ocr(OCR + AI + templates)
4-3. Ventajas del OCR
- Puede leer PDFs escaneados y fotos
- Puede preservar parcialmente el layout
- Indispensable para contratos escaneados, recibos, etc.
4-4. Desventajas
- Nunca es 100% perfecto
- Lento y pesado
- No entiende “significado”, solo transcribe
Por eso se combina con IA o IDP (Textract, Document AI, Form Recognizer).
5. Enfoque ③: ¿Dónde encaja la IA generativa?
5-1. Separación clara de roles
OCR = convertir imágenes en texto
IA (LLM) = entender y estructurar significado
OCR produce cadenas crudas;
el LLM decide:
- Qué campo es cada dato
- Estructura de factura, CV, contrato, etc.
5-2. Fortalezas de la IA generativa
- Robusta ante errores del OCR
- Excelente para estructurar datos (facturas, CVs, resúmenes)
- Funciona bien con documentos no estructurados
5-3. Debilidades
- Alucinaciones → necesita restricciones y validación
- Costes altos si le envías PDFs enteros
- No debe usarse como “fuente primaria” de extracción
Por eso:
Extracción = pdftotext / OCR
Comprensión = LLM
6. Arquitectura recomendada en Laravel
6-1. Arquitectura general
- Subida y metadatos
- Jobs de extracción
- Detección de tipo
- Extracción con pdftotext o OCR
- Job de IA para estructurar
- UI de revisión humana
6-2. Uso de pdftotext
apt install poppler-utils
composer require spatie/pdf-to-text
$text = Pdf::getText($pdfPath);
6-3. Uso de OCR (Tesseract)
apt install tesseract-ocr tesseract-ocr-jpn
composer require thiagoalessio/tesseract_ocr
$text = (new TesseractOCR($imgPath))
->lang('jpn', 'eng')
->psm(3)
->run();
6-4. Estructuración con IA (ejemplo: factura)
$prompt = <<<EOT
Eres un asistente para extraer datos de facturas.
...
=== TEXTO ===
{$plainText}
EOT;
Notas como “no inventar datos” reducen alucinaciones.
7. Combinaciones recomendadas por caso de uso
7-1. CVs y etiquetado automático
- Extracción: pdftotext
- IA: extraer historial, skills, etc.
- Búsqueda: Elasticsearch / Meilisearch
7-2. Facturas, presupuestos, recibos
- Extracción: pdftotext u OCR según tipo
- IA: estructuración
- Campos críticos → revisión humana o reglas
Considerar IDP si se requiere máxima precisión.
7-3. Contratos, reportes, políticas
- Extracción: pdftotext
- IA: resumen, clasificación, extracción de riesgos
8. Consejos operativos para maximizar precisión
- Guardar PDF original → texto extraído → datos estructurados
- Validación automática de OCR
- Limitar la entrada al LLM
- Mantener la idea: IA = estructuración, no extracción básica
9. Resumen
- Tres capas es la mejor práctica
- pdftotext para PDFs de texto
- OCR para PDFs escaneados
- LLM para entender y estructurar
- Validación + separación de capas = más precisión y menos costes
Con este diseño evitarás cuellos de botella y falta de precisión
al implementar lectura de PDFs en tu aplicación Laravel.
Enlaces de referencia (Inglés / Japonés)
- spatie/pdf-to-text – extracción de texto con pdftotext
- Uso de pdftotext en Laravel (japonés)
- Tutorial: PDF → texto con Laravel 12
- LaraOCR – wrapper de Tesseract para Laravel
- thiagoalessio/tesseract_ocr – wrapper PHP
- NilGems/laravel-textract
- Descripción de Tesseract y uso desde PHP (japonés)
- Diferencias entre extracción de datos, OCR e IDP
- Extracción de datos en 2025: LLMs vs OCR
