rusty-pdfgrep 0.1.0

Grep through PDF files — a Rust port of Hans-Peter Deifel's `pdfgrep(1)` with lopdf-backed text extraction, regex + fancy-regex pluggable engines, --password retry for encrypted PDFs, GNU-grep-compatible color output, recursive walking with fnmatch include/exclude, and a typed library API.
Documentation
# Compatibility — rusty-pdfgrep vs upstream `pdfgrep(1)` v2.2.0

Populated during Polish phase. v0.1.0 release.

## Flag Surface

| Flag | Upstream | rusty-pdfgrep Default | rusty-pdfgrep Strict |
|---|---|---|---|
| `-r` / `--recursive` ||||
| `-R` / `--dereference-recursive` || ✗ (deferred to v0.2.0) ||
| `-n` / `--page-number` ||||
| `-c` / `--count` || ✓ (per-file) ||
| `-h` / `--no-filename` ||||
| `-H` / `--with-filename` ||||
| `-i` / `--ignore-case` ||||
| `-v` / `--invert-match` ||||
| `-l` / `--files-with-matches` ||||
| `-L` / `--files-without-match` ||||
| `-m N` / `--max-count` ||||
| `-o` / `--only-matching` ||||
| `-q` / `--quiet` ||||
| `-Z` / `--null` || ✓ (with `-l`/`-L`) ||
| `-F` / `--fixed-strings` ||||
| `-P` / `--perl-regexp` | ✓ (libpcre2) | ✓ (`fancy-regex`) ||
| `--color` ||||
| `--page-range N-M` ||||
| `--include=GLOB` ||||
| `--exclude=GLOB` ||||
| `--password PWD` (repeated) ||||
| `--max-stdin-bytes BYTES` || ✓ (BREAKING-CHANGE — default 512 MiB) ||
| `--password-list FILE` ||||
| `-w` / `--word-regexp` ||||
| `-A`/`-B`/`-C` context || ✗ (deferred) ||
| `--cache` || ✗ (deferred) ||
| `--unac` || ✗ (deferred) ||
| `completions <shell>` subcommand || ✓ (Default-mode only) ||

## Behavioral Divergences

### Default-mode (BREAKING-CHANGE)

- Conflicting flag pairs (e.g., `-F` + `-P`) — Default rejects at parse time via clap. Strict uses last-wins (matches upstream).

### `-P` engine

- `fancy-regex` (pure-Rust) instead of libpcre2. Recursive patterns, callouts, conditional patterns diverge. Most common PCRE features (lookaround, named groups, backreferences) work as upstream.

### stdin cap

- 512 MiB default; configurable via `--max-stdin-bytes BYTES`. Upstream buffers unbounded.

### Stream policy

- Match lines → STDOUT (matches upstream)
- Warnings, errors → STDERR (matches upstream)

### Library API

- `PdfGrep`, `PdfGrepBuilder`, `Match` (`#[non_exhaustive]`), `PdfGrepError` (`#[non_exhaustive]`). `default-features = false` strips all CLI deps.