PDF templates / Form

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.

First page of the Data Processing Consent Form template, rendered with its sample data
consent-form.pdfpage 1 of 2

DSL source

The whole template. Learn the language in the template DSL guide.

js
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

json
{
  "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.

bash
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