# Populating Fillable PDF Forms
After collecting data via Chatfield interview, populate fillable PDF forms with the results.
## Process Overview
```plantuml
@startuml Populating-Fillable
title Populating Fillable PDF Forms
start
:Parse Chatfield output;
:Read .form.json for metadata;
:Create .values.json;
repeat
:Validate .values.json
(see validation checklist);
if (All checks pass?) then (yes)
else (no)
:Fix .values.json;
endif
repeat while (All checks pass?) is (no)
->yes;
:Execute fill_fillable_fields.py;
:**✓ PDF POPULATION COMPLETE**;
stop
@enduml
```
## Process
### 1. Parse Chatfield Output
Run Chatfield with `--inspect` for a final summary of all collected data:
```bash
python -m chatfield.cli --state='.chatfield/interview.db' --interview='.chatfield/interview.py' --inspect
```
Extract `field_id` and the proper value for each field.
### 2. Create `.values.json`
Create `.values.json` in the `.chatfield/` directory with the collected field values:
```json
[
{"field_id": "name", "page": 1, "value": "John Doe"},
{"field_id": "age_years", "page": 1, "value": 25},
{"field_id": "age_display", "page": 1, "value": "25"},
{"field_id": "checkbox_over_18", "page": 1, "value": "/1"}
]
```
**Value selection priority:**
- **CRITICAL**: If a language cast exists for a field (e.g., `.as_lang_es`, `.as_lang_fr`), **always prefer it** over the raw value
- This ensures forms are populated in the form's language, not the conversation language
- The language cast name matches the form's language code (e.g., `as_lang_es` for Spanish forms)
- Only use the raw value if no language cast exists
**Boolean conversion for checkboxes:**
- Read `.form.json` for `checked_value` and `unchecked_value`
- Typically: `"/1"` or `"/On"` for checked, `"/Off"` for unchecked
- Convert Python `True`/`False` → PDF checkbox values
### 3. Validate `.values.json`
**Before running the population script**, validate the `.values.json` file against the validation checklist below:
- Verify all field_ids from `.form.json` are present
- Check checkbox values match `checked_value`/`unchecked_value` from `.form.json`
- Ensure numeric fields use numbers, not strings
- Confirm language cast values are used when available
If validation fails, fix the `.values.json` file and re-validate until all checks pass.
### 4. Populate PDF
Once validation passes, run the population script (note, the `scripts` directory is relative to the base directory for this skill):
```bash
python scripts/fill_fillable_fields.py .pdf .chatfield/.values.json .done.pdf
## Validation Checklist
**Missing fields:**
- Check that all field_ids from `.form.json` are in `.values.json`
- Verify field_id spelling matches exactly
**Wrong checkbox values:**
- Check `checked_value`/`unchecked_value` in `.form.json`
- Common values: `/1`, `/On`, `/Yes` for checked; `/Off`, `/No` for unchecked
**Type errors:**
- Ensure numeric fields use numbers, not strings: `25` not `"25"`
- Ensure boolean checkboxes use proper values from `.form.json`
**Language translation (for translated forms):**
- Ensure language cast value is used when it exists (e.g., `as_lang_es` for Spanish forms)