top of page

Serie N8N (XXI): Analizar documentos PDF con IA - extraer, resumir y clasificar información automáticamente

19 sept
20 min de lectura

Hasta ahora, en esta serie hemos trabajado principalmente con textos, mensajes, datos estructurados e imágenes generadas mediante inteligencia artificial. En este artículo vamos a incorporar un nuevo tipo de entrada: un documento PDF.


Los PDF aparecen constantemente en entornos profesionales: informes técnicos, contratos, documentaciones... El problema no suele ser únicamente abrir el archivo, sino localizar rápidamente la información importante que contiene. Querremos analizarlo y saber que tipo de documento es, que temas aorda, que información falta...


Para conseguirlo, construiremos un workflow capaz de leer un PDF almacenado en una carpeta local, extraer su texto y enviarlo a OpenAI para obtener un análisis estructurado.


Anuncio con portátil mostrando flujo PDF→OpenAI→Telegram, informes de análisis, pilas de documentos y logo LozKorp.
Analizar documentos PDF con IA en N8N

El resultado no será únicamente un resumen. La IA clasificará el documento, identificará sus temas principales, extraerá datos relevantes, señalará riesgos o ambigüedades y propondrá posibles acciones. Además, el análisis completo se convertirá en un archivo Markdown que quedará guardado automáticamente.


En este ejemplo utilizaremos un PDF con texto seleccionable. Los documentos escaneados necesitarían un paso adicional de reconocimiento óptico de caracteres, conocido como OCR, que dejaremos para una evolución posterior.


El aprendizaje principal de este artículo será comprender cómo transformar un archivo PDF en información estructurada y reutilizable dentro de N8N.


2. Objetivo del workflow

El objetivo de este artículo es construir un workflow capaz de analizar automáticamente un documento PDF y convertir su contenido en información estructurada.


El workflow realizará seis acciones principales:

Leer el PDF
↓
Extraer el texto
↓
Validar y preparar el contenido
↓
Analizarlo con IA
↓
Generar un informe
↓
Guardar y distribuir el resultado
Diagrama de flujo oscuro con nodos de automatización: leer PDF, extraer texto, analizar con OpenAI y enviar resumen por Telegram.
N8N Workflow para análisis de PDFs

Al finalizar la ejecución obtendremos:

Resultado

Descripción

Texto extraído

Contenido recuperado desde el PDF

Análisis estructurado

Clasificación, resumen, datos, riesgos y acciones

Informe Markdown

Archivo completo guardado en local

Resumen por Telegram

Versión breve con la información más relevante

La IA no devolverá una respuesta libre. Le pediremos una estructura concreta para que N8N pueda identificar y reutilizar cada parte del análisis. De esta forma, el resultado podrá utilizarse más adelante para crear documentos, registrar riesgos, alimentar bases de datos o activar otras automatizaciones.


3. Qué cambia respecto a los artículos anteriores

En los artículos anteriores, N8N trabajaba principalmente con datos ya preparados: textos, mensajes, campos configurados manualmente o instrucciones enviadas a un modelo. En este caso, la entrada principal es un archivo PDF.


El flujo cambia:

Antes:
Texto o configuración
↓
IA
↓
Resultado

Ahora:

Archivo PDF
↓
Extracción del contenido
↓
IA
↓
Información estructurada

La diferencia más importante es que el PDF no puede enviarse directamente al análisis como si fuera un texto convencional.


Primero debemos leerlo como archivo binario y después extraer su contenido.

PDF binario
↓
Texto extraído
↓
Análisis con IA

También cambia el tipo de respuesta que esperamos de OpenAI. En lugar de solicitar un texto libre, pediremos un objeto JSON con campos definidos:

  • Tipo de documento.

  • Finalidad.

  • Resumen ejecutivo.

  • Temas principales.

  • Datos relevantes.

  • Riesgos.

  • Acciones recomendadas.

  • Información ausente o ambigua.


Esto permite que N8N no solo muestre el resultado, sino que pueda reutilizar cada dato por separado.

Elemento

Artículos anteriores

Artículo XXI

Entrada principal

Texto o configuración

Archivo PDF

Archivo binario

Normalmente salida

Entrada

Transformación

Texto a texto o imagen

PDF a texto

Respuesta de IA

Texto libre

JSON estructurado

Resultado final

Mensaje o imagen

Informe documental

El nuevo aprendizaje consiste en transformar un documento no estructurado en datos preparados para otras automatizaciones.


4. Qué aprenderemos en este artículo

Este workflow introduce varias capacidades nuevas relacionadas con el tratamiento automático de documentos.

Los principales aprendizajes serán:

Nº

Qué aprenderemos

Aplicación práctica

1

Leer un PDF desde una carpeta local

Utilizar documentos como entrada del workflow

2

Trabajar con un archivo binario de entrada

Transportar el PDF entre nodos

3

Extraer texto desde un PDF

Convertir el documento en contenido procesable

4

Validar el texto extraído

Evitar analizar documentos vacíos o incompatibles

5

Limitar el tamaño del contenido

Controlar documentos demasiado largos

6

Solicitar una respuesta JSON a la IA

Obtener resultados predecibles y reutilizables

7

Normalizar la respuesta de OpenAI

Preparar datos consistentes para otros nodos

8

Generar un informe Markdown

Crear un archivo estructurado y legible

9

Crear un resumen breve para Telegram

Distribuir solo la información más importante

10

Controlar caracteres especiales

Evitar errores al enviar contenido dinámico

El objetivo no es simplemente “pedirle a una IA que resuma un PDF”, sino preparar el documento para que N8N pueda reutilizar cada parte del análisis de forma independiente. Eso será especialmente útil cuando más adelante queramos conectar este tipo de análisis con emails, bases de datos, sistemas de seguimiento o workflows más complejos.


5. Arquitectura del workflow

Antes de entrar nodo por nodo, conviene ver cómo se divide el proceso.

La estructura completa es:

Manual Trigger
↓
Edit Fields - Document Config
↓
Edit Fields - Prepare Paths
↓
Read Write Files - Read PDF
↓
Extract From File - Extract PDF Text
↓
Code - Prepare Document
↓
OpenAI - Analyse Document
↓
Code - Prepare Analysis
├─ Convert to File - Create Markdown Report
│  ↓
│  Read Write Files - Save Analysis
└─ Telegram - Send Summary

Podemos agrupar los nodos en seis bloques:

1. Configuración
2. Lectura del archivo
3. Extracción y preparación
4. Análisis con IA
5. Generación del informe
6. Distribución

La siguiente tabla resume la responsabilidad de cada nodo:

Nodo

Función principal

Manual Trigger

Iniciar el workflow

Document Config

Definir archivo, idioma, análisis y rutas

Prepare Paths

Construir nombres y rutas completas

Read PDF

Cargar el PDF como archivo binario

Extract PDF Text

Extraer el texto del documento

Prepare Document

Validar y limitar el contenido

Analyse Document

Generar el análisis estructurado

Prepare Analysis

Normalizar la respuesta y preparar las salidas

Create Markdown Report

Convertir el informe en archivo

Save Analysis

Guardar el archivo en local

Send Summary

Enviar el resumen por Telegram

La clave del workflow está en que cada etapa transforma el dato anterior en un formato más útil:

Archivo
↓
Texto
↓
Información estructurada
↓
Informe reutilizable

Esto facilita tanto la depuración como la adaptación del flujo a otros tipos de documentos o destinos.


6. Nodo 1 — Manual Trigger

El primer nodo del workflow es:

Manual Trigger

Su función es iniciar el análisis cuando nosotros lo decidamos desde el editor de N8N.


Interfaz oscura de flujo de trabajo con nodo Manual Trigger y botón naranja Execute step; texto explicativo.
Nodo Manual Trigger

Más adelante podríamos sustituir este disparador por otras entradas, como:

  • Un email con un archivo adjunto.

  • Un webhook.

  • Un archivo almacenado en la nube.

  • Una ejecución programada.

Por ahora, el inicio manual nos permite centrarnos en el procesamiento del documento sin añadir complejidad innecesaria.


7. Nodo 2 — Configuración del documento

El segundo nodo del workflow es:

Edit Fields - Document Config

Pantalla oscura de configuración n8n con campos de documento, botón Ejecutar paso y panel de salida con rutas y texto en español.
Nodo Edit Fields - Configuración del documento

Este nodo concentra los parámetros que podemos modificar sin tocar la lógica del resto del workflow.

Los campos definidos son:

Campo

Función

input_folder

Carpeta donde se encuentra el PDF

input_filename

Nombre del documento

output_folder

Carpeta donde se guardará el análisis

output_filename_prefix

Prefijo del archivo generado

analysis_language

Idioma de la respuesta

analysis_focus

Tipo de análisis solicitado

telegram_caption

Encabezado del mensaje de Telegram

max_document_characters

Límite máximo de caracteres analizados

7.1 Archivo de entrada

En nuestro ejemplo utilizamos:

input_folder:
/files/documents/

input_filename:
documento_a_analizar.pdf

La ruta completa se construirá en el siguiente nodo. Separar carpeta y nombre permite cambiar de documento sin modificar expresiones ni nodos posteriores.


7.2 Carpeta y nombre del informe

Para el resultado definimos:

output_folder:
/files/document-analysis/

output_filename_prefix:
analisis_documento

El nombre definitivo incorporará fecha y hora para evitar sobrescribir análisis anteriores.


7.3 Idioma y enfoque del análisis

El campo:

analysis_language

permite indicar en qué idioma queremos recibir el resultado.

En nuestro caso:

Spanish

Más importante todavía es:

analysis_focus

que define qué queremos obtener del documento.


En el workflow hemos configurado:

Resumen ejecutivo, finalidad del documento, temas principales, datos relevantes, riesgos, inconsistencias, información ausente o ambigua y acciones recomendadas.

Este campo convierte el workflow en una base reutilizable. Si analizamos otro tipo de documento, podemos cambiar el enfoque sin modificar el prompt completo.


7.4 Límite de caracteres

El campo:

max_document_characters

está configurado en:

60000

Su función es evitar enviar documentos excesivamente largos al modelo en una sola petición. Más adelante veremos cómo el workflow compara la longitud real del texto con este límite y registra si el contenido ha tenido que ser recortado. Centralizar todos estos valores en un único nodo hace que adaptar el workflow sea mucho más sencillo y reduce el riesgo de modificar accidentalmente su lógica interna.


8. Nodo 3 — Preparar rutas y nombres

El siguiente nodo es:

Edit Fields - Prepare Paths

Su función es transformar la configuración anterior en rutas y nombres completos que utilizarán los siguientes nodos.


Captura de n8n con flujo Manual Trigger > Edit Fields - Document Config > Prepare Paths y panel OUTPUT con rutas y campos en español.
Nodo Edit Fields - Preparar rutas y nombres

Los campos principales que genera son:

Campo

Función

input_file_path

Ruta completa del PDF

output_filename

Nombre del informe Markdown

output_file_path

Ruta completa del archivo de salida

8.1 Ruta del PDF

La ruta de entrada se construye uniendo:

input_folder
+
input_filename

mediante esta expresión:

{{ $json.input_folder + $json.input_filename }}

El resultado será:

/files/documents/documento_a_analizar.pdf

Esta será la ruta que utilizará N8N para localizar el archivo.


8.2 Nombre del informe

El nombre del archivo de salida se genera automáticamente con:

{{
  $json.output_filename_prefix
  + '_'
  + $now.toFormat('yyyyLLdd_HHmmss')
  + '.md'
}}

Por ejemplo:

analisis_documento_20260712_133953.md

Añadir fecha y hora evita que una nueva ejecución sobrescriba el informe anterior.


8.3 Ruta completa de salida

La ruta final combina la carpeta configurada y el nombre dinámico:

{{
  $json.output_folder
  + $json.output_filename_prefix
  + '_'
  + $now.toFormat('yyyyLLdd_HHmmss')
  + '.md'
}}

El resultado será:

/files/document-analysis/analisis_documento_20260712_133953.md

Además, este nodo conserva el resto de parámetros necesarios para el análisis, como el idioma, el enfoque, el caption de Telegram y el límite de caracteres.


Con las rutas ya preparadas, el workflow puede empezar a trabajar con el archivo real.


9. Nodo 4 — Leer el PDF como archivo binario

El siguiente nodo es:

Read Write Files - Read PDF

Captura de n8n en tema oscuro con el nodo Read Write Files - Read PDF y un PDF documento_a_analizar.pdf seleccionado.
Nodo Read Write Files - Leer PDF

Su función es localizar el archivo en la ruta preparada anteriormente y cargarlo dentro del workflow.

La expresión utilizada es:

{{ $json.input_file_path }}

Por ejemplo:

/files/documents/documento_a_analizar.pdf

En este punto, N8N todavía no entiende el contenido del documento. Simplemente ha leído el archivo y lo mantiene como dato binario.

Podemos representarlo así:

Archivo en disco
↓
Read Write Files
↓
PDF binario dentro del workflow

Este paso es importante porque separa dos operaciones distintas:

Leer el archivo
≠
Extraer su contenido

El nodo actual se ocupa únicamente de la primera. En los artículos anteriores utilizamos datos binarios como resultado, por ejemplo al generar una imagen. Aquí ocurre lo contrario: el archivo binario es el punto de partida del análisis.


Una vez cargado el PDF, ya podemos pasarlo al nodo encargado de extraer el texto.


10. Nodo 5 — Extraer el texto del PDF

Una vez cargado el archivo, el siguiente nodo es:

Extract From File - Extract PDF Text

Su función es convertir el PDF binario en contenido que N8N pueda procesar como texto.

El cambio es:

PDF binario
↓
Extract From File
↓
Texto extraído

Este paso es imprescindible porque OpenAI necesita recibir el contenido del documento, no simplemente el archivo almacenado en memoria.

En nuestro workflow utilizamos la operación:

PDF

El nodo intenta recuperar el texto incluido dentro del documento y lo devuelve en una estructura JSON.


Interfaz oscura de flujo de trabajo con PDF: nodo Read PDF y Extract PDF Text, panel de parámetros y salida con datos.
Nodo Extract from file - Extraer texto

10.1 PDF con texto seleccionable

Este workflow está pensado para documentos que contengan texto real. Es decir, PDFs donde podemos seleccionar y copiar el contenido con el ratón.

Ejemplos habituales:

  • Informes exportados desde Word.

  • Especificaciones técnicas.

  • Contratos digitales.

  • Presentaciones convertidas a PDF.

  • Documentos generados desde aplicaciones empresariales.

En estos casos, la extracción suele funcionar directamente.


10.2 Qué ocurre con un PDF escaneado

Un PDF escaneado puede contener únicamente imágenes de las páginas. Visualmente vemos texto, pero internamente no existe como caracteres.

En ese caso:

Página escaneada
↓
Imagen
↓
No hay texto que extraer

Para procesarlo sería necesario incorporar OCR antes del análisis. Ese escenario queda fuera del alcance de este workflow y lo podremos tratar como una mejora posterior.


10.3 La estructura del documento puede cambiar

La extracción recupera el contenido textual, pero no garantiza conservar exactamente la maquetación original.

Por ejemplo:

  • Las columnas pueden mezclarse.

  • Una tabla puede convertirse en líneas de texto.

  • Los encabezados y pies pueden aparecer intercalados.

  • Los gráficos pueden perder su contexto visual.


Nuestro objetivo en este artículo no es reconstruir el PDF, sino obtener suficiente contenido textual para realizar un análisis documental. En el siguiente nodo comprobaremos precisamente que la extracción haya producido información válida antes de enviarla a la IA.


11. Nodo 6 — Preparar y validar el documento

El siguiente nodo es:

Code - Prepare Document
Interfaz oscura de edición de código con paneles Input y Output; se ve el nodo Code - Prepare Document y texto en JavaScript.
Nodo Code - Preparar el documento

Su función es comprobar que la extracción anterior haya producido contenido útil y preparar el texto que realmente enviaremos a OpenAI.


Este nodo realiza tres tareas principales.

11.1 Localizar el texto extraído

Dependiendo de la versión del nodo o de la estructura de salida, el contenido puede aparecer en distintas propiedades. Por eso el código revisa varias posibilidades:

$json.text
$json.data
$json.content
$json.document
$json.extractedText

Si no encuentra ninguna de ellas, intenta reunir otros valores de texto disponibles en la salida.


11.2 Evitar analizar un documento vacío

Una vez localizado el contenido, comprobamos que realmente exista texto. Si no se ha podido extraer nada, el workflow se detiene con un error claro:

No se ha podido extraer texto del PDF.
Comprueba que el archivo contiene texto seleccionable y no es un PDF escaneado.

Esto evita enviar a OpenAI una petición vacía o inútil.


11.3 Limitar documentos demasiado largos

El workflow utiliza el valor configurado en:

max_document_characters

En nuestro ejemplo:

60000

El código compara ese límite con la longitud real del documento:

Texto original
↓
¿Supera el límite?
├─ No → se analiza completo
└─ Sí → se recorta

Además, guarda tres datos de control:

original_character_count
analysed_character_count
document_was_truncated

De esta forma podremos saber después cuánto texto contenía el archivo, cuánto se envió realmente al modelo y si el análisis se realizó sobre una versión recortada. La salida de este nodo ya contiene un documento validado y preparado para ser analizado por la IA.


12. Nodo 7 — Analizar el documento con OpenAI

Con el texto ya validado, el siguiente nodo es:

OpenAI - Analyse Document

Nodo OpenAI - Analizar el documento
Nodo OpenAI - Analizar el documento

Su función es interpretar el contenido del PDF y devolver un análisis estructurado.

En nuestro workflow utilizamos:

Parámetro

Valor

Modelo

gpt-5.4-mini

Temperatura

0.2

Entrada

Texto preparado del documento

Salida esperada

JSON válido

12.1 Qué información recibe la IA

El prompt incorpora cuatro elementos principales:

Nombre del archivo
+
Idioma de respuesta
+
Enfoque del análisis
+
Texto del documento

El campo:

analysis_focus

permite definir qué queremos obtener sin modificar toda la lógica del workflow.

En este ejemplo pedimos:

  • Resumen ejecutivo.

  • Finalidad.

  • Temas principales.

  • Datos relevantes.

  • Riesgos.

  • Inconsistencias.

  • Información ausente o ambigua.

  • Acciones recomendadas.


12.2 Reglas para reducir respuestas poco fiables

Como estamos analizando documentación real, el prompt incluye varias restricciones:

- No inventar información.
- Distinguir datos explícitos de inferencias.
- Señalar ambigüedades y contradicciones.
- Utilizar arrays vacíos cuando no haya datos.
- Mantener respuestas breves y claras.

También limitamos la severidad de los riesgos a tres valores:

low
medium
high

Esto facilita procesar después la respuesta de forma consistente.


12.3 Por qué usamos una temperatura baja

La temperatura configurada es:

0.2

En este caso no buscamos creatividad, sino consistencia. Una temperatura baja ayuda a que el modelo siga mejor la estructura solicitada y reduzca variaciones innecesarias entre ejecuciones.


El objetivo de este nodo no es redactar un informe bonito todavía. Su misión es convertir el contenido del documento en datos organizados que podamos reutilizar en los siguientes pasos.


13. Diseñar una respuesta estructurada

Para que N8N pueda reutilizar el resultado del análisis, no pedimos a OpenAI una respuesta libre.

Le exigimos una estructura JSON concreta:

{
  "document_type": "string",
  "document_purpose": "string",
  "executive_summary": "string",
  "main_topics": ["string"],
  "key_data": [
    {
      "label": "string",
      "value": "string"
    }
  ],
  "risks_and_attention_points": [
    {
      "title": "string",
      "description": "string",
      "severity": "low | medium | high"
    }
  ],
  "recommended_actions": ["string"],
  "missing_or_unclear_information": ["string"]
}

Cada campo tiene una función concreta:

Campo

Contenido esperado

document_type

Tipo de documento detectado

document_purpose

Finalidad principal

executive_summary

Resumen ejecutivo

main_topics

Temas principales

key_data

Datos relevantes

risks_and_attention_points

Riesgos o puntos de atención

recommended_actions

Acciones recomendadas

missing_or_unclear_information

Información ausente o ambigua

Esta estructura tiene una ventaja importante:

Una respuesta de IA
↓
Varios datos reutilizables

Por ejemplo, podemos utilizar el resumen en Telegram, guardar los riesgos en una base de datos o enviar las acciones a otro workflow.

También indicamos al modelo que utilice arrays vacíos cuando no encuentre información:

"recommended_actions": []

en lugar de inventar contenido o devolver valores inconsistentes. El objetivo es que la IA no solo “entienda” el documento, sino que entregue el resultado en un formato que N8N pueda procesar de forma predecible.


14. Nodo 8 — Normalizar el análisis

El siguiente nodo es:

Code - Prepare Analysis

Captura de n8n en modo oscuro con nodo OpenAI y bloque de código; paneles Input/Output y texto Code - Prepare Analysis.
Nodo Code - Normalizar el análisis

Su función es convertir la respuesta de OpenAI en una estructura fiable que podamos utilizar para generar el informe y el mensaje de Telegram.


Aunque hemos pedido al modelo que devuelva únicamente JSON, conviene no asumir que la salida llegará siempre exactamente igual.


14.1 Recuperar la respuesta

El código busca el contenido en varias propiedades posibles:

$json.message?.content
$json.text
$json.output
$json.content

Si ninguna existe, utiliza la respuesta completa.

Después elimina posibles bloques como:

```json
...

o:


```text
...

De esta forma, el siguiente paso recibe únicamente el contenido JSON.


14.2 Validar que el JSON sea correcto

La respuesta se procesa mediante:

JSON.parse(raw)

Si el contenido no es un JSON válido, el workflow se detiene y muestra parte de la respuesta recibida.

Esto evita continuar con datos mal formados que podrían provocar errores más difíciles de localizar en los nodos posteriores.


14.3 Normalizar valores

El nodo también utiliza pequeñas funciones auxiliares para asegurarse de que cada dato tenga el formato esperado.

Por ejemplo:

const list = (value) => Array.isArray(value) ? value : [];

garantiza que los campos que deberían ser listas sean realmente arrays.

Y:

const text = (value, fallback = 'No identificado') =>
  typeof value === 'string' && value.trim() ? value.trim() : fallback;

evita trabajar con textos vacíos o valores inesperados.


Gracias a esta normalización, el resto del workflow puede asumir una estructura más estable.

A partir de aquí, el análisis ya está preparado para convertirse en dos salidas diferentes:

Análisis estructurado
├─ Informe Markdown completo
└─ Resumen breve para Telegram

Ese será el siguiente paso.


15. Generar el informe Markdown

Dentro del nodo:

Code - Prepare Analysis

también construimos el contenido completo del informe mediante el campo:

markdown_report

El objetivo es transformar los datos estructurados devueltos por OpenAI en un documento legible.

La estructura generada es:

# Análisis del documento

## Archivo
...

## Tipo de documento
...

## Finalidad
...

## Resumen ejecutivo
...

## Temas principales
...

## Datos relevantes
...

## Riesgos y puntos de atención
...

## Acciones recomendadas
...

## Información ausente o ambigua
...

## Información de procesamiento
...

Cada bloque se construye a partir de una parte concreta del JSON.

Por ejemplo, los datos relevantes se convierten en una lista:

- Fecha límite: 30/09/2026
- Responsable: Departamento de Ingeniería
- Presupuesto: 250.000 €

Los riesgos incorporan también su nivel de severidad:

### Plazo no definido — HIGH
El documento no establece una fecha definitiva para...

Y las acciones se presentan numeradas:

1. Confirmar el alcance.
2. Solicitar las fechas pendientes.
3. Validar las responsabilidades.

15.1 Información de procesamiento

Al final del informe añadimos también algunos datos técnicos:

Caracteres originales
Caracteres analizados
Documento truncado

Esto permite saber si el análisis se realizó sobre el documento completo o sobre una versión recortada.


15.2 Por qué utilizar Markdown

Hemos elegido Markdown porque combina simplicidad y flexibilidad.

El archivo resultante:

  • Puede leerse directamente.

  • Mantiene títulos, listas y jerarquías.

  • Es fácil de versionar.

  • Puede convertirse posteriormente a HTML, Word o PDF.

  • Puede reutilizarse en otros workflows.


En este punto todavía tenemos texto dentro de N8N. Más adelante lo convertiremos en un archivo .md real para guardarlo físicamente en disco.


16. Preparar el resumen para Telegram

El mismo nodo:

Code - Prepare Analysis

prepara una segunda salida mucho más breve:

telegram_message

El objetivo no es enviar todo el informe, sino seleccionar la información que puede resultar más útil de forma inmediata.

El mensaje incluye:

  • Nombre del archivo.

  • Tipo de documento.

  • Resumen ejecutivo.

  • Hasta tres puntos de atención.

  • Hasta tres acciones recomendadas.

  • Nombre del informe completo generado.

La estructura queda aproximadamente así:

📄 Análisis automático de documento con N8N y OpenAI.

Archivo: documento_a_analizar.pdf

Tipo: Especificación técnica

Resumen:
...

Puntos de atención:
• [HIGH] ...
• [MEDIUM] ...

Acciones recomendadas:
• ...
• ...

Informe completo:
analisis_documento_20260712_133953.md

16.1 Limitar la longitud del mensaje

Telegram tiene límites de longitud, por lo que el workflow controla el tamaño final.

Si el contenido supera el límite definido, se recorta y añade:

[Mensaje recortado]

En nuestro caso trabajamos con un máximo aproximado de:

3900 caracteres

dejando un pequeño margen de seguridad.


16.2 Avisar si el documento fue truncado

Si el PDF original superó el límite de caracteres configurado, el mensaje añade un aviso:

Aviso: el documento fue recortado a 60000 caracteres para el análisis.

Esto es importante porque permite saber inmediatamente si el resumen se ha generado sobre todo el documento o solo sobre una parte.

Así mantenemos dos niveles de salida:

Informe completo
+
Resumen operativo

El informe queda almacenado para consulta detallada y Telegram sirve como notificación rápida.


17. El error de Telegram con HTML

Durante las pruebas apareció un error en el nodo:

Telegram - Send Summary

El mensaje era:

Bad Request: can't parse entities

El problema no estaba en el Chat ID ni en las credenciales. La causa era el contenido dinámico enviado a Telegram junto con:

Parse Mode: HTML

Si el resumen contiene caracteres como:

<
>
&

Telegram puede interpretarlos como parte de una etiqueta o entidad HTML.

Por ejemplo:

Temperatura < 80 °C
I+D & innovación
Presión > 4 bar

puede provocar un error si se envía directamente.


17.1 Escapar caracteres especiales

Para evitarlo, el nodo:

Code - Prepare Analysis

incluye una función específica:

const escapeTelegramHtml = (value) =>
  String(value ?? '')
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;');

Antes de enviar el mensaje aplicamos:

telegramMessage = escapeTelegramHtml(telegramMessage);

El proceso queda así:

Texto generado dinámicamente
↓
Escape de caracteres HTML
↓
Telegram

Telegram recibe internamente:

Temperatura &lt; 80 °C
I+D &amp; innovación

pero muestra al usuario:

Temperatura < 80 °C
I+D & innovación

17.2 Solo escapamos el mensaje de Telegram

Es importante distinguir las dos salidas. El informe Markdown se mantiene sin modificar, ya que queremos conservar su formato.

Solo aplicamos el escape HTML a:

telegram_message

De esta forma tenemos:

Informe Markdown
→ formato original

Mensaje Telegram
→ contenido adaptado a HTML

Este pequeño detalle evita que caracteres completamente normales dentro de un documento provoquen el fallo de toda la rama de notificación.


18. Convertir el informe en archivo

Hasta este punto, el informe completo existe dentro de N8N como texto almacenado en:

markdown_report

Para poder guardarlo físicamente necesitamos convertir ese contenido en un archivo.

El nodo encargado es:

Convert to File - Create Markdown Report

Interfaz oscura de n8n con flujo Convert to File - Create Markdown Report y salida de archivo .md a la derecha.
Nodo Convert to File - Crear informe markdown

La transformación es:

Texto Markdown
↓
Convert to File
↓
Archivo .md

La configuración principal es:

Parámetro

Valor

Source Property

markdown_report

Encoding

utf8

File Name

{{ $json.output_filename }}

El nombre del archivo se recupera del valor preparado anteriormente, por ejemplo:

analisis_documento_20260712_133953.md

El nodo no cambia el contenido del informe.

Simplemente toma el texto y lo empaqueta como archivo binario para que pueda escribirse después en disco.

Este paso es prácticamente el proceso inverso al que realizamos al inicio del workflow:

PDF binario
↓
Texto

ahora pasa a ser:

Texto Markdown
↓
Archivo binario

Con el informe ya convertido en archivo, el siguiente nodo podrá guardarlo en la carpeta configurada.


19. Guardar el informe en local

Una vez convertido el análisis en un archivo Markdown, el siguiente nodo es:

Read Write Files - Save Analysis
Captura de n8n con flujo Convert to File y Read Write Files para guardar un análisis Markdown; paneles de entrada/salida y botón Execute step
Nodo Read Write Files - Guardar el archivo

Su función es escribir físicamente ese archivo en la carpeta configurada.

La ruta se recupera desde:

Code - Prepare Analysis

mediante:

{{ $('Code - Prepare Analysis').item.json.output_file_path }}

El resultado será una ruta similar a:

/files/document-analysis/analisis_documento_20260712_133953.md

En este punto, el archivo deja de existir únicamente dentro de la ejecución de N8N y pasa a estar disponible en el sistema de archivos.


19.1 La carpeta debe existir

Antes de ejecutar el workflow debemos crear:

/files/document-analysis/

Si la carpeta no existe o N8N no tiene permisos de escritura, el nodo devolverá un error.


19.2 Si utilizamos Docker

La ruta pertenece al contenedor, por lo que necesitamos un volumen montado sobre /files.

Por ejemplo:

volumes:
  - C:/N8N/files:/files

De esta forma:

N8N:
/files/document-analysis/

corresponderá en Windows a:

C:\N8N\files\document-analysis\

Gracias al nombre dinámico, cada ejecución genera un informe independiente y conserva el histórico de análisis realizados.


20. Enviar el resumen por Telegram

La segunda rama final del workflow utiliza:

Telegram - Send Summary

Interfaz oscura de automatización con flujo n8n y Telegram: nodos conectados, botón Ejecutar step y panel de salida con datos JSON.
Nodo Telegram

Su función es enviar una versión breve del análisis sin necesidad de abrir el informe completo.

El nodo recibe el campo:

telegram_message

que ya fue preparado y escapado en el nodo anterior.

La configuración principal es:

Parámetro

Valor

Chat ID

Identificador del chat

Text

{{ $json.telegram_message }}

Parse Mode

HTML

Append Attribution

false

El mensaje incluye:

  • Nombre del documento.

  • Tipo detectado.

  • Resumen ejecutivo.

  • Principales puntos de atención.

  • Acciones recomendadas.

  • Nombre del informe completo.


De esta forma, Telegram funciona como una capa de notificación rápida:

Análisis completo
↓
Informe guardado en local

Información esencial
↓
Resumen enviado por Telegram

Si necesitamos revisar todos los detalles, abrimos el archivo Markdown. Si solo queremos conocer rápidamente el resultado, basta con consultar el mensaje recibido. Este patrón puede reutilizarse fácilmente con otros canales de salida, como email, Teams o Slack.


21. Probando el workflow

Con todos los nodos configurados, conviene comprobar el workflow por etapas.

El orden recomendado es:

Paso

Qué revisar

1

Que las rutas de entrada y salida sean correctas

2

Que el PDF exista en la carpeta configurada

3

Que el nodo de lectura cargue el archivo binario

4

Que Extract From File devuelva texto

5

Que el documento no esté vacío ni se haya truncado inesperadamente

6

Que OpenAI devuelva un JSON válido

7

Que el informe Markdown se construya correctamente

8

Que el archivo se guarde en la carpeta de salida

9

Que Telegram reciba el resumen

Durante las primeras pruebas es mejor utilizar un PDF corto y fácil de comprobar manualmente.

Después podemos probar casos algo más exigentes:

  • Un documento largo.

  • Un PDF con tablas.

  • Un documento sin riesgos claros.

  • Un archivo con caracteres especiales.

  • Un PDF escaneado, para comprobar la limitación de este workflow.


Si una etapa falla, conviene detenerse en el primer nodo cuya salida no sea la esperada, en lugar de revisar todo el flujo completo. Esto facilita localizar rápidamente si el problema está en el archivo, la extracción, el análisis o las salidas finales.


22. Cómo adaptar el workflow a otros casos de uso

El ejemplo del artículo utiliza un análisis documental genérico, pero la estructura puede reutilizarse para muchos tipos de PDF.

La clave está en modificar el campo:

analysis_focus

Sin cambiar el resto del workflow, podemos orientar el análisis hacia necesidades diferentes.

Caso de uso

Enfoque recomendado

Contrato

Obligaciones, riesgos, cláusulas relevantes y puntos ambiguos

Oferta comercial

Alcance, precio, exclusiones, plazos y condiciones

Especificación técnica

Requisitos, interfaces, restricciones y datos críticos

Informe de proyecto

Estado, desviaciones, riesgos, decisiones y acciones

Procedimiento

Pasos, responsables, controles y puntos críticos

Currículum

Experiencia, competencias, fortalezas y adecuación al puesto

Informe técnico

Hallazgos, problemas, datos relevantes y recomendaciones

Documento comercial

Propuesta de valor, condiciones y argumentos clave

Esto convierte el workflow en una base reutilizable para construir analizadores especializados sin tener que empezar desde cero cada vez.


23. Problemas habituales y soluciones

Aunque el workflow ya está probado, pueden aparecer errores relacionados con las rutas, la extracción del PDF, la respuesta de OpenAI o las salidas finales.

Problema

Posible causa

Solución

El PDF no se encuentra

Ruta o nombre incorrectos

Revisar input_folder, input_filename e input_file_path

El nodo de extracción devuelve poco o ningún texto

El PDF es escaneado o contiene principalmente imágenes

Utilizar OCR antes del análisis

El texto aparece desordenado

El documento tiene columnas, tablas o maquetación compleja

Revisar el contenido extraído y ajustar el tratamiento

El documento se recorta

Supera max_document_characters

Aumentar el límite o dividir el documento en partes

OpenAI devuelve información dudosa

El prompt permite demasiada interpretación

Reforzar las reglas de no inventar y distinguir inferencias

La respuesta no es JSON válido

El modelo añade texto o rompe la estructura

Revisar el prompt y mantener instrucciones de salida estrictas

Code - Prepare Analysis falla

La estructura recibida no coincide con la esperada

Revisar la salida real del nodo OpenAI

El archivo Markdown no se crea

Error en la conversión o en markdown_report

Comprobar el contenido antes de Convert to File

El informe no se guarda

La carpeta no existe o faltan permisos

Crear /files/document-analysis/ y revisar el volumen Docker

Telegram devuelve can't parse entities

Caracteres HTML sin escapar

Mantener el escape de &, < y > antes del envío

Telegram recibe un mensaje demasiado largo

El resumen supera el límite

Reducir el contenido o mantener el recorte automático

El informe se genera, pero falta información

El enfoque del análisis es demasiado genérico

Ajustar analysis_focus al tipo de documento


24. Variaciones y mejoras futuras

El workflow actual analiza un único PDF con texto seleccionable y genera un informe estructurado. A partir de esta base podemos añadir nuevas capacidades sin cambiar la lógica principal.

Mejora

Qué añade

Incorporar OCR

Permite analizar PDFs escaneados

Procesar varios documentos

Automatiza análisis por lotes

Leer adjuntos de email

Convierte la recepción de documentos en un proceso automático

Utilizar Google Drive o OneDrive

Sustituye las carpetas locales por almacenamiento en la nube

Dividir documentos largos

Evita recortar contenido y permite analizarlo por bloques

Guardar resultados en una base de datos

Facilita búsquedas, históricos y reporting

Generar Word, HTML o PDF

Produce informes con un formato más final

Añadir aprobación humana

Permite validar el análisis antes de distribuirlo

Comparar documentos

Detecta diferencias entre versiones

Añadir RAG

Permite hacer preguntas sobre una colección de documentos


25. Conclusiones

En este artículo hemos convertido un documento PDF en información estructurada y reutilizable dentro de N8N. El aprendizaje principal no está únicamente en resumir un documento. Lo importante es que hemos separado cada etapa del proceso y hemos transformado un archivo no estructurado en datos que N8N puede procesar de forma predecible.


A partir de un único PDF hemos obtenido:

  • Tipo de documento.

  • Finalidad.

  • Resumen ejecutivo.

  • Temas principales.

  • Datos relevantes.

  • Riesgos y puntos de atención.

  • Acciones recomendadas.

  • Información ausente o ambigua.


También hemos incorporado varios controles importantes:

  • Validación del texto extraído.

  • Límite de caracteres.

  • Detección de documentos truncados.

  • Respuesta JSON obligatoria.

  • Normalización de la salida.

  • Escape de caracteres para Telegram.

  • Guardado del informe completo en local.


El resultado es una base reutilizable para automatizaciones documentales más avanzadas. El siguiente paso natural será dejar de seleccionar manualmente el PDF y permitir que el workflow lo reciba desde otras fuentes, como un email o una carpeta en la nube.


La idea que nos llevamos de este artículo puede resumirse así:

El valor no está solo en leer un documento con IA, sino en convertir su contenido en información preparada para actuar.

🌐 Recursos

📘 Documentación oficial

💙 En Lozkorp, serie N8N

📦 Descargar el workflow de este artículo: LK_N8N_XXI_PDF_AI_Analysis_Local_Telegram.json


Comentarios


© 2025 by Lozkorp                                                         

bottom of page