#!/usr/bin/env bash # pdf-fzf — interactive PDF text search via fzf + bat # Deps: pdftotext (poppler-utils), fzf, bat set -euo pipefail DIR="${1:-.}" CACHE=$(mktemp -d /tmp/pdf-fzf.XXXXXX) trap 'rm -rf "$CACHE"' EXIT MAPFILE="$CACHE/map.tsv" INDEX="$CACHE/index.tsv" echo "Indexing PDFs in '$DIR'..." >&2 find "$DIR" -type f -iname "*.pdf" | sort | while read -r pdf; do hash=$(printf '%s' "$pdf" | md5sum | cut -c1-8) txtfile="$CACHE/${hash}.txt" pdftotext "$pdf" - 2>/dev/null > "$txtfile" || continue [[ ! -s "$txtfile" ]] && continue printf '%s\t%s\t%s\n' "$hash" "$pdf" "$txtfile" >> "$MAPFILE" awk -v src="$pdf" -F'\t' \ 'NF { printf "%s\t%d\t%s\n", src, NR, $0 }' "$txtfile" done > "$INDEX" PDF_COUNT=$(wc -l < "${MAPFILE:-/dev/null}" 2>/dev/null || echo 0) LINE_COUNT=$(wc -l < "$INDEX") echo "Indexed $LINE_COUNT lines from $PDF_COUNT PDFs." >&2 # Preview script — receives the raw fzf line, shows bat at matched line PREVIEW_SH="$CACHE/preview.sh" cat > "$PREVIEW_SH" </dev/null &)" \ < "$INDEX"