Registry
CRA TD1 (2026) — programmatic fill compatibility
Personal Tax Credits Return · Canada Revenue Agency (CRA) · TD1 E (26). Tested 2026-08-06 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-06 | 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 (24/24) | 24 text fields written and re-read (text fields only) |
| pdftk-java | 3.3.3 | verified (27/27) | 27 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/td1/td1-fill-26e.pdf (issuer page: here)
- Blank tested: cra-td1.pdf · 229 KB · sha256
4792ecda7b50345d299eeeccd970e0d196103a00c0382cc4dc9b550b2539f18d - 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 and Conditions, canada.ca/en/transparency/terms.html); commercial redistribution requires separate permission from the responsible institution. Unlike this registry's US federal entries (public domain, 17 U.S.C. § 105), Crown-copyright material is reproduced here under those non-commercial terms, with attribution as given above.
- 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
- First non-US jurisdiction in this registry, and it lands on BOTH known failure classes at once. `Producer`/`Creator: Designer 6.3` (Adobe LiveCycle Designer) and dotted field names (`form1[0].Page1[0].Subform1[0].Identification[0].Last_name[0]`) confirm the same LiveCycle hybrid-XFA authoring this registry's IRS entries use — but TD1 is ALSO AES-encrypted (R=4/AESv2) with an empty user password, the same owner-locked pattern documented in ca-fl-100. No other entry in this registry combines hybrid-XFA and owner-password encryption; each of the other two forms with either trait has only one.
- Verified directly with `qpdf --show-encryption`: R=4, empty user password, 'modify forms: allowed' and 'modify annotations: allowed' are both permitted, but 'modify document assembly' and 'modify other' are not — a different permission profile from ca-fl-100 (P=-1036 here vs. P=-1084 there, which additionally blocks 'extract for any purpose' and 'modify annotations'). The two encrypted forms in this registry are not interchangeable cases; the restriction bits differ per-issuer.
- pypdf opens the encrypted original directly with an empty-string decrypt call (`reader.decrypt('')` returns PasswordType.USER_PASSWORD) and reports 55 fields with no extra `cryptography` dependency needed — friendlier than ca-fl-100, which pypdf can only open at all with `pypdf[crypto]` installed. pdfops' own `/api/inspect` rejects the raw file outright with `encrypted_pdf` (status 400), and cantoo/pdf-lib fail the same way they do on ca-fl-100: `ignoreEncryption: true` lets `PDFDocument.load` return without throwing, but the very next call (`getPageCount()`) throws, because the page tree's own object streams are still encrypted and `ignoreEncryption` never actually decrypts them — this registry's own machine-tested legs against the raw blank stop right there, which is why this entry's `machine` block has no pdf-lib/cantoo/render data. `qpdf --decrypt` losslessly strips the encryption first (as with ca-fl-100), after which cantoo/pdf-lib read it as a normal hybrid AcroForm/XFA form.
- Manually verified on a `qpdf --decrypt`'d copy (outside this registry's automated legs, which correctly refuse the raw encrypted blank): pdf-lib/cantoo see only 29 AcroForm-fallback fields (2 buttons, 24 text, 2 checkbox, 1 radio group) on the decrypted file, well under pypdf's 55 (recorded above, read from the original encrypted blank via pypdf's own internal decrypt) — the same AcroForm-vs-fuller-enumeration gap this registry's IRS hybrid-XFA entries show, here measured on a non-IRS, non-US form for the first time.
- The one RadioGroup (non-resident status, page 2) exports bare numeric strings `["1","2"]` rather than semantic values like the ao-440/opm-of-306 radio groups in this registry use — LiveCycle Designer's default export-value behavior when the form author doesn't hand-set one. A filler has to consult the printed form text (or Designer's own field labels, not exposed via AcroForm) to know '1' means one option and '2' the other; the PDF alone doesn't say.
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 CRA TD1 (2026) 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 — 27 fields across all field types via fill_form, no decrypt step — and writes a decrypted output.
Why do PDF libraries reject the CRA TD1 (2026)?
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