Marketing

Restaurant menu PDF maker

An elegant one-page menu with sections, dish descriptions, prices and dietary tags — reprint whenever prices change.

Get a clean, printable menu without hiring a designer. List your dishes, or describe your restaurant and let the AI draft sections, descriptions and prices on an elegant one-page layout with dietary tags.

Menus change often, so keep the template and regenerate it whenever prices or specials change. Restaurant platforms can render a menu per venue straight from their item data through the API.

Generate a Restaurant Menu PDF via the API

POST your data to /api/v1/generate and get a PDF back. Copy-paste an example, swap in your API key, and loop over a list to render thousands — one restaurant menu per record.

curl -X POST https://pdfgen.com/api/v1/generate \
-H "Authorization: Bearer pdfg_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": {
"name": "Olive & Thyme",
"tagline": "Mediterranean kitchen",
"address": "18 Rua das Flores, Lisbon",
"hours": "Tue–Sun, 12:00–22:30",
"currency": "EUR",
"locale": "en-IE",
"sections": [
{
"name": "Starters",
"items": [
{
"name": "Grilled halloumi",
"description": "Honey, thyme, toasted pistachio",
"tags": [
"V",
"GF"
],
"price": 9
},
{
"name": "Whipped feta & flatbread",
"description": "Roasted peppers, chilli oil, warm flatbread",
"tags": [
"V"
],
"price": 8.5
},
{
"name": "Garlic prawns",
"description": "Olive oil, parsley, lemon, sourdough",
"tags": [],
"price": 12
}
]
},
{
"name": "Mains",
"items": [
{
"name": "Lamb kofta",
"description": "Tahini yoghurt, herb salad, pickled onion",
"tags": [
"GF"
],
"price": 21
},
{
"name": "Whole sea bream",
"description": "Charred lemon, capers, crushed potatoes",
"tags": [
"GF"
],
"price": 24
},
{
"name": "Mushroom & farro risotto",
"description": "Wild mushrooms, parmesan, truffle oil",
"tags": [
"V"
],
"price": 18
},
{
"name": "Roasted cauliflower steak",
"description": "Romesco, almonds, pomegranate",
"tags": [
"VG",
"GF"
],
"price": 17
}
]
},
{
"name": "Desserts",
"items": [
{
"name": "Pastel de nata",
"description": "Warm custard tart, cinnamon",
"tags": [
"V"
],
"price": 4.5
},
{
"name": "Olive oil cake",
"description": "Orange, mascarpone, candied peel",
"tags": [
"V"
],
"price": 7
},
{
"name": "Dark chocolate mousse",
"description": "Sea salt, olive oil, hazelnut crumb",
"tags": [
"VG"
],
"price": 7.5
}
]
}
],
"legend": "V vegetarian · VG vegan · GF gluten free · Please tell us about any allergies"
},
"format": "A4",
"engine": "handlebars",
"html": "<link href=\"https://fonts.googleapis.com/css2?family=Playfair+Display:wght@500;700&display=swap\" rel=\"stylesheet\">\n<div style=\"max-width:700px;margin:0 auto;padding:52px 56px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#111827;\">\n <div style=\"text-align:center;margin-bottom:30px;\">\n <p style=\"margin:0;font-size:11px;letter-spacing:4px;text-transform:uppercase;color:#a16207;\">{{tagline}}</p>\n <h1 style=\"margin:8px 0 0;font-family:'\''Playfair Display'\'',Georgia,serif;font-size:42px;font-weight:700;color:#1c1917;\">{{name}}</h1>\n <div style=\"display:flex;align-items:center;justify-content:center;gap:10px;margin:14px 0;\">\n <span style=\"width:60px;height:1px;background:#d6c7b0;\"></span><span style=\"width:6px;height:6px;background:#a16207;transform:rotate(45deg);\"></span><span style=\"width:60px;height:1px;background:#d6c7b0;\"></span>\n </div>\n <p style=\"margin:0;font-size:12px;color:#78716c;\">{{address}} &middot; {{hours}}</p>\n </div>\n {{#each sections}}\n <h2 style=\"margin:0 0 12px;font-family:'\''Playfair Display'\'',Georgia,serif;font-size:22px;font-weight:500;text-align:center;color:#a16207;\">{{name}}</h2>\n <div style=\"margin-bottom:24px;\">\n {{#each items}}\n <div style=\"margin-bottom:11px;\">\n <div style=\"display:flex;align-items:baseline;gap:8px;\">\n <span style=\"font-weight:700;font-size:14px;color:#1c1917;\">{{name}}</span>\n {{#each tags}}<span style=\"font-size:9px;font-weight:700;color:#15803d;border:1px solid #bbf7d0;border-radius:3px;padding:0 4px;\">{{this}}</span>{{/each}}\n <span style=\"flex:1;border-bottom:1px dotted #d6c7b0;\"></span>\n <span style=\"font-weight:700;font-size:14px;color:#1c1917;\">{{formatCurrency price ../../currency ../../locale}}</span>\n </div>\n <p style=\"margin:2px 0 0;font-size:12px;color:#78716c;\">{{description}}</p>\n </div>\n {{/each}}\n </div>\n {{/each}}\n <p style=\"margin:8px 0 0;text-align:center;font-size:11px;color:#a8a29e;\">{{legend}}</p>\n</div>"
}' --output restaurant-menu.pdf

Working in another language? Follow a full guide for your stack:

What you can build

  • Cafés and restaurants printing an updated menu each season
  • Daily specials and set menus printed every morning
  • Caterers sending event menus to clients
  • Ordering and POS platforms generating a PDF menu per venue

Frequently asked questions

Can I change prices without redesigning the menu?
Yes — prices are just values in your data. Update them and download a fresh PDF in seconds.
Can I show vegetarian, vegan or gluten-free dishes?
Yes — each dish has a list of tags such as V, VG or GF, and the legend at the bottom explains them.
Can I make the menu in another language or currency?
Yes — write the dishes in any language and set the currency and locale, so prices print in the local format.

Related templates

Ship your restaurant menu PDF endpoint today

Generate this template with AI, tweak it to match your brand, then render at scale with a single API call — no headless browsers to babysit.