Registry
T2200 — programmatic fill compatibility
Declaration of Conditions of Employment · Canada Revenue Agency (CRA) · T2200 E (25). Tested 2026-08-07 on the unmodified upstream blank — every number below comes from a recorded run, not from documentation.
Verdict at a glance
| Tool | Version | Result | Detail |
|---|---|---|---|
| pdfops API | hosted, tested 2026-08-07 | fails at parse | encrypted_pdf: this PDF is encrypted (often with an empty user password: it opens in viewers but rejects programmatic inspection). Decrypt it first — e.g. `qpdf --decrypt in.pdf out.pdf` — then retry. Verified examp |
| pdf-lib | 1.17.1 | fails at load | Error: Input document to `PDFDocument.load` is encrypted. You can use `PDFDocument.load(..., { ignoreEncryption: true })` if you wish to load the document anyways. |
| @cantoo/pdf-lib (fork) | 2.6.5 | fails at load | Error: Input document to `PDFDocument.load` is encrypted. You can use `PDFDocument.load(..., { ignoreEncryption: true })` if you wish to load the document anyways. |
| pypdf | 6.15.0 | text fields verified (46/46) | 46 text fields written and re-read (text fields only) |
| pdftk-java | 3.3.3 | verified (80/80) | 80 fields filled via FDF and re-dumped |
| qpdf --check | 11.9.0 | structurally clean | errors that qpdf cannot detect |
| poppler render check | no filled output to render | no filled PDF from the pdf-lib leg to render |
File facts
- Source: https://www.canada.ca/content/dam/cra-arc/formspubs/pbg/t2200/t2200-fill-25e.pdf (issuer page: here)
- Blank tested: cra-t2200.pdf · 329 KB · sha256
2e62314526f7a6f3c3a64f49d962d70a109500898e263066d7a899484aeeee89 - License: Government of Canada (Crown copyright). Non-commercial reproduction is permitted without further permission provided the source URL and title are cited (Government of Canada terms).
- Structure: ? pages · no AcroForm · encrypted
- Fields: not enumerable on the unmodified file (post-load access failed: Error: Expected instance of PDFDict, but got instance of undefined)
Quirks & limitations
- Every Canadian employer with home-office employees signs a stack of these each tax season; HR platforms bulk-fill them.
- canada.ca tarpits plain curl fetches; the blank was retrieved in-page through a real browser session (same behavior first seen on TD1). The revision fetched is the current 2025 English fillable (t2200-fill-25e).
Tested request
The unmodified blank is rejected at parse time, so there is no working direct request to show — see the quirks above for the verified decrypt-first workaround.
Frequently asked
Can I fill the T2200 programmatically?
Not directly with pdf-lib-family tooling — the unmodified blank ships encrypted, and pdf-lib and the pdfops API refuse it at parse time. Verified workaround: decrypt first (qpdf --decrypt), after which it fills as a normal AcroForm; pypdf with the cryptography extra opens it directly (text fields only). pdftk-java fills the encrypted blank natively — 80 fields across all field types via fill_form, no decrypt step — and writes a decrypted output.
Why do PDF libraries reject the T2200?
The blank is AES-encrypted with an empty user password: anyone can open it in a viewer, but the owner password restricts modification, and strict parsers refuse the file outright. qpdf --decrypt removes the restriction losslessly; pypdf can open it directly when its optional cryptography dependency is installed; pdftk-java both reads and fills it natively (its output is decrypted).
← All forms in the registry · Inspect your own PDF · Make a flat PDF fillable