hi @Leon22
I would use a fully local OCR service exposed over HTTP or running in a separate container and call it from n8n before sending the text to Ollama, because with scanned PDFs the text must first be generated by a dedicated OCR step outside the standard PDF extraction flow.
Hey! Since you already have Ollama running locally, easiest route is just convert your PDF pages to images with pdftoppm in an Execute Command node and then send those to an Ollama vision model like llama3.2-vision for the OCR, taht way you skip needing any extra services.
Hey, thanks a lot for your help — really appreciate it!
I have a few follow-up questions because I’m still pretty new to n8n and this setup:
From what I understand, I should use pdftoppm to convert PDF pages into images first. I’ve read that it’s part of the poppler-utils package — is that correct?
How exactly would I install that in my setup?
do I need to install poppler-utils with docker ?
If it’s inside Docker, would I extend the n8n image or run a separate container?
Also, once it’s installed:
How do I actually call pdftoppm from within n8n?
Would I use an Execute Command node for that?
Or is there a better approach (e.g. Code node, external service, etc.)?
Sorry if these are basic questions I’m still learning, but I’d really appreciate any guidance or example workflows!
@Leon22 yeah poppler-utils is correct. If you’re using the official n8n docker image just extend it with a custom Dockerfile like FROM n8nio/n8n:latest then USER root and RUN apk add --no-cache poppler-utils then USER node, rebuild (e.g. docker build -t n8n-ocr .) and point your compose/run at the new tag. The n8n image is Alpine-based so it’s apk not apt.
To add to @achamm’s spot-on Docker instructions, to answer your second question: Yes, you will use the Execute Command node to run pdftoppm.
The tricky part for beginners is that CLI tools expect physical files on the disk, while n8n holds your PDF in memory as binary data. The standard pattern for this is:
Use a Read/Write Files from Disk node to save your PDF binary to a temporary path like /tmp/input.pdf.
Use the Execute Command node to run: pdftoppm -png /tmp/input.pdf /tmp/output
Use another Read/Write Files from Disk node to read the generated /tmp/output-1.png back into n8n as binary data so you can send it to your Ollama node.
Just don’t forget to add a final Execute Command node to rm those temp files afterward, or your Docker container will eventually run out of space!
Great approach with pdftoppm + Ollama! One thing to add: if your PDFs are multi-page, you might want to loop through each generated image file and pass them to Ollama one by one, then merge the text outputs at the end. I’ve done similar pipelines in n8n using a Split In Batches node after the Execute Command step. Also worth noting: make sure your Ollama model (like llava or minicpm-v) is actually good at OCR - some vision models are better than others for dense text extraction.
Spot on about the multi-page handling! Throwing a massive PDF at a vision model all at once is a guaranteed way to hit context limits or crash the instance.
If anyone implements this approach using the Loop node (formerly Split In Batches), I highly recommend adding a short Wait node or configuring automatic retries on the Ollama request step. If n8n fires 20 heavy image processing requests at your local Ollama container simultaneously, the container can easily choke and drop requests, leaving you with missing pages in your final merged text. Excellent call on minicpm-v as well, it’s a beast for OCR!
Spot on! Batch-testing the models against the actual PDF artifacts is definitely the right move. I’ve noticed Llava can sometimes hallucinate on dense tables where minicpm-v stays a bit more strict, but it really does depend on the scan quality. Appreciate the shoutout!
For local PDF OCR in n8n, the most reliable approach I’ve found is using a vision-capable model in Ollama (like llava or llava-llama3) combined with converting PDF pages to images first using the Extract PDF node, then sending each page image to Ollama for text extraction.
The key is to set raw: true in the Ollama options to prevent the model from adding reasoning artifacts to the output. You then collect the extracted text across pages and concatenate.
This keeps everything local without needing Tesseract or external OCR services. Works well for structured documents, though accuracy drops on low-quality scans.
Thanks a lot for the detailed explanation — that’s actually exactly the approach I’d like to use
The only issue I’m running into is with scanned PDFs. When I pass them into the Extract from PDF node, it doesn’t return any text at all (the output is basically empty), which I assume is expected since there’s no embedded text layer.
Right now my workaround is:
convert the PDF pages into images (PNG)
then send those images to an Ollama OCR model (I’m using qwen2.5vl:7b)
That part actually works really well for me.
However, I’d prefer to handle the PDF → image conversion directly inside the n8n workflow, instead of doing it externally beforehand.
So my questions would be:
Is there a recommended way in n8n to convert PDF pages to images (PNG/JPG) within the workflow?
Or is there any way to make the Extract from PDF node handle scanned PDFs that I might be missing?
Appreciate any tips — would love to keep everything fully local and inside n8n if possible
Para el paso de OCR específicamente, puedes omitir la configuración de pdftoppm + extensión Docker y usar el nodo SealDoc en su lugar. Ejecuta ocrmypdf + Tesseract internamente en una instancia de SealDoc autohospedada, por lo que nada sale de tu infraestructura.
Configuración del nodo en n8n:
Resource: Job
Operation: Create
Enable: Run OCR (activar)
OCR Languages: eng (o eng+deu, nld+fra, etc.)
El nodo genera el texto extraído, que luego conectas directamente a tu nodo Ollama para resumen o estructuración. SealDoc maneja la conversión de imagen y el paso de Tesseract, por lo que no necesitas nodos Execute Command o una imagen Docker personalizada.
Oye, eso suena interesante. Sin embargo, como puedo ver, se vuelve de pago una vez que alcanzas cierto tamaño. Además, no puedo acceder al sitio web porque después de ingresar la información de mi empresa, termino atrapado en un bucle infinito.
Hola Leon, el bucle infinito era un bug real. Afectó a algunas personas hoy y acabamos de publicar una solución. Haz una actualización forzada o borra los datos del sitio para app.sealdoc.eu si aún muestra la página antigua.
Sobre los precios: el plan gratuito cubre 50 documentos/mes con OCR completo y extracción de texto, lo que debería ser suficiente para evaluar si se adapta a tu flujo de trabajo. Los planes de pago entran en juego si necesitas un volumen mayor o retención superior a 24h.
Muchas gracias por todas las ideas y sugerencias que me han dado hasta ahora. Desafortunadamente, sigo teniendo el mismo problema y continúo buscando una solución.
Mi objetivo es extraer texto de archivos PDF escaneados que no contienen una capa de texto. Si los archivos son archivos de imagen normales en lugar de PDF, puedo usar simplemente el nodo “Analyze Image” (Analizar imagen) de Ollama y obtener resultados bastante utilizables. Sin embargo, esto obviamente no funciona directamente con archivos PDF.
¿No hay realmente ninguna forma de procesar directamente archivos PDF escaneados dentro de un flujo de trabajo de n8n y extraer el texto de ellos?
Toda la configuración debe continuar ejecutándose completamente en local y preferiblemente seguir siendo completamente gratuita.
Sigo siendo receptivo a recibir más sugerencias — ejemplos de flujos de trabajo o fragmentos de código también serían muy apreciados
no sé si ya han dado esa respuesta, por favor avísame si es así, porque el hilo es demasiado largo.
para PDFs escaneados, Extract from PDF no funciona porque no existe una capa de texto, necesitamos convertir cada página en imagen y aplicar OCR. intenta instalar poppler-utils en el contenedor, úsalo a través de Execute Command para generar PNGs y luego envía esas imágenes a Ollama.
La documentación muestra que n8n tiene una operación para extraer contenido de PDF, pero eso es extracción de contenido existente en el archivo, no OCR de imagen escaneada.
La documentación explica que, si necesitas ejecutar comandos/binarios dentro de n8n Docker, debes crear una imagen basada en la imagen oficial e instalar los paquetes necesarios.
La documentación de pdftoppm dice que convierte archivos PDF en imágenes, generando una imagen por página.
De alguna manera, cada vez que intento agregar algo nuevo al flujo de trabajo que podría resolver mi problema principal de OCR, ¡termino creando aún más problemas primero!
Ya instalé tanto pdftoppm como ImageMagick dentro de mi contenedor Docker e intenté resolver el problema del PDF escaneado con ellos. Pero ahora estoy atascado en el nodo Read/Write Files from Disk porque siempre obtengo el siguiente error:
The file "/temp-files/input" is not writable.
Ya busqué en el foro y en Google este error específico pero no encontré realmente una solución que funcionara, así que pensé en preguntar aquí de nuevo.
Lo que intento lograr es en realidad bastante simple:
Solo quiero convertir un PDF escaneado en archivos de imagen dentro del flujo de trabajo usando pdftoppm o ImageMagick, para poder luego enviar esas imágenes al nodo Ollama para el reconocimiento OCR.
Hasta ahora no he encontrado otra solución completamente local y gratuita que funcione de forma fiable para PDFs escaneados.
Ya probé Tesseract también, pero honestamente la calidad del OCR fue bastante mala en mi caso.
Así que si alguien tiene una idea de qué podría estar causando el error de escritura o cómo manejar adecuadamente archivos temporales en Docker/n8n, realmente agradecería la ayuda ^^
La ruta /temp-files/input es el problema - ese directorio no existe o no tiene permisos de escritura en el contenedor Docker de n8n por defecto. Cambia a /tmp en su lugar, que siempre tiene permisos de escritura en contenedores: usa /tmp/page-%03d.png como tu ruta de salida en el nodo Execute Command.
Además, para que el nodo Read/Write Files acceda a /tmp, asegúrate de que la variable de entorno N8N_RESTRICT_FILE_ACCESS_TO esté configurada para incluir /tmp en tu configuración de Docker, o no esté configurada en absoluto (restringe el acceso a archivos si está definida). Si estás en una versión reciente de n8n, verifica que la ruta en el nodo Read/Write Files coincida exactamente con lo que genera pdftoppm o ImageMagick - el patrón %03d genera page-001.png, page-002.png, etc., así que los leerías de nuevo recorriendo ese patrón.
Puedes usar el nodo Execute Command en n8n para ejecutar Tesseract OCR localmente. Solo instala Tesseract y Poppler en tu host n8n, luego encadénalo así: Read Binary File → Execute Command (OCR) → HTTP Request a Ollama. Para PDFs de varias páginas, OCRmyPDF en un sidecar de Docker es más limpio, y puedes llamarlo a través del nodo HTTP Request sin tocar el host n8n. Todo se mantiene 100% local.