Serie N8N (XXI): Analizar documentos PDF con IA - extraer, resumir y clasificar información automáticamente
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.

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

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 TriggerSu función es iniciar el análisis cuando nosotros lo decidamos desde el editor de N8N.

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
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.pdfLa 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_documentoEl nombre definitivo incorporará fecha y hora para evitar sobrescribir análisis anteriores.
7.3 Idioma y enfoque del análisis
El campo:
analysis_languagepermite indicar en qué idioma queremos recibir el resultado.
En nuestro caso:
SpanishMás importante todavía es:
analysis_focusque 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_charactersestá configurado en:
60000Su 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 PathsSu función es transformar la configuración anterior en rutas y nombres completos que utilizarán los siguientes nodos.

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_filenamemediante esta expresión:
{{ $json.input_folder + $json.input_filename }}El resultado será:
/files/documents/documento_a_analizar.pdfEsta 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.mdAñ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.mdAdemá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
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 workflowEste paso es importante porque separa dos operaciones distintas:
Leer el archivo
≠
Extraer su contenidoEl 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 TextSu 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ídoEste 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:
PDFEl nodo intenta recuperar el texto incluido dentro del documento y lo devuelve en una estructura JSON.

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 extraerPara 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
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.extractedTextSi 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_charactersEn nuestro ejemplo:
60000El código compara ese límite con la longitud real del documento:
Texto original
↓
¿Supera el límite?
├─ No → se analiza completo
└─ Sí → se recortaAdemás, guarda tres datos de control:
original_character_count
analysed_character_count
document_was_truncatedDe 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
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 documentoEl campo:
analysis_focuspermite 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
highEsto facilita procesar después la respuesta de forma consistente.
12.3 Por qué usamos una temperatura baja
La temperatura configurada es:
0.2En 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 reutilizablesPor 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
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.contentSi 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 TelegramEse será el siguiente paso.
15. Generar el informe Markdown
Dentro del nodo:
Code - Prepare Analysistambién construimos el contenido completo del informe mediante el campo:
markdown_reportEl 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 truncadoEsto 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 Analysisprepara una segunda salida mucho más breve:
telegram_messageEl 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 caracteresdejando 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 operativoEl 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 SummaryEl mensaje era:
Bad Request: can't parse entitiesEl 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: HTMLSi 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 barpuede provocar un error si se envía directamente.
17.1 Escapar caracteres especiales
Para evitarlo, el nodo:
Code - Prepare Analysisincluye una función específica:
const escapeTelegramHtml = (value) =>
String(value ?? '')
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>');Antes de enviar el mensaje aplicamos:
telegramMessage = escapeTelegramHtml(telegramMessage);El proceso queda así:
Texto generado dinámicamente
↓
Escape de caracteres HTML
↓
TelegramTelegram recibe internamente:
Temperatura < 80 °C
I+D & innovaciónpero muestra al usuario:
Temperatura < 80 °C
I+D & innovación17.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_messageDe esta forma tenemos:
Informe Markdown
→ formato original
Mensaje Telegram
→ contenido adaptado a HTMLEste 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_reportPara poder guardarlo físicamente necesitamos convertir ese contenido en un archivo.
El nodo encargado es:
Convert to File - Create Markdown Report
La transformación es:
Texto Markdown
↓
Convert to File
↓
Archivo .mdLa 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.mdEl 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
↓
Textoahora pasa a ser:
Texto Markdown
↓
Archivo binarioCon 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
Su función es escribir físicamente ese archivo en la carpeta configurada.
La ruta se recupera desde:
Code - Prepare Analysismediante:
{{ $('Code - Prepare Analysis').item.json.output_file_path }}El resultado será una ruta similar a:
/files/document-analysis/analisis_documento_20260712_133953.mdEn 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:/filesDe 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
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_messageque 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 TelegramSi 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_focusSin 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
Telegram Bots https://core.telegram.org/bots
Documentación del nodo Telegram en N8N https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.telegram/
💙 En Lozkorp, serie N8N
Serie N8N (I): Automatiza tu mundo. Definición e instalación en local
Serie N8N (II): Interfaz y Configuración – Comprende tu entorno de trabajo
Serie N8N (V): Control de flujo – Condiciones, decisiones y ramificaciones
Serie N8n (VI): Entender los datos – cómo fluye la información en un workflow
Serie N8N (VII): Instalar N8N con Docker – del local al servidor sin miedo
Serie N8N (VIII): Ejecutar workflows en Docker y resolver problemas de acceso a archivos
Serie N8N (IX): Automatizar tareas programadas con Schedule Trigger
Serie N8N (XII): Automatizar Google Sheets — guardar datos automáticamente
Serie N8N (XIV): Inteligencia Artificial en N8N - analizar textos automáticamente
Serie N8N (XV): Lead Scoring con IA en N8N - prioriza oportunidades automáticamente
Serie N8N (XVI): Analizar emails automáticamente con IA y generar respuestas sugeridas
Serie N8N (XVII): Usar el nodo OpenAI en N8N — de texto a resumen inteligente
Serie N8N (XVIII): Informes automáticos con IA y Telegram (informe financiero)
Serie N8N (XIX): Generar imágenes con IA desde N8N - crear, guardar y enviar una imagen automáticamente
Serie N8N (XX): De una idea a una imagen - genera prompts automáticamente con IA en N8N
📦 Descargar el workflow de este artículo: LK_N8N_XXI_PDF_AI_Analysis_Local_Telegram.json





















Comentarios