Logotipo de Bitdoze

Extraer texto de un PDF desde la línea de comandos de Linux (pdftotext)

Extrae texto de archivos PDF en la línea de comandos de Linux con pdftotext. Cubre la instalación, los modos de diseño, los PDFs protegidos con contraseña, OCR para documentos escaneados y scripts por lotes.

Dragos

Actualizado Publicado 22 min de lectura

Extraer texto de un PDF desde la línea de comandos de Linux (pdftotext)

Extraer texto de archivos PDF desde la línea de comandos de Linux es sencillo con pdftotext, parte del paquete poppler-utils. Convierte documentos PDF a texto plano. Sin GUI, sin servicios en la nube, sin cuentas. Instala el paquete, apúntalo a un archivo y obtén texto al otro lado.

Esta guía cubre la instalación, el uso básico, cada opción útil, el manejo de PDFs protegidos con contraseña y escaneados, alternativas cuando pdftotext no es suficiente, scripts por lotes y solución de problemas.

  • Instala poppler-utils en cualquier distro Linux importante
  • Extrae texto de PDFs con pdftotext (básico y avanzado)
  • Maneja PDFs protegidos con contraseña y escaneados/basados en imágenes
  • Usa scripts por lotes para procesar varios PDFs a la vez
  • Soluciona los fallos de extracción más comunes

¿Qué es poppler-utils?

Poppler-utils es una colección de utilidades de línea de comandos para manipular archivos PDF. Está basada en la biblioteca poppler, un fork de la biblioteca xpdf. La estrella del paquete es pdftotext, que convierte archivos PDF a texto plano con diseño, codificación y selección de páginas configurables.

Otras herramientas del paquete se encargan de tareas de PDF distintas:

Herramientas clave de poppler-utils de un vistazo

Herramienta Propósito
pdftotext Convierte PDF a texto plano (el foco de este artículo)
pdfinfo Muestra metadatos del PDF: título, autor, número de páginas, etc.
pdftohtml Convierte PDF a HTML
pdfimages Extrae imágenes de un PDF
pdfseparate Divide un PDF en archivos de una sola página
pdfunite Fusiona archivos PDF con pdfunite en uno solo

Si trabajas con PDFs desde la terminal con regularidad, poppler-utils es de esos paquetes que instalas una vez en cada servidor. Combina bien con otros comandos esenciales de Linux que usas a diario.

Cómo instalar poppler-utils en Linux

Poppler-utils está en los repositorios oficiales de todas las distribuciones Linux importantes. Elige tu distro abajo.

Ubuntu / Debian / Mint

bash
sudo apt install poppler-utils

Fedora / RHEL 8+ / CentOS Stream

bash
sudo dnf install poppler-utils

Arch Linux / Manjaro

bash
sudo pacman -S poppler

Alpine Linux

bash
sudo apk add poppler-utils

openSUSE

bash
sudo zypper install poppler-tools

RHEL/CentOS 7 heredado

Si todavía estás en RHEL/CentOS 7, usa sudo yum install poppler-utils. En cualquier cosa más nueva (RHEL 8+, Fedora, AlmaLinux, Rocky Linux), usa dnf.

Verificar la instalación

Ejecuta:

bash
pdftotext --version

Salida esperada (la versión variará según la distro):

text
pdftotext version 24.02.0
Copyright 2005-2024 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011 Glyph & Cog, LLC

Si obtienes command not found, el paquete no está instalado o no está en tu PATH. Vuelve a ejecutar el comando de instalación de tu distro.

Comprueba tu versión para las funciones más nuevas

Algunas opciones requieren versiones mínimas de poppler:

  • -tsv necesita poppler ≥ 22.05.0 (Ubuntu 22.10+, Fedora 37+, Arch rolling)
  • -remove-hyphens necesita poppler >= 26.05.0 (mayo de 2026). Solo en distros rolling o compilaciones manuales, NO en Ubuntu 24.04 (incluye 24.02.0).

Compruébalo con pdftotext --version antes de confiar en estas funciones.

Cómo usar pdftotext: extracción básica de texto

Sintaxis básica y primera extracción

La invocación más simple toma un PDF de entrada y produce un archivo de texto:

bash
pdftotext input.pdf output.txt

Si omites el nombre del archivo de salida, pdftotext usa el mismo nombre con extensión .txt:

bash
pdftotext input.pdf
# Crea input.txt en el directorio actual

Verifica que funcionó:

bash
wc -l output.txt

Si el recuento de líneas es cero o casi cero, el PDF probablemente es escaneado/basado en imágenes. Consulta la sección de OCR más abajo.

Lectura desde stdin y escritura a stdout

Puedes canalizar datos PDF de entrada y texto de salida usando - como nombre de archivo:

bash
cat input.pdf | pdftotext - -

Esto es útil en scripts y pipelines donde no quieres archivos intermedios:

bash
pdftotext report.pdf - | grep -i "quarterly revenue"

Personalizar el formato de salida con las opciones de pdftotext

pdftotext tiene muchas opciones para controlar cómo sale el texto. Se agrupan en varias categorías.

Control de diseño: -layout, -raw, -fixed
  • -layout: Conserva el diseño original del PDF, incluidas columnas, tablas y espaciado. Es mi opción por defecto para documentos de varias columnas.

    bash
    pdftotext -layout input.pdf output.txt
  • -raw: Mantiene el orden original del texto pero ignora el posicionamiento del diseño. Útil cuando -layout desordena el texto por fuentes inusuales.

    bash
    pdftotext -raw input.pdf output.txt
  • -fixed number: Asume texto de paso fijo (monoespaciado) con el ancho de carácter dado en puntos. Útil para PDFs generados a partir de texto de ancho fijo.

    bash
    pdftotext -fixed 8 input.pdf output.txt
  • -colspacing number: Controla el umbral de detección de columnas (por defecto: 0.7). Valores más bajos (p. ej., 0.3) detectan separaciones de columna más estrechas; valores más altos (p. ej., 1.5) son más permisivos. Ajústalo cuando las columnas se fusionen o se dividan incorrectamente.

    bash
    pdftotext -layout -colspacing 0.3 input.pdf output.txt
Selección de páginas: -f y -l

Extrae un rango de páginas específico:

bash
# Extraer solo las páginas 5 a 12
pdftotext -f 5 -l 12 input.pdf output.txt
  • -f number: Primera página a extraer (empieza en 1).
  • -l number: Última página a extraer.

Combínalas con otras opciones:

bash
pdftotext -f 1 -l 5 -upw "mypass" -layout report.pdf pages1-5.txt
Salida estructurada: -bbox, -tsv, -htmlmeta

Estas opciones generan salida estructurada para procesamiento programático:

  • -bbox: Genera HTML con coordenadas de cuadro delimitador para cada palabra. Útil para análisis posicional de texto.

    bash
    pdftotext -bbox input.pdf output.html
  • -tsv: Emite valores separados por tabulaciones con datos de cuadro delimitador por bloque, línea y palabra. Columnas: level, page_num, par_num, block_num, line_num, word_num, left, top, width, height, conf, text.

    bash
    pdftotext -tsv input.pdf output.tsv

    El modo TSV requiere poppler ≥ 22.05.0

    Disponible en Ubuntu 22.10+, Fedora 37+, Arch rolling. Comprueba tu versión con pdftotext --version.

  • -htmlmeta: Genera HTML con los metadatos del PDF (título, autor) incrustados.

    bash
    pdftotext -htmlmeta input.pdf output.html
  • -bbox-layout: Como -bbox pero conserva la estructura del diseño en la salida HTML.

Limpieza de texto: -nodiag, -remove-hyphens, -eol
  • -nodiag: Descarta el texto diagonal. Es útil para eliminar texto de marcas de agua que aparece en ángulo en el PDF.

    bash
    pdftotext -nodiag input.pdf output.txt
  • -remove-hyphens all|soft|none: Controla cómo se tratan los guiones de fin de línea:

    • all: Elimina todos los guiones de fin de línea y fusiona las palabras (por defecto)
    • soft: Solo elimina los guiones suaves (U+00AD), conserva los guiones ASCII
    • none: Conserva todos los guiones y saltos de línea
    bash
    pdftotext -remove-hyphens all input.pdf output.txt
    pdftotext -remove-hyphens soft input.pdf output.txt

    -remove-hyphens requiere poppler ≥ 26.05.0

    Esta opción se añadió en mayo de 2026. NO está en Ubuntu 24.04 (incluye 24.02.0). Solo disponible en distros rolling (Arch) o mediante compilación manual. No tiene efecto en los modos -raw o -layout.

  • -eol unix|dos|mac: Establece la convención de fin de línea en el texto de salida. Por defecto es la del SO anfitrión.

    bash
    pdftotext -eol dos input.pdf output.txt
Codificación de salida y otras opciones: -enc, -nopgbrk, -q, -r
  • -enc encoding: Establece la codificación del texto de salida. Valores comunes: UTF-8, ISO-8859-1, ASCII, UCS-2.

    bash
    pdftotext -enc UTF-8 input.pdf output.txt
  • -nopgbrk: Elimina los caracteres de salto de página (^L) entre páginas. El comportamiento por defecto los inserta.

  • -q: Modo silencioso. Suprime los mensajes de error.

  • -r number: Establece la resolución en DPI (por defecto: 72). Afecta a la salida de algunas opciones dependientes del renderizado.

  • -x number -y number -W number -H number: Coordenadas del área de recorte. Define una región rectangular de la que extraer texto.

    bash
    pdftotext -x 100 -y 100 -W 400 -H 600 input.pdf output.txt
  • -cropbox: Usa el cuadro de recorte (crop box) en lugar del cuadro de medios (media box) (con -bbox).

Puedes ver la lista completa de opciones con:

bash
pdftotext -h

Extraer texto de PDFs protegidos con contraseña

Muchos PDFs tienen restricciones que impiden copiar o imprimir texto. pdftotext puede manejar dos tipos de contraseñas.

Uso de las opciones -opw y -upw

  • -opw "password" — Contraseña de propietario. Omite todas las restricciones (imprimir, copiar, modificar). Úsala cuando el PDF te deja abrirlo pero bloquea la extracción de texto.

    bash
    pdftotext -opw "ownerpass" restricted.pdf output.txt
  • -upw "password" — Contraseña de usuario. Requerida para abrir el archivo en absoluto. Úsala cuando el PDF pide una contraseña al abrirlo.

    bash
    pdftotext -upw "userpass" locked.pdf output.txt

Si obtienes el código de salida 3 o errores de “Permission denied”, el PDF tiene restricciones. Prueba -opw primero.

Descifrado con qpdf antes de la extracción

Para cifrados complejos o cuando las opciones de contraseña de pdftotext no funcionan, descifra el PDF primero con qpdf:

bash
# Instalar qpdf
sudo apt install qpdf

# Descifrar
qpdf --password=secret --decrypt locked.pdf unlocked.pdf

# Después extraer
pdftotext unlocked.pdf output.txt

Esto elimina toda la protección por contraseña de forma permanente de unlocked.pdf, así que manéjalo en consecuencia.

Cuando pdftotext no funciona: OCR para PDFs escaneados

pdftotext no puede leer PDFs escaneados

Si tu PDF se creó escaneando documentos en papel, contiene imágenes, no texto. pdftotext producirá una salida vacía o casi vacía. Necesitas OCR (reconocimiento óptico de caracteres) para añadir una capa de texto.

Esta es la razón número uno por la que pdftotext “no funciona” para la gente. Un PDF escaneado parece tener texto en pantalla, pero el texto en realidad es una imagen de texto.

Cómo detectar un PDF escaneado o basado en imágenes

Comprobación rápida:

bash
pdftotext suspect.pdf - | wc -c

Si el recuento de bytes es muy bajo (menos de 100 bytes para un documento de varias páginas), el PDF casi seguro está escaneado. También puedes usar pdfinfo:

bash
pdfinfo suspect.pdf | grep Pages

Si muestra muchas páginas pero pdftotext apenas extrae nada, está escaneado.

Solución 1: OCRmyPDF + Tesseract

OCRmyPDF añade una capa de texto OCR invisible a los PDFs escaneados, haciéndolos buscables y extraíbles:

bash
# Instalar
sudo apt install ocrmypdf tesseract-ocr

# Añadir capa de texto OCR
ocrmypdf scanned.pdf searchable.pdf

# Ahora extraer el texto
pdftotext searchable.pdf output.txt

Verifica que funcionó:

bash
pdftotext searchable.pdf - | wc -c
# Debería mostrar un recuento de bytes sustancial

Para PDFs que no están en inglés, instala el paquete de idioma de Tesseract apropiado:

bash
# Francés
sudo apt install tesseract-ocr-fra

# Alemán
sudo apt install tesseract-ocr-deu

# Después especifica el idioma
ocrmypdf -l fra scanned.pdf searchable.pdf

Solución 2: pdftoppm + tesseract directamente

Si OCRmyPDF no está disponible o necesitas más control sobre el proceso de OCR, convierte las páginas del PDF a imágenes primero y luego ejecuta Tesseract:

bash
# Convertir las páginas del PDF a imágenes PPM a 300 DPI
pdftoppm -r 300 scanned.pdf page

# OCR de la primera página
tesseract page-1.ppm output

# La salida estará en output.txt

Este enfoque te da control sobre la resolución y el procesamiento página a página, pero tendrás que hacer el bucle sobre varias páginas tú mismo.

Herramientas alternativas de línea de comandos para extraer texto de PDF

pdftotext cubre la mayoría de casos, pero a veces necesitas otra herramienta. Esto es cuándo recurrir a algo distinto.

Herramienta Cuándo usarla Instalación
mutool draw Diseños complejos donde pdftotext desordena las columnas sudo apt install mupdf-tools
pdfgrep Buscar en PDFs sin extraer todo sudo apt install pdfgrep
xpdf pdftotext Datos tabulares (tiene un modo -table que poppler no tiene) sudo apt install xpdf
calibre ebook-convert Flujos de trabajo con ebooks, motor de extracción distinto sudo apt install calibre

Si prefieres una GUI web para operaciones con PDF, echa un vistazo a manipulación de PDF autoalojada con Stirling PDF — corre en Docker y maneja extracción, conversión, fusión y más desde el navegador.

mutool draw (MuPDF)

A veces maneja diseños complejos mejor que pdftotext:

bash
mutool draw -F txt input.pdf -o output.txt

pdfgrep — buscar en PDFs sin extracción completa

Cuando solo necesitas encontrar una cadena en un PDF, no extraerlo entero:

bash
pdfgrep -n "search term" document.pdf

# Buscar en varios PDFs
pdfgrep -rn "search term" *.pdf

xpdf pdftotext (con el modo -table)

La versión de pdftotext de xpdf tiene opciones que la de poppler no tiene, sobre todo -table para datos tabulares y -simple para diseños de una sola columna:

bash
sudo apt install xpdf
pdftotext -table input.pdf output.txt

pdftotext de xpdf vs poppler

Son dos binarios distintos con el mismo nombre. En Ubuntu, instalar xpdf puede cambiar qué pdftotext está en tu PATH. Compruébalo con which pdftotext y pdftotext --version para confirmar cuál estás ejecutando. La versión de xpdf muestra “xpdf version” en su salida; la de poppler muestra el copyright de “poppler”.

calibre ebook-convert

Una herramienta más pesada, pero útil para flujos de trabajo orientados a ebooks:

bash
ebook-convert input.pdf output.txt

Procesamiento por lotes y scripts prácticos

Extraer todos los PDFs de un directorio

bash
for pdf in *.pdf; do
    pdftotext -layout "$pdf" "${pdf%.pdf}.txt"
done

Esto crea un archivo .txt por cada .pdf en el directorio actual.

Pasar el texto extraído a grep para buscar

Busca dentro de un PDF sin crear archivos intermedios:

bash
pdftotext document.pdf - | grep -i "keyword"

Después de extraer texto, puedes cambiar mayúsculas y minúsculas con sed o hacer más procesamiento de texto en tu pipeline.

One-liner para verificar que la extracción funcionó

Úsalo en scripts para comprobar si la extracción produjo salida real:

bash
test $(wc -c < output.txt) -gt 10 && echo "OK" || echo "LIKELY SCANNED PDF"

Combínalo con contraseña y rango de páginas:

bash
pdftotext -f 1 -l 5 -upw "mypass" -layout report.pdf pages1-5.txt
test $(wc -c < pages1-5.txt) -gt 10 && echo "Extraction OK" || echo "Failed or empty"

Al procesar por lotes, también te puede resultar útil comparar el contenido de carpetas para verificar que se crearon todos los archivos de salida esperados.

Solución de problemas comunes de pdftotext

Salida vacía (PDF escaneado)

Síntoma: pdftotext produce un archivo de salida vacío o casi vacío.

Causa: El PDF es escaneado/basado en imágenes sin capa de texto.

Solución: Usa OCRmyPDF para añadir una capa de texto OCR (ver la sección de OCR más arriba).

Texto corrupto o faltante

Síntoma: El texto extraído tiene caracteres incorrectos, letras faltantes o salida corrupta.

Causa: El PDF usa codificaciones de fuentes personalizadas que pdftotext no puede mapear a Unicode.

Soluciones:

  1. Prueba el modo -raw para saltarte el procesamiento de diseño:
    bash
    pdftotext -raw input.pdf output.txt
  2. Fuerza la codificación UTF-8:
    bash
    pdftotext -enc UTF-8 input.pdf output.txt
  3. Si poppler no puede con ello, prueba mutool draw -F txt como alternativa.
Detección de columnas deficiente

Síntoma: Las columnas se fusionan entre sí o el texto de columnas distintas queda entrelazado.

Causa: La heurística de detección de columnas no coincide con el diseño del PDF.

Solución: Ajusta -colspacing (por defecto: 0.7). Los valores más bajos detectan separaciones de columna más estrechas:

bash
pdftotext -layout -colspacing 0.3 input.pdf output.txt

Prueba valores entre 0.3 y 1.5 hasta que el diseño se vea bien.

Texto de marca de agua en la salida

Síntoma: Texto diagonal de marca de agua (p. ej., “CONFIDENTIAL”, “DRAFT”) aparece en el texto extraído.

Causa: pdftotext extrae todo el texto, incluidas las capas diagonales.

Solución: Usa -nodiag para descartar el texto diagonal (poppler ≥ 0.80.0):

bash
pdftotext -nodiag input.pdf output.txt
Entender los códigos de salida de pdftotext

Para scripting y automatización, pdftotext devuelve códigos de salida significativos:

Código de salida Significado
0 Éxito
1 Error al abrir el archivo PDF
2 Error al abrir el archivo de salida
3 Error de permisos (el PDF tiene restricciones)
99 Otro error

Úsalos en scripts:

bash
pdftotext input.pdf output.txt
case $? in
    0) echo "Success" ;;
    1) echo "Cannot open PDF" ;;
    3) echo "PDF has restrictions — try -opw option" ;;
    *) echo "Unknown error" ;;
esac

Conclusión

pdftotext de poppler-utils es la herramienta por defecto para extraer texto de PDFs en Linux. Cubre la mayoría de casos de fábrica: conversión básica, preservación del diseño, selección de páginas, control de codificación y archivos protegidos con contraseña. Para PDFs escaneados, combínalo con OCRmyPDF y Tesseract. Para datos tabulares que pdftotext destroza, prueba el modo -table de xpdf o mutool draw.

Para más trabajo con PDF desde la línea de comandos, puedes fusionar archivos PDF con pdfunite o autoalojar Stirling PDF como toolkit basado en navegador. Y si estás desarrollando tus habilidades de administración Linux, echa un vistazo a las guías sobre securizar tu servidor SSH y comprobar puertos remotos con nc.