Usa la herramienta pdfread.py junto a este archivo para leer PDFs. Ejecútala de cualquiera de estas dos formas:
- Con uv 0.11+ (recomendado): invoca
pdfread.pydirectamente — el shebang lo ejecuta medianteuv run, y la primera invocación descarga las dependencias y puede tardar un minuto. - Sin uv:
python3 pdfread.py …funciona en cualquier Python 3.10+ que tenga instaladopymupdf4llm>=0.0.17(pip install pymupdf4llm).
El comando search necesita SQLite con FTS5; las versiones de Python administradas por uv y casi todos los sistemas modernos lo incluyen, y el script muestra un error claro si no es así.
Ejecuta pdfread.py --help para ver el uso completo. En resumen:
pdfread.py info FILE— número de páginas, metadatos, esquema/TOC. Empieza aquí.pdfread.py search FILE "términos"— páginas que mencionan las palabras clave, ordenadas por BM25 con un fragmento por coincidencia. La primera búsqueda construye un índice en caché (segundos); las búsquedas posteriores son instantáneas. Los términos se combinan con AND,término*coincide con prefijos,--rawhabilita la sintaxis completa de FTS5 ("frase exacta", OR, NEAR). Solo capa de texto — las páginas escaneadas son invisibles para la búsqueda.pdfread.py text FILE --pages 10-25— texto en markdown para un rango de páginas basado en 1. Las figuras aparecen como marcadores[image: p12-img2 640x480px].pdfread.py image FILE p12-img2— escribe esa figura como PNG e imprime su ruta; visualízala con tu herramienta de lectura de archivos.pdfread.py images FILE --pages 12— lista los identificadores de figuras en las páginas.pdfread.py render FILE 7— renderiza una página completa (o--rect x0,y0,x1,y1para recortar) como PNG; es la alternativa para páginas escaneadas y cualquier cosa que la capa de texto no capture.
Preservando el contexto en PDFs grandes
Para preguntas concretas ("¿dónde menciona el contrato las tarifas de cancelación?"), ejecuta primero search y lee solo las páginas de resultados con text --pages — no es necesario distribuir entre subagentes. El caché del índice es compartido, por lo que los subagentes también pueden usar search sin reconstruirlo.
Para síntesis amplias, no vuelques todo un documento en la conversación principal. En su lugar:
- Ejecuta
infopara obtener el número de páginas y el esquema, y divide el documento en rangos sensatos (por capítulo, o ~15–25 páginas). - Lanza un subagente por rango con instrucciones como: "Ejecuta
<ruta>/pdfread.py text <archivo> --pages 10-25y responde a / resume en como máximo N palabras. Si un marcador[image: ...]parece relevante, extráelo con el comandoimagey revísalo." - Conserva solo los resúmenes/respuestas en la conversación principal y sintetiza a partir de ellos. Revisa páginas específicas tú mismo solo cuando un resumen indique que la respuesta se encuentra allí.
Notas
- No hay OCR: una página sin capa de texto devuelve solo su marcador
[image: ...]de página completa (o una nota de "sin texto extraíble") — extráela o usarendery lee la imagen visualmente. - La extracción es determinista: los identificadores de imagen son estables entre ejecuciones, por lo que un subagente puede reportar un ID que luego se pueda extraer desde la conversación principal.