129 lines
4.1 KiB
Markdown
129 lines
4.1 KiB
Markdown
```bash
|
|
# instalar tesseract-ocr
|
|
sudo apt update && sudo apt upgrade -y
|
|
sudo apt install tesseract-ocr tesseract-ocr-spa poppler-utils
|
|
sudo apt install tesseract-ocr-all poppler-utils
|
|
```
|
|
|
|
```bash
|
|
|
|
|
|
function getTxtFromPdf() {
|
|
local pdf_path="$1"
|
|
local base_name=$(basename "$pdf_path" .pdf)
|
|
local tmp_prefix="pagina"
|
|
|
|
# Limpiar residuos anteriores
|
|
rm -f ${tmp_prefix}-*.png ${tmp_prefix}-*.txt salida_${base_name}.txt
|
|
|
|
# Convertir PDF a PNG por página
|
|
pdftoppm "$pdf_path" "$tmp_prefix" -png
|
|
|
|
# OCR cada imagen y concatenar en un solo archivo de salida
|
|
for img in ${tmp_prefix}-*.png; do
|
|
echo "Procesando $img..."
|
|
tesseract "$img" temp -l spa
|
|
cat temp.txt >> salida_${base_name}.txt
|
|
echo -e "\n\n---- FIN DE PÁGINA ----\n\n" >> salida_${base_name}.txt
|
|
done
|
|
|
|
rm -f temp.txt
|
|
echo "OCR completado. Archivo final: salida_${base_name}.txt"
|
|
}
|
|
|
|
```
|
|
|
|
```bash
|
|
getHighQualityTxtFromPdf() {
|
|
# Verificar que se proporcionó al menos un argumento
|
|
if [[ $# -lt 1 ]]; then
|
|
echo "Error: Debes especificar la ruta del archivo PDF." >&2
|
|
return 1
|
|
fi
|
|
|
|
local pdf_path="$1"
|
|
local base_name
|
|
base_name=$(basename "$pdf_path" .pdf)
|
|
local output_file="${2:-salida_hq_${base_name}.txt}" # Permitir archivo de salida opcional
|
|
local tmp_prefix="hq_pagina"
|
|
local lang="spa"
|
|
local dpi=1000
|
|
local oem=1
|
|
local psm=6
|
|
|
|
# Verificar existencia del archivo
|
|
if [[ ! -f "$pdf_path" ]]; then
|
|
echo "Error: El archivo '$pdf_path' no existe." >&2
|
|
return 1
|
|
fi
|
|
|
|
# Verificar dependencias
|
|
if ! command -v pdftoppm &> /dev/null || ! command -v tesseract &> /dev/null; then
|
|
echo "Error: Se requieren 'pdftoppm' y 'tesseract'." >&2
|
|
echo "Instala con: sudo apt install poppler-utils tesseract-ocr tesseract-ocr-spa" >&2
|
|
return 1
|
|
fi
|
|
|
|
# Limpiar residuos anteriores
|
|
rm -f "${tmp_prefix}-"*.png "$output_file" 2>/dev/null
|
|
|
|
echo "Convirtiendo PDF a imágenes de alta calidad (${dpi} DPI)..."
|
|
if ! pdftoppm -png -r "$dpi" -aa yes -aaVector yes "$pdf_path" "$tmp_prefix"; then
|
|
echo "Error al convertir PDF a imágenes." >&2
|
|
return 1
|
|
fi
|
|
|
|
# Contar número total de páginas generadas
|
|
local page_imgs=("${tmp_prefix}-"*.png)
|
|
local total_pages=${#page_imgs[@]}
|
|
if [[ $total_pages -eq 0 ]]; then
|
|
echo "Error: No se generaron imágenes del PDF." >&2
|
|
return 1
|
|
fi
|
|
|
|
echo "" > "$output_file"
|
|
|
|
local page_count=0
|
|
for img in "${page_imgs[@]}"; do
|
|
((page_count++))
|
|
echo "Procesando página $page_count: $img"
|
|
|
|
# Crear archivo temporal para esta página
|
|
local tmp_txt_file
|
|
tmp_txt_file=$(mktemp --suffix=.txt)
|
|
|
|
# OCR con configuraciones avanzadas
|
|
if ! tesseract "$img" "$tmp_txt_file" -l "$lang" --dpi "$dpi" --oem "$oem" --psm "$psm" \
|
|
-c tessedit_pageseg_mode=$psm \
|
|
-c preserve_interword_spaces=1 \
|
|
-c textord_debug_tabfind=0 \
|
|
-c textord_min_linesize=2.5 2>/dev/null; then
|
|
echo "Advertencia: OCR falló en $img. Reintentando con configuración básica..." >&2
|
|
tesseract "$img" "$tmp_txt_file" -l "$lang" --dpi "$dpi" 2>/dev/null || continue
|
|
fi
|
|
|
|
# Agregar texto al archivo final
|
|
cat "${tmp_txt_file}.txt" >> "$output_file"
|
|
|
|
# Separador de página
|
|
if [[ $page_count -lt $total_pages ]]; then
|
|
echo -e "\n\n---- FIN DE PÁGINA $page_count ----\n\n" >> "$output_file"
|
|
fi
|
|
|
|
# Limpieza
|
|
rm -f "$img" "${tmp_txt_file}.txt"
|
|
done
|
|
|
|
echo "Realizando post-procesamiento..."
|
|
sed -i 's/fi/fi/g; s/fl/fl/g; s/ff/ff/g; s/ffi/ffi/g; s/ffl/ffl/g' "$output_file"
|
|
sed -i '/^[[:space:]]*$/d' "$output_file"
|
|
sed -i 's/[[:space:]]\+/ /g' "$output_file"
|
|
|
|
echo -e "\n=============================="
|
|
echo " OCR COMPLETADO EXITOSAMENTE "
|
|
echo "=============================="
|
|
echo "Archivo final: $output_file"
|
|
echo "Páginas procesadas: $page_count"
|
|
echo "Tamaño final: $(du -h "$output_file" | cut -f1)"
|
|
}
|
|
``` |