obsidian-dix/DIX-Notes/INSTALAR TESSERACT-OCT.md

4.2 KiB

# 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


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"
}

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)"
}