php elephant sticker
Photo by RealToughCandy.com on Pexels.com

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:

  1. Determinar el tipo de PDF

    • ¿Es un PDF con texto incrustado?
    • ¿Un PDF escaneado (sin texto seleccionable)?
    • ¿O un híbrido donde conviven ambos?
  2. 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)
  3. 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:

  1. 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
  2. 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:

  1. El usuario sube un PDF
  2. Intentar extraer texto con spatie/pdf-to-text
  3. 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

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_ocr
    • LaraOCR

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

  1. Subida y metadatos
  2. Jobs de extracción
    • Detección de tipo
    • Extracción con pdftotext o OCR
  3. Job de IA para estructurar
  4. 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

  1. Guardar PDF original → texto extraído → datos estructurados
  2. Validación automática de OCR
  3. Limitar la entrada al LLM
  4. 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)

por greeden

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)