--- date: 2026-01-28 title: Pdf Placeholder Field Positioning --- ## Overview This feature enables automatic field placement in PDFs using placeholder text, eliminating the need for manual coordinate-based positioning. It supports two complementary workflows: 1. **Automatic detection on upload** - PDFs containing structured placeholders like `{{signature, r1}}` have fields created automatically when uploaded 2. **API placeholder positioning** - Developers can reference any text in a PDF to position fields instead of calculating coordinates ## Goals - Allow users to prepare documents in Word/Google Docs with placeholders that become signature fields - Reduce friction for document preparation workflows - Provide API developers with a simpler alternative to coordinate-based field positioning - Support documents with repeated placeholders (e.g., initials on every page) ## Placeholder Format (Automatic Detection) ``` {{FIELD_TYPE, RECIPIENT, option1=value1, option2=value2}} ``` ### Components - **FIELD_TYPE** (required): One of `signature`, `initials`, `name`, `email`, `date`, `text`, `number`, `radio`, `checkbox`, `dropdown` - **RECIPIENT** (required): `r1`, `r2`, `r3`, etc. - identifies which recipient the field belongs to - **OPTIONS** (optional): Key-value pairs like `required=true`, `fontSize=14`, `readOnly=true` ### Examples - `{{signature, r1}}` - Signature field for first recipient - `{{text, r1, required=true, label=Company Name}}` - Required text field with label - `{{number, r2, minValue=0, maxValue=100}}` - Number field with validation ### Behavior - Placeholders without recipient identifiers (e.g., `{{signature}}`) are skipped during automatic detection - reserved for API use - Invalid field types are silently skipped - Placeholder text is covered with white rectangles after field creation ## API Placeholder Positioning The `/api/v2/envelope/field/create-many` endpoint accepts `placeholder` as an alternative to coordinates: ```json { "recipientId": 123, "type": "SIGNATURE", "placeholder": "{{signature}}" } ``` ### Parameters | Parameter | Type | Description | | ------------- | ------- | -------------------------------------------- | | `placeholder` | string | Text to search for in the PDF | | `width` | number | Optional override (percentage) | | `height` | number | Optional override (percentage) | | `matchAll` | boolean | When true, creates fields at ALL occurrences | ### matchAll Behavior - Default (`false`): Only first occurrence gets a field - `true`: Creates a field at every occurrence of the placeholder text This is useful for documents requiring initials on every page. ## Implementation Components ### Core Functions - `extractPlaceholdersFromPDF()` - Scans PDF for `{{...}}` patterns with recipient identifiers - `removePlaceholdersFromPDF()` - Covers placeholder text with white rectangles - `whiteoutRegions()` - Low-level helper for drawing white boxes on PDF pages - `parseFieldTypeFromPlaceholder()` - Converts placeholder field type to FieldType enum - `parseFieldMetaFromPlaceholder()` - Parses options into fieldMeta format ### Integration Points 1. **Upload flow** (`create-envelope.ts`, `create-envelope-items.ts`) - Extract placeholders at upload time (before saving to storage) - Pass placeholders in-memory to envelope creation - Create placeholder recipients if none provided - Create fields within the same transaction 2. **API field creation** (`create-envelope-fields.ts`) - Accept `placeholder` as alternative to coordinates - Search PDF for placeholder text - Resolve position from bounding box - Support `matchAll` for multiple occurrences ### Field Meta Parsing The following properties are explicitly parsed: - `required`, `readOnly` → boolean - `fontSize`, `minValue`, `maxValue`, `characterLimit` → number - Other properties pass through as strings Note: Signature fields do not support fieldMeta options. ## Testing ### E2E Tests **UI Tests** (`e2e/auto-placing-fields/`): - Single recipient placeholder detection - Multiple recipient placeholder detection - Field configuration from placeholder options - Skipping placeholders without recipient identifiers - Skipping invalid field types **API Tests** (`e2e/api/v2/placeholder-fields-api.spec.ts`): - Placeholder-based field positioning - Width/height overrides - Error on placeholder not found - Mixed coordinate and placeholder positioning - First occurrence only (default) - All occurrences with `matchAll: true` ## Documentation ### User Documentation `/users/documents/pdf-placeholders` - Explains: - Placeholder format and syntax - Supported field types - Recipient identifiers - Available options per field type - Troubleshooting ### Developer Documentation `/developers/public-api/reference` - Documents: - Coordinate-based positioning (existing) - Placeholder-based positioning (new) - matchAll parameter - Mixing both methods ## Edge Cases Handled 1. **No placeholders found** - Original PDF returned unchanged 2. **Placeholder not found (API)** - Returns error with placeholder text 3. **Multiple occurrences** - First only by default, all with `matchAll: true` 4. **No recipient identifier** - Skipped during auto-detection, works for API 5. **Invalid field type** - Skipped during auto-detection 6. **Signature field with options** - Options ignored (signature doesn't support fieldMeta) ## Future Considerations - Support for placeholder text styles (bold, underline) to indicate field properties - Template-level placeholder mapping for reusable configurations - Placeholder validation in document editor before sending