---
title: "Extraer texto de un PDF desde la línea de comandos de Linux (pdftotext)"
description: "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."
date: 2024-01-23
categories: ["linux"]
tags: ["pdf","command-line"]
---

import Button from "@components/widgets/Button.astro";
import Notice from "@components/widgets/Notice.astro";
import ListCheck from "@components/widgets/ListCheck.astro";
import Accordion from "@components/widgets/Accordion.astro";
import Tabs from "@components/widgets/Tabs.astro";
import Tab from "@components/widgets/Tab.astro";

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.

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

## ¿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](https://poppler.freedesktop.org/), 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](/es/unir-pdf-linux/) 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](/es/comandos-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.

<Tabs>
<Tab name="Ubuntu / Debian / Mint">
```sh
sudo apt install poppler-utils
```
</Tab>
<Tab name="Fedora / RHEL 8+ / CentOS Stream">
```sh
sudo dnf install poppler-utils
```
</Tab>
<Tab name="Arch Linux / Manjaro">
```sh
sudo pacman -S poppler
```
</Tab>
<Tab name="Alpine Linux">
```sh
sudo apk add poppler-utils
```
</Tab>
<Tab name="openSUSE">
```sh
sudo zypper install poppler-tools
```
</Tab>
</Tabs>

<Notice type="info" title="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`.
</Notice>

### Verificar la instalación

Ejecuta:

```sh
pdftotext --version
```

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

```
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.

<Notice type="info" title="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.
</Notice>

## 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:

```sh
pdftotext input.pdf output.txt
```

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

```sh
pdftotext input.pdf
# Crea input.txt en el directorio actual
```

Verifica que funcionó:

```sh
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:

```sh
cat input.pdf | pdftotext - -
```

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

```sh
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.

<Accordion label="Control de diseño: -layout, -raw, -fixed" group="options" expanded="true">

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

  ```sh
  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.

  ```sh
  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.

  ```sh
  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.

  ```sh
  pdftotext -layout -colspacing 0.3 input.pdf output.txt
  ```

</Accordion>

<Accordion label="Selección de páginas: -f y -l" group="options">

Extrae un rango de páginas específico:

```sh
# 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:

```sh
pdftotext -f 1 -l 5 -upw "mypass" -layout report.pdf pages1-5.txt
```

</Accordion>

<Accordion label="Salida estructurada: -bbox, -tsv, -htmlmeta" group="options">

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.

  ```sh
  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`.

  ```sh
  pdftotext -tsv input.pdf output.tsv
  ```

  <Notice type="info" title="El modo TSV requiere poppler ≥ 22.05.0">
  Disponible en Ubuntu 22.10+, Fedora 37+, Arch rolling. Comprueba tu versión con `pdftotext --version`.
  </Notice>

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

  ```sh
  pdftotext -htmlmeta input.pdf output.html
  ```

- **`-bbox-layout`**: Como `-bbox` pero conserva la estructura del diseño en la salida HTML.

</Accordion>

<Accordion label="Limpieza de texto: -nodiag, -remove-hyphens, -eol" group="options">

- **`-nodiag`**: Descarta el texto diagonal. Es útil para eliminar texto de marcas de agua que aparece en ángulo en el PDF.

  ```sh
  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

  ```sh
  pdftotext -remove-hyphens all input.pdf output.txt
  pdftotext -remove-hyphens soft input.pdf output.txt
  ```

  <Notice type="warning" title="-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`.
  </Notice>

- **`-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.

  ```sh
  pdftotext -eol dos input.pdf output.txt
  ```

</Accordion>

<Accordion label="Codificación de salida y otras opciones: -enc, -nopgbrk, -q, -r" group="options">

- **`-enc encoding`**: Establece la codificación del texto de salida. Valores comunes: `UTF-8`, `ISO-8859-1`, `ASCII`, `UCS-2`.

  ```sh
  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.

  ```sh
  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`).

</Accordion>

Puedes ver la lista completa de opciones con:

```sh
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.

  ```sh
  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.

  ```sh
  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`:

```sh
# 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

<Notice type="warning" title="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.
</Notice>

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:

```sh
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`:

```sh
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:

```sh
# 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ó:

```sh
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:

```sh
# 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:

```sh
# 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](/es/stirling-pdf-manipulacion-autoalojada/) — 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:

```sh
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:

```sh
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:

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

<Notice type="info" title="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".
</Notice>

### calibre ebook-convert

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

```sh
ebook-convert input.pdf output.txt
```

## Procesamiento por lotes y scripts prácticos

### Extraer todos los PDFs de un directorio

```sh
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:

```sh
pdftotext document.pdf - | grep -i "keyword"
```

Después de extraer texto, puedes [cambiar mayúsculas y minúsculas con sed](/es/sed-cambiar-mayusculas-minusculas/) 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:

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

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

```sh
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](/es/comparar-carpetas-diferencias-contenido/) para verificar que se crearon todos los archivos de salida esperados.

## Solución de problemas comunes de pdftotext

<Accordion label="Salida vacía (PDF escaneado)" group="troubleshooting" expanded="true">

**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](#cuando-pdftotext-no-funciona-ocr-para-pdfs-escaneados) más arriba).

</Accordion>

<Accordion label="Texto corrupto o faltante" group="troubleshooting">

**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:
   ```sh
   pdftotext -raw input.pdf output.txt
   ```
2. Fuerza la codificación UTF-8:
   ```sh
   pdftotext -enc UTF-8 input.pdf output.txt
   ```
3. Si poppler no puede con ello, prueba `mutool draw -F txt` como alternativa.

</Accordion>

<Accordion label="Detección de columnas deficiente" group="troubleshooting">

**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:

```sh
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.

</Accordion>

<Accordion label="Texto de marca de agua en la salida" group="troubleshooting">

**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):

```sh
pdftotext -nodiag input.pdf output.txt
```

</Accordion>

<Accordion label="Entender los códigos de salida de pdftotext" group="troubleshooting">

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:

```sh
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
```

</Accordion>

## 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](/es/unir-pdf-linux/) o [autoalojar Stirling PDF](/es/stirling-pdf-manipulacion-autoalojada/) 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](/es/securizar-servidor-ssh-linux/) y [comprobar puertos remotos con nc](/es/comprobar-puerto-remoto-linux-nc/).