ToolStore Agent
feat: toolsets with @tool decorator, in-process execution, no auto-install
c37b3fd
|
Raw
History Blame Contribute Delete
5.48 kB
# pdf‑toolkit
Extract text, read metadata, list form fields, and merge PDF files.
Layout‑aware extraction that handles the messy reality of multi‑column PDFs,
encrypted files, and Unicode — so agents don't have to guess.
---
## When to Use This Toolset
- Extracting readable text from a PDF for analysis or search
- Reading PDF metadata (author, title, page count) without opening the file
- Listing fillable form fields before filling them
- Merging multiple PDFs into a single document
- Inspecting PDF structure before automated processing
---
## Decision Tree: Which Extraction Method?
```
What do you need from the PDF?
├── All readable text → pdf_extract (layout‑aware via pdfplumber)
├── Tables from PDF → pdf_extract + note: pdfplumber can also extract tables
├── Just metadata → pdf_meta (fast, no page processing)
├── Form fields → pdf_form_fields (lists names, types, values)
├── Merge PDFs → pdf_merge (preserves order)
└── Split/extract pages → pdf_extract with first_page/last_page params
```
---
## Process
### Extracting Text
```
Inspect → Extract → Review
```
1. **Inspect** with `pdf_meta` to check page count and encryption status
2. **Extract** with `pdf_extract` — use `first_page`/`last_page` for large docs
3. **Review** the output for formatting issues (common in scanned PDFs, right‑to‑left text, or complex tables)
### Working with Form Fields
```
Inspect → Map → Fill → Validate
```
1. **Inspect** with `pdf_form_fields` to list all field names, types, and current values
2. **Map** your data to the field names discovered in step 1
3. **Fill** the form using PyPDF2's `update_page_form_field_values`
4. **Validate** by re‑reading the fields to confirm values were set
### Merging Documents
```
Collect → Order → Merge → Verify
```
1. **Collect** all input PDF paths
2. **Order** them in the sequence you want in the output
3. **Merge** with `pdf_merge`
4. **Verify** with `pdf_meta` to check the output page count matches the sum
---
## Function Reference
### `pdf_extract`
Extract readable text using layout‑aware parsing.
**When to use:** Whenever you need text content from a PDF — search, analysis, indexing.
**Args:**
- `filepath` (str) — Path to the PDF
- `first_page` (int) — First page to extract (1‑based, default 1)
- `last_page` (int) — Last page to extract (0 = all pages)
**Returns:** `{text, pages, total, range}`
**Gotcha:** Scanned PDFs (images of text) will return empty text. You'd need OCR (not yet included).
Check `pdf_meta` for the producer — "scanner" or "Image" in the producer field is a clue.
### `pdf_meta`
Read metadata without processing page content.
**When to use:** Quick inspection before extracting, or when you only need structural info.
**Args:**
- `filepath` (str) — Path to the PDF
**Returns:** `{filename, pages, title, author, subject, creator, producer, encrypted, file_size_bytes}`
### `pdf_merge`
Merge multiple PDFs into one, preserving page order.
**When to use:** Combining chapters, appendices, or separate scans into a single document.
**Args:**
- `inputs` (list) — Ordered list of file paths to merge
- `output` (str) — Path for the merged output PDF
**Returns:** `{written, pages, sources}`
### `pdf_form_fields`
List all fillable form fields with types, current values, and options.
**When to use:** Before programmatically filling a PDF form — you need to know the field names.
**Args:**
- `filepath` (str) — Path to the PDF
**Returns:** `{has_fields, count, fields: [{name, type, value, flags, options}], filename}`
**Field type guide:**
| Type | Meaning |
|------|---------|
| `Tx` | Text field |
| `Btn` | Checkbox or radio button |
| `Ch` | Dropdown / choice |
| `Sig` | Signature field |
---
## Common Patterns
### Pattern: Extract and Analyze
```
pdf_meta → page count, encryption status
pdf_extract → full text
text_stats (from text-transform toolset) → readability, word count
```
### Pattern: Form Auto‑Fill
```
pdf_form_fields → list of field names and types
Map data to fields
Use PyPDF2 to fill fields programmatically
pdf_form_fields → verify values were set
```
### Pattern: Document Assembly
```
pdf_meta on each input → sanity check
pdf_merge → combine in order
pdf_meta on output → verify page count = sum of inputs
```
---
## Guidelines
### Do
- Always check `pdf_meta` first to understand encryption and page count
- Use `first_page`/`last_page` for large documents (100+ pages)
- Verify merged output with `pdf_meta` — page count should equal sum of inputs
- Handle the case where `pdf_extract` returns empty text (scanned PDF)
### Don't
- Don't try to extract text from password‑protected PDFs (check `encrypted` in `pdf_meta`)
- Don't assume extracted text preserves exact original layout — it's best‑effort
- Don't merge PDFs with different page sizes without checking
- Don't fill forms without first inspecting field types (checkbox vs dropdown vs text)
### Limitations to Communicate
- **Scanned PDFs**: text extraction may return empty — mention this when it happens
- **Highly formatted documents**: pdfplumber does its best but may misorder text in complex layouts
- **Password protection**: encrypted PDFs must be unlocked before processing
- **Form filling**: `pdf_form_fields` lists fields; actual filling requires additional PyPDF2 calls