Data Processing Consent Form
Government-style data-processing consent form. Demonstrates fillable AcroForm fields (text inputs, multiline notes, checkboxes for consent statements, dropdown for contact preference, typed-signature line) rendered as a tagged PDF/A-2A + PDF/UA-1 document — fillable, archival, and accessible.

DSL source
The whole template. Learn the language in the template DSL guide.
const template = doc(
{ size: "A4", title: "Data Processing Consent Form", padding: [36, 40, 36, 40],
styles: {
".heading": { "font-family": "NotoSans", "font-size": 18, "font-weight": "bold", color: "#0b3d91" },
".section": { "font-family": "NotoSans", "font-size": 11, "font-weight": "bold", color: "#0b3d91", "margin": [10, 0, 4, 0] },
".label": { "font-family": "NotoSans", "font-size": 9, "font-weight": "bold", color: "#1a1a1a", "margin": [0, 0, 2, 0] },
".body": { "font-family": "NotoSans", "font-size": 10, color: "#1a1a1a", "line-height": 1.4 },
".muted": { "font-family": "NotoSans", "font-size": 9, color: "#555" },
},
},
s(".heading", "Data Processing Consent Form"),
s(".muted", "Reference: {{reference}} — Date: {{date}}"),
gap(8),
s(".body",
"Please complete this form so we can record your consent to process the personal information described below. " +
"All fields with an asterisk (*) are required. You may withdraw consent at any time by contacting the data controller."
),
s(".section", "1. Your details"),
s(".label", "Full name *"),
input({ name: "fullName", width: 400, height: 18, tooltip: "Full legal name", maxLength: 120 }),
gap(6),
s(".label", "Date of birth (YYYY-MM-DD) *"),
input({ name: "dateOfBirth", width: 160, height: 18, tooltip: "Date of birth in YYYY-MM-DD format", maxLength: 10 }),
gap(6),
s(".label", "Postal address *"),
input({ name: "address", width: 480, height: 60, multiline: true, tooltip: "Full postal address", maxLength: 400 }),
gap(6),
s(".label", "Email *"),
input({ name: "email", width: 320, height: 18, tooltip: "Contact email address", maxLength: 200 }),
gap(6),
s(".label", "Preferred contact method *"),
select({
name: "contactMethod",
width: 200,
height: 20,
options: [
{ label: "Email", value: "email" },
{ label: "Phone", value: "phone" },
{ label: "Postal", value: "post" },
],
value: "email",
tooltip: "How we should reach you",
}),
s(".section", "2. Consent"),
s(".body",
"Tick each statement you agree to. Items marked (required) must be ticked for this form to be valid."
),
gap(4),
checkbox({ name: "consentProcessing", size: 12, checked: false, tooltip: "Consent to data processing (required)", label: "I consent to the processing of my personal data for the purposes described above. (required)" }),
gap(2),
checkbox({ name: "consentMarketing", size: 12, checked: false, tooltip: "Consent to marketing emails (optional)", label: "I consent to receive occasional service updates and marketing emails." }),
gap(2),
checkbox({ name: "consentSharing", size: 12, checked: false, tooltip: "Consent to sharing with partner organisations (optional)", label: "I consent to my data being shared with named partner organisations listed in the privacy notice." }),
gap(2),
checkbox({ name: "consentRetention", size: 12, checked: false, tooltip: "Acknowledge retention policy", label: "I understand that my data will be retained for the period stated in the privacy notice and then deleted." }),
s(".section", "3. Additional notes"),
s(".muted", "Optional — add anything you would like the data controller to be aware of."),
gap(4),
input({ name: "notes", width: 480, height: 80, multiline: true, tooltip: "Additional notes", maxLength: 1000 }),
s(".section", "4. Signature"),
s(".label", "Signature (typed) *"),
input({ name: "signature", width: 320, height: 22, tooltip: "Type your full name to sign", maxLength: 120 }),
gap(6),
s(".label", "Date signed (YYYY-MM-DD) *"),
input({ name: "signatureDate", width: 160, height: 18, tooltip: "Date of signature", maxLength: 10 }),
gap(10),
s(".muted",
"This form is rendered by makesPDF as a tagged PDF/A-2A + PDF/UA-1 document. " +
"All fillable fields use AcroForm /Tx, /Btn and /Ch widgets with pre-baked appearance streams (no /NeedAppearances)."
),
);
const sampleData = {
reference: "CF-2026-0001",
date: "2026-05-02",
};Sample data
{
"reference": "CF-2026-0001",
"date": "2026-05-02"
}Render it with your data
Any API key can render this template by its ID. This call uses the sample data; add a data object to use your own. See the API reference.
curl -X POST https://makespdf.com/api/v1/render \
-H "Authorization: Bearer $MAKESPDF_API_KEY" \
-H "Content-Type: application/json" \
-d '{"templateId": "consent-form"}' \
-o output.pdf