PDF templates / Civic / Government

Annual Budget Summary

Municipal annual budget summary derived from published US city budget summaries: masthead with fiscal meta box, manager's message, revenue and expenditure lines with amount and share columns, budget highlights, reserves note, and certification with finance-director and city-manager sign-off. Renders as a tagged PDF/A-2A + PDF/UA-1 document.

First page of the Annual Budget Summary template, rendered with its sample data
budget-summary.pdfpage 1 of 2

DSL source

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

js
const template = doc(
  { size: "Letter", title: "{{jurisdiction}} Annual Budget Summary — {{fiscalYear}}", padding: [36, 40, 36, 40],
    styles: {
      ".masthead":     { "font-family": "Inter", "font-size": 20, "font-weight": "bold", color: "#0b3d91", "margin": [0, 0, 2, 0] },
      ".doc-kind":     { "font-family": "Inter", "font-size": 13, "font-weight": "bold", color: "#1a1a1a", "margin": [0, 0, 2, 0] },
      ".doc-line":     { "font-family": "Inter", "font-size": 10, color: "#333", "line-height": 1.4 },
      ".meta-label":   { "font-family": "Inter", "font-size": 8, "font-weight": "bold", color: "#555" },
      ".meta-value":   { "font-family": "Inter", "font-size": 9.5, color: "#1a1a1a" },
      ".notice-box":   { "background-color": "#f0f4fa", "border": [1, 1, 1, 1], "border-color": "#0b3d91", padding: [8, 10, 8, 10] },
      ".notice-text":  { "font-family": "Inter", "font-size": 9, color: "#1a1a1a", "line-height": 1.45 },
      ".section-title":{ "font-family": "Inter", "font-size": 12, "font-weight": "bold", color: "#0b3d91", "border": [0, 0, 1, 0], "border-color": "#0b3d91", "padding": [0, 0, 3, 0], "margin": [0, 0, 6, 0] },
      ".col-head":     { "font-family": "Inter", "font-size": 8, "font-weight": "bold", color: "#555" },
      ".line-label":   { "font-family": "Inter", "font-size": 9.5, color: "#1a1a1a", "line-height": 1.4 },
      ".line-amount":  { "font-family": "Inter", "font-size": 9.5, color: "#1a1a1a" },
      ".line-share":   { "font-family": "Inter", "font-size": 9.5, color: "#444" },
      ".total-label":  { "font-family": "Inter", "font-size": 10, "font-weight": "bold", color: "#1a1a1a" },
      ".total-amount": { "font-family": "Inter", "font-size": 10, "font-weight": "bold", color: "#0b3d91" },
      ".hl":           { "font-family": "Inter", "font-size": 9.5, color: "#1a1a1a", "line-height": 1.45 },
      ".bullet":       { "font-family": "Inter", "font-size": 9.5, color: "#0b3d91" },
      ".cert":         { "font-family": "Inter", "font-size": 9, color: "#333", "line-height": 1.5 },
      ".sig-name":     { "font-family": "Inter", "font-size": 10, "font-weight": "bold", color: "#1a1a1a", "margin": [0, 0, 0, 0] },
      ".sig-title":    { "font-family": "Inter", "font-size": 9, color: "#444", "margin": [0, 0, 0, 0] },
    },
  },

  // Masthead
  s(".masthead", "{{jurisdiction}}"),
  s(".doc-kind", "Annual Budget Summary — {{fiscalYear}}"),
  s(".doc-line", "{{budgetTitle}}"),
  gap(8),

  // Fiscal meta box
  r({ "border": [1, 1, 1, 1], "border-color": "#0b3d91", padding: [8, 10, 8, 10] },
    col("50%",
      s(".meta-label", "FISCAL YEAR"),
      s(".meta-value", "{{fiscalYear}}"),
      gap(4),
      s(".meta-label", "ADOPTED"),
      s(".meta-value", "{{adoptedAt}}"),
    ),
    col("50%",
      s(".meta-label", "TOTAL BUDGET (ALL FUNDS)"),
      s(".meta-value", "{{totalBudget}}"),
      gap(4),
      s(".meta-label", "BUDGET OFFICE CONTACT"),
      s(".meta-value", "{{contact}}"),
    ),
  ),
  gap(8),

  // Manager's message
  r({ class: "notice-box" },
    col("100%", s(".notice-text", "{{message}}")),
  ),
  gap(10),

  // Revenues
  s(".section-title", "Where the Money Comes From — Revenues"),
  r({ grid: ["1fr", "90pt", "52pt"], "margin": [0, 0, 4, 0] },
    col(s(".col-head", "SOURCE")),
    col({ align: "right" }, s(".col-head", "AMOUNT")),
    col({ align: "right" }, s(".col-head", "SHARE")),
  ),
  each("line in revenues",
    r({ grid: ["1fr", "90pt", "52pt"], "margin": [0, 0, 3, 0] },
      col(s(".line-label", "{{line.name}}")),
      col({ align: "right" }, s(".line-amount", "{{line.amount}}")),
      col({ align: "right" }, s(".line-share", "{{line.share}}")),
    ),
  ),
  r({ grid: ["1fr", "90pt", "52pt"], "border": [1, 0, 0, 0], "border-color": "#0b3d91", "padding": [4, 0, 0, 0], "margin": [2, 0, 0, 0] },
    col(s(".total-label", "Total revenues")),
    col({ align: "right" }, s(".total-amount", "{{totalRevenues}}")),
    col(s(".line-share", "")),
  ),
  gap(10),

  // Expenditures
  s(".section-title", "Where the Money Goes — Expenditures"),
  r({ grid: ["1fr", "90pt", "52pt"], "margin": [0, 0, 4, 0] },
    col(s(".col-head", "FUNCTION")),
    col({ align: "right" }, s(".col-head", "AMOUNT")),
    col({ align: "right" }, s(".col-head", "SHARE")),
  ),
  each("line in expenditures",
    r({ grid: ["1fr", "90pt", "52pt"], "margin": [0, 0, 3, 0] },
      col(s(".line-label", "{{line.name}}")),
      col({ align: "right" }, s(".line-amount", "{{line.amount}}")),
      col({ align: "right" }, s(".line-share", "{{line.share}}")),
    ),
  ),
  r({ grid: ["1fr", "90pt", "52pt"], "border": [1, 0, 0, 0], "border-color": "#0b3d91", "padding": [4, 0, 0, 0], "margin": [2, 0, 0, 0] },
    col(s(".total-label", "Total expenditures")),
    col({ align: "right" }, s(".total-amount", "{{totalExpenditures}}")),
    col(s(".line-share", "")),
  ),
  gap(10),

  // Highlights
  s(".section-title", "Budget Highlights"),
  each("h in highlights",
    r({ grid: ["14pt", "1fr"], "margin": [0, 0, 3, 0] },
      col(s(".bullet", "•")),
      col(s(".hl", "{{h}}")),
    ),
  ),
  gap(4),
  s(".cert", "{{reservesNote}}"),
  gap(8),

  // Certification + sign-off
  s(".cert", "{{certification}}"),
  gap(8),
  r({ "margin": [0, 0, 0, 0] },
    col("50%",
      s(".sig-name", "{{financeDirector}}"),
      s(".sig-title", "Finance Director"),
    ),
    col("50%",
      s(".sig-name", "{{cityManager}}"),
      s(".sig-title", "City Manager"),
    ),
  ),

  ftrPages("{{jurisdiction}} Annual Budget Summary {{fiscalYear}}"),
);

const sampleData = {
  jurisdiction: "City of Riverton",
  fiscalYear: "FY 2025-26",
  budgetTitle: "Adopted 24 June 2025 — all funds, 1 July 2025 through 30 June 2026",
  adoptedAt: "24 June 2025",
  totalBudget: "$412.0 million (all funds)",
  contact: "Budget Office — (555) 014-2900",
  message: "This summary presents the City of Riverton adopted budget for FY 2025-26 in plain language. The $412.0 million all-funds budget holds the property-tax rate flat, adds twelve public-safety positions, and transfers $53.5 million to capital projects including the Elm Street resurfacing. Reserves remain at 22 percent of General Fund spending, within the Council's 20 to 25 percent policy band.",
  revenues: [
    { name: "Property tax", amount: "$168.4M", share: "40.9%" },
    { name: "Sales tax", amount: "$74.2M", share: "18.0%" },
    { name: "Charges for services", amount: "$62.8M", share: "15.2%" },
    { name: "Intergovernmental aid", amount: "$48.6M", share: "11.8%" },
    { name: "Other taxes and fees", amount: "$32.5M", share: "7.9%" },
    { name: "Use of fund balance", amount: "$25.5M", share: "6.2%" },
  ],
  totalRevenues: "$412.0M",
  expenditures: [
    { name: "Police", amount: "$98.6M", share: "23.9%" },
    { name: "Fire and EMS", amount: "$64.3M", share: "15.6%" },
    { name: "Public works", amount: "$58.9M", share: "14.3%" },
    { name: "Parks and recreation", amount: "$34.7M", share: "8.4%" },
    { name: "Community development", amount: "$28.4M", share: "6.9%" },
    { name: "General government", amount: "$42.1M", share: "10.2%" },
    { name: "Debt service", amount: "$31.5M", share: "7.7%" },
    { name: "Transfers to capital projects", amount: "$53.5M", share: "13.0%" },
  ],
  totalExpenditures: "$412.0M",
  highlights: [
    "No property-tax rate increase; levy growth comes from new construction added to the rolls.",
    "Adds twelve public-safety positions — eight police officers and four firefighter/paramedics.",
    "Transfers $53.5 million to capital projects, funding Elm Street resurfacing and water-main renewal.",
    "Holds reserves at 22 percent of General Fund spending, inside the 20 to 25 percent policy band.",
    "New online budget explorer publishes every line item in an accessible, screen-reader-tested table.",
  ],
  reservesNote: "Unassigned General Fund balance at adoption is $41.8 million, or 22 percent of General Fund operating spending.",
  certification: "I certify that the figures in this summary are drawn from the FY 2025-26 adopted budget approved by the Riverton City Council on 24 June 2025. — L. Osei, Finance Director",
  financeDirector: "L. Osei",
  cityManager: "J. Ellis",
};

Sample data

json
{
  "jurisdiction": "City of Riverton",
  "fiscalYear": "FY 2025-26",
  "budgetTitle": "Adopted 24 June 2025 — all funds, 1 July 2025 through 30 June 2026",
  "adoptedAt": "24 June 2025",
  "totalBudget": "$412.0 million (all funds)",
  "contact": "Budget Office — (555) 014-2900",
  "message": "This summary presents the City of Riverton adopted budget for FY 2025-26 in plain language. The $412.0 million all-funds budget holds the property-tax rate flat, adds twelve public-safety positions, and transfers $53.5 million to capital projects including the Elm Street resurfacing. Reserves remain at 22 percent of General Fund spending, within the Council's 20 to 25 percent policy band.",
  "revenues": [
    {
      "name": "Property tax",
      "amount": "$168.4M",
      "share": "40.9%"
    },
    {
      "name": "Sales tax",
      "amount": "$74.2M",
      "share": "18.0%"
    },
    {
      "name": "Charges for services",
      "amount": "$62.8M",
      "share": "15.2%"
    },
    {
      "name": "Intergovernmental aid",
      "amount": "$48.6M",
      "share": "11.8%"
    },
    {
      "name": "Other taxes and fees",
      "amount": "$32.5M",
      "share": "7.9%"
    },
    {
      "name": "Use of fund balance",
      "amount": "$25.5M",
      "share": "6.2%"
    }
  ],
  "totalRevenues": "$412.0M",
  "expenditures": [
    {
      "name": "Police",
      "amount": "$98.6M",
      "share": "23.9%"
    },
    {
      "name": "Fire and EMS",
      "amount": "$64.3M",
      "share": "15.6%"
    },
    {
      "name": "Public works",
      "amount": "$58.9M",
      "share": "14.3%"
    },
    {
      "name": "Parks and recreation",
      "amount": "$34.7M",
      "share": "8.4%"
    },
    {
      "name": "Community development",
      "amount": "$28.4M",
      "share": "6.9%"
    },
    {
      "name": "General government",
      "amount": "$42.1M",
      "share": "10.2%"
    },
    {
      "name": "Debt service",
      "amount": "$31.5M",
      "share": "7.7%"
    },
    {
      "name": "Transfers to capital projects",
      "amount": "$53.5M",
      "share": "13.0%"
    }
  ],
  "totalExpenditures": "$412.0M",
  "highlights": [
    "No property-tax rate increase; levy growth comes from new construction added to the rolls.",
    "Adds twelve public-safety positions — eight police officers and four firefighter/paramedics.",
    "Transfers $53.5 million to capital projects, funding Elm Street resurfacing and water-main renewal.",
    "Holds reserves at 22 percent of General Fund spending, inside the 20 to 25 percent policy band.",
    "New online budget explorer publishes every line item in an accessible, screen-reader-tested table."
  ],
  "reservesNote": "Unassigned General Fund balance at adoption is $41.8 million, or 22 percent of General Fund operating spending.",
  "certification": "I certify that the figures in this summary are drawn from the FY 2025-26 adopted budget approved by the Riverton City Council on 24 June 2025. — L. Osei, Finance Director",
  "financeDirector": "L. Osei",
  "cityManager": "J. Ellis"
}

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": "budget-summary"}' \
  -o output.pdf