Skip to main content

CLI tool to rename academic papers using AI-extracted metadata

Project description

namingpaper

A CLI tool that renames academic PDF papers using AI-extracted metadata.

Before: 1-s2.0-S0304405X13000044-main.pdf

After: Fama and French, (1993, JFE), Common risk factors in the returns....pdf

Features

  • Extracts metadata (authors, year, journal, title) from PDFs using AI
  • Supports multiple AI providers: Claude, OpenAI, Gemini, and Ollama (local)
  • Batch processing - rename entire directories at once
  • Custom templates - flexible filename formatting
  • Dry-run mode by default for safety
  • Copy to output directory (keeps original file)
  • Handles filename collisions (skip, increment, or overwrite)
  • Common journal abbreviations (JFE, AER, QJE, etc.)

Installation

# Using uv (recommended)
uv tool install namingpaper

# Using pipx
pipx install namingpaper

# With optional providers
uv tool install "namingpaper[openai]"    # OpenAI support
uv tool install "namingpaper[gemini]"    # Gemini support
# or with pipx
pipx install "namingpaper[openai]"
pipx install "namingpaper[gemini]"

# Update to latest version
uv tool upgrade namingpaper
# or
pipx upgrade namingpaper

# Or install from source
git clone https://github.com/DanTsai0903/namingpaper.git
cd namingpaper
uv sync

Quick Start

The default provider is Ollama (local, no API key needed). Install it from ollama.com, then pull the required model:

ollama pull llama3.1:8b

# Preview the rename (dry run)
namingpaper rename paper.pdf

# Actually rename the file
namingpaper rename paper.pdf --execute

# Batch rename all PDFs in a directory
namingpaper batch ~/Downloads/papers --execute

Using Cloud Providers

If you want to use Claude, OpenAI, or Gemini instead of local Ollama:

# Option 1: Set environment variable (temporary, current session only)
export NAMINGPAPER_ANTHROPIC_API_KEY=sk-ant-api03-xxxxx
namingpaper rename paper.pdf -p claude

# Option 2: Add to shell profile (permanent)
# For zsh (macOS default):
echo 'export NAMINGPAPER_ANTHROPIC_API_KEY=sk-ant-api03-xxxxx' >> ~/.zshrc
source ~/.zshrc

# For bash:
echo 'export NAMINGPAPER_ANTHROPIC_API_KEY=sk-ant-api03-xxxxx' >> ~/.bashrc
source ~/.bashrc

# Option 3: Use config file (~/.namingpaper/config.toml)
mkdir -p ~/.namingpaper
cat > ~/.namingpaper/config.toml << EOF
ai_provider = "claude"
anthropic_api_key = "sk-ant-api03-xxxxx"
EOF

Usage

Rename Command

Rename a single PDF file.

namingpaper rename <pdf_path> [OPTIONS]

Options:
  -x, --execute              Actually rename (default is dry-run)
  -y, --yes                  Skip confirmation prompt
  -p, --provider TEXT        AI provider (claude, openai, gemini, ollama)
  -m, --model TEXT           Override the default model for the provider
  --ocr-model TEXT           Override Ollama OCR model (default: deepseek-ocr)
  -o, --output-dir DIR       Copy to directory (keeps original)
  -c, --collision STRATEGY   Handle collisions: skip, increment, overwrite

Batch Command

Rename multiple PDF files in a directory.

namingpaper batch <directory> [OPTIONS]

Options:
  -x, --execute              Actually rename (default is dry-run)
  -y, --yes                  Skip confirmation prompt
  -r, --recursive            Scan subdirectories
  -f, --filter PATTERN       Only process files matching pattern (e.g., '2023*')
  -p, --provider TEXT        AI provider (claude, openai, gemini, ollama)
  -m, --model TEXT           Override the default model for the provider
  --ocr-model TEXT           Override Ollama OCR model (default: deepseek-ocr)
  -t, --template TEXT        Filename template or preset name
  -o, --output-dir DIR       Copy to directory (keeps originals)
  -c, --collision STRATEGY   Handle collisions: skip, increment, overwrite
  --parallel N               Concurrent extractions (default: 1)
  --json                     Output results as JSON

Templates Command

Show available filename templates.

namingpaper templates

Examples

Single File

# Dry run with Ollama (default)
namingpaper rename paper.pdf

# Execute rename
namingpaper rename paper.pdf --execute

# Copy to a different folder (keeps original)
namingpaper rename paper.pdf -o ~/Papers --execute

# Use Claude
namingpaper rename paper.pdf -p claude --execute

# Use OpenAI
namingpaper rename paper.pdf -p openai --execute

# Auto-increment on collision
namingpaper rename paper.pdf -c increment --execute

# Skip confirmation
namingpaper rename paper.pdf -xy

Batch Processing

# Preview all renames in a directory
namingpaper batch ~/Downloads/papers

# Execute batch rename
namingpaper batch ~/Downloads/papers --execute

# Recursive scan with subdirectories
namingpaper batch ~/Downloads/papers -r --execute

# Filter by pattern (only 2023 papers)
namingpaper batch ~/Downloads/papers -f "2023*" --execute

# Use compact template
namingpaper batch ~/Downloads/papers -t compact --execute

# Custom template
namingpaper batch ~/Downloads/papers -t "{year} - {authors} - {title}" --execute

# Copy to organized folder
namingpaper batch ~/Downloads -o ~/Papers/Organized --execute

# Parallel processing (faster)
namingpaper batch ~/Downloads/papers --parallel 4 --execute

# Output as JSON (for scripting)
namingpaper batch ~/Downloads/papers --json

View Configuration

namingpaper config --show

Filename Templates

Templates control how the output filename is formatted.

Preset Templates

Name Pattern Example
default {authors}, ({year}, {journal}), {title} Fama and French, (1993, JFE), Common risk....pdf
compact {authors} ({year}) {title} Fama and French (1993) Common risk....pdf
full {authors}, ({year}, {journal_full}), {title} Fama and French, (1993, Journal of Financial Economics), Common....pdf
simple {authors}_{year}_{title} Fama and French_1993_Common risk....pdf

Template Placeholders

Placeholder Description Example
{authors} Author surnames (comma-separated, "et al" if >3) Fama and French
{authors_full} Author full names Eugene F. Fama and Kenneth R. French
{authors_abbrev} Surname with initials Fama, E. F. and French, K. R.
{year} Publication year 1993
{journal} Journal abbreviation (or full name if no abbrev) JFE
{journal_abbrev} Journal abbreviation only JFE
{journal_full} Full journal name Journal of Financial Economics
{title} Paper title (truncated) Common risk factors in the returns...

Custom Templates

# Year-first format
namingpaper batch ~/papers -t "{year} - {authors} - {title}"

# Minimal format
namingpaper batch ~/papers -t "{authors} {year}"

# Full journal name
namingpaper batch ~/papers -t "{authors}, ({year}, {journal_full}), {title}"

Configuration

Environment Variables

Variable Description
NAMINGPAPER_ANTHROPIC_API_KEY Anthropic API key (for Claude)
NAMINGPAPER_OPENAI_API_KEY OpenAI API key
NAMINGPAPER_GEMINI_API_KEY Google Gemini API key
NAMINGPAPER_AI_PROVIDER Provider: ollama (default), claude, openai, gemini
NAMINGPAPER_MODEL_NAME Override default text model for provider
NAMINGPAPER_OLLAMA_OCR_MODEL Override Ollama OCR model (default: deepseek-ocr)
NAMINGPAPER_OLLAMA_BASE_URL Ollama API URL (default: http://localhost:11434)
NAMINGPAPER_MAX_AUTHORS Max authors before "et al" (default: 3)
NAMINGPAPER_MAX_FILENAME_LENGTH Max filename length (default: 200)

Config File

Create ~/.namingpaper/config.toml:

# Default provider (ollama requires no API key)
ai_provider = "ollama"
ollama_base_url = "http://localhost:11434"
# ollama_ocr_model = "deepseek-ocr"    # Override OCR model
# model_name = "llama3.1:8b"           # Override text model

# Or use cloud providers
# ai_provider = "claude"
# anthropic_api_key = "sk-ant-..."

# Formatting options
max_authors = 3
max_filename_length = 200

AI Providers

Ollama (Default)

Local LLM, no API key needed. Just have Ollama running. Text is extracted from PDFs using PyMuPDF; the OCR model is only used as a fallback for scanned/image-only PDFs.

# Pull the required model
ollama pull llama3.1:8b        # Text model (parses metadata)

# Optional: OCR fallback for scanned PDFs
ollama pull deepseek-ocr

# Use it (default provider)
namingpaper rename paper.pdf

# Use a different text model
namingpaper rename paper.pdf -m gemma2:9b

# Use a different OCR model (for scanned PDFs)
namingpaper rename paper.pdf --ocr-model llava

Claude

export NAMINGPAPER_ANTHROPIC_API_KEY=sk-ant-...
namingpaper rename paper.pdf -p claude

# Use a specific Claude model
namingpaper rename paper.pdf -p claude -m claude-haiku-4-20250514

OpenAI

uv add "namingpaper[openai]"
export NAMINGPAPER_OPENAI_API_KEY=sk-...
namingpaper rename paper.pdf -p openai

# Use a specific OpenAI model
namingpaper rename paper.pdf -p openai -m gpt-4o-mini

Gemini

uv add "namingpaper[gemini]"
export NAMINGPAPER_GEMINI_API_KEY=...
namingpaper rename paper.pdf -p gemini

# Use a specific Gemini model
namingpaper rename paper.pdf -p gemini -m gemini-2.0-flash

Development

# Clone and setup
git clone https://github.com/DanTsai0903/namingpaper.git
cd namingpaper
uv sync --extra dev

# Run tests
uv run pytest -v

# Run a specific test
uv run pytest tests/test_formatter.py -v

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

namingpaper-0.1.8.tar.gz (81.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

namingpaper-0.1.8-py3-none-any.whl (29.3 kB view details)

Uploaded Python 3

File details

Details for the file namingpaper-0.1.8.tar.gz.

File metadata

  • Download URL: namingpaper-0.1.8.tar.gz
  • Upload date:
  • Size: 81.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.12 {"installer":{"name":"uv","version":"0.9.12"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for namingpaper-0.1.8.tar.gz
Algorithm Hash digest
SHA256 53019e89d967f9f6d7e013630bac3672cd189163ca9a792087bc0f975858e268
MD5 6c765ee64a0dcdaa2560655098dc971c
BLAKE2b-256 00b958addff3874ce8a83d2e808b2be958d75e3b8015fc18f26e0121598589ca

See more details on using hashes here.

File details

Details for the file namingpaper-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: namingpaper-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 29.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.12 {"installer":{"name":"uv","version":"0.9.12"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for namingpaper-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 8787a8f70d4aee6ff750a48c8cd443a14ee675ab234f0aee9a5653e3d935a373
MD5 4a327037a9a72afb50f1e471c370b391
BLAKE2b-256 c41fe58462723629c1d634e9533cdd44b64577ba11696b8fd7dc4b083917b3a6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page