This workflow corresponds to n8n.io template #7288 — we link there as the canonical source.
This workflow follows the Agent → Google Drive recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "BY9w2cNMUAvBWpJ7",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Free PDF Generator in n8n \u2013 No External Libraries or Paid Services",
"tags": [],
"nodes": [
{
"id": "1a0c48b7-71a1-43ea-84f4-bc9d471f3d94",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
176,
144
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1",
"cachedResultName": "gpt-4.1"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "9c32fc19-37c9-4a40-90b1-a00ac76923d9",
"name": "Archiving PDF File",
"type": "n8n-nodes-base.googleDrive",
"position": [
1152,
-80
],
"parameters": {
"name": "={{ $json.name }}.pdf",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1IPcko8bzogO3W4mxhrW2Q017QA0Lc5MI",
"cachedResultUrl": "https://drive.google.com/drive/folders/1IPcko8bzogO3W4mxhrW2Q017QA0Lc5MI",
"cachedResultName": "SmartSales"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "7e0a5a61-9004-4392-b1a5-786fd40cfcd9",
"name": "Download attachment file",
"type": "n8n-nodes-base.googleDrive",
"position": [
1376,
-80
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "bcb58059-951e-4e60-a925-595e4d9a7829",
"name": "Create document file",
"type": "n8n-nodes-base.httpRequest",
"position": [
704,
-80
],
"parameters": {
"url": "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true",
"body": "=--foo_bar_baz\nContent-Type: application/json; charset=UTF-8\n\n{\n \"name\": \"{{ $json.Today }}\",\n \"mimeType\": \"application/vnd.google-apps.document\",\n \"parents\": [\"{{ $json['Drive Folder ID'] }}\"]\n}\n\n--foo_bar_baz\nContent-Type: text/markdown; charset=UTF-8\n\n{{ $('Generate sample markdown document').item.json.output }}\n\n--foo_bar_baz--",
"method": "POST",
"options": {},
"sendBody": true,
"sendQuery": true,
"contentType": "raw",
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"rawContentType": "multipart/related; boundary=foo_bar_baz",
"queryParameters": {
"parameters": [
{
"name": "uploadType",
"value": "multipart"
},
{
"name": "supportsAllDrives",
"value": "true"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "boundary",
"value": "foo_bar_baz"
}
]
},
"nodeCredentialType": "googleDriveOAuth2Api"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "e540e238-4bde-4dae-ac86-ac88764e7dc9",
"name": "Convert document to PDF",
"type": "n8n-nodes-base.googleDrive",
"position": [
928,
-80
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {
"googleFileConversion": {
"conversion": {
"docsToFormat": "application/pdf"
}
}
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "e214322b-302f-4c54-906c-75e1e6c93ba9",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-144,
-80
],
"parameters": {},
"typeVersion": 1
},
{
"id": "a36ca7db-6c6d-491a-8cd0-243916a2cd3a",
"name": "Send message",
"type": "n8n-nodes-base.slack",
"position": [
1600,
-80
],
"parameters": {
"options": {
"fileName": "={{ $json.name }}",
"channelId": "C097VAKKPUP",
"initialComment": "Formatted PDF file from markdown"
},
"resource": "file",
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "d1253bec-da2d-4530-baeb-6e5adc989a1c",
"name": "Generate sample markdown document",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
80,
-80
],
"parameters": {
"text": "=You are a Markdown expert. Write a single sample document in Markdown format that demonstrates all major Markdown syntax.\nThe document should be well-organized and easy to follow, with each section labeled clearly.\n\nInclude examples for:\n\t1.\tHeadings (H1 to H6)\n\t2.\tParagraphs and line breaks\n\t3.\tBold, italic, bold italic, and strikethrough\n\t4.\tBlockquotes (single and nested)\n\t5.\tLists: unordered, ordered, nested lists, and task lists\n\t6.\tLinks: inline, reference-style, and automatic links\n\t7.\tImages: inline and reference-style\n\t8.\tCode: inline code, fenced code blocks with language highlighting\n\t9.\tTables with alignment options\n\t10.\tHorizontal rules\n\t11.\tFootnotes\n\t12.\tEscaping special characters\n\t13.\tEmoji usage (if supported)\n\t14.\tHTML elements inside Markdown (example: <details> or <sup>)\n\nAt the top, add a short title and description of the document.\nUse clear section headings and short explanations before each example.\nMake sure the output is entirely valid Markdown so it can be rendered directly without edits.\n\nOutput only the Markdown content, nothing else.",
"options": {
"systemMessage": ""
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "17545deb-4c68-4038-abd7-1c7e9de0b99f",
"name": "Configure Google Drive Folder ",
"type": "n8n-nodes-base.set",
"position": [
480,
-80
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1ff0b9a4-7d60-44ec-b047-e49252f1ace9",
"name": "Drive Folder ID",
"type": "string",
"value": "1IPcko8bzogO3W4mxhrW2Q017QA0Lc5MI"
},
{
"id": "d64a1ac4-15db-4c84-a1db-fbd6b48084f5",
"name": "Today",
"type": "string",
"value": "={{ $now.format(\"ddMMyyyyhhmmss\") }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "4bf9bfbc-3791-4c28-b32a-085f1864e726",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1216,
-720
],
"parameters": {
"width": 912,
"height": 1472,
"content": "# Free PDF Generator in n8n \u2013 No External Libraries or Paid Services\n> A 100% free n8n workflow for generating professionally formatted PDFs without relying on external libraries or paid converters. It uses OpenAI to create Markdown content, Google Docs to format and convert to PDF, and integrates with Google Drive and Slack for archiving and sharing, ideal for reports, BRDs, proposals, or any document you need directly inside n8n.\n### Watch the demo video below:\n[.jpg)](https://www.youtube.com/watch?v=BB32RPQYI94)\n\n## **Who\u2019s it for**\n- Teams that need **auto-generated documents** (reports, guides, checklists) in PDF format.\n- Operations or enablement teams who want files **archived in Google Drive** and **shared in Slack** automatically.\n- Anyone experimenting with **LLM-powered document generation** integrated into business workflows.\n\n## **How it works / What it does**\n1. **Manual trigger** starts the workflow.\n2. **LLM generates** a sample Markdown document (via OpenAI Chat Model).\n3. **Google Drive folder** is configured for storage.\n4. **Google Doc is created** from the generated Markdown content.\n5. **Document is exported to PDF** using Google Drive. ([Sample PDF generated from comprehensive markdown](https://wisestackai.s3.ap-southeast-1.amazonaws.com/12082025052957.pdf))\n6. **PDF is archived** in a designated Drive folder.\n7. **Archived PDF is downloaded** for sharing.\n8. **Slack message is sent** with the PDF attached.\n\n## **How to set up**\n1. **Add nodes in sequence**:\n - Manual Trigger\n - OpenAI Chat Model (prompt to generate sample Markdown)\n - Set/Manual input for Google Drive folder ID(s)\n - HTTP Request or Google Drive Upload (convert to Google Docs)\n - Google Drive Download (PDF export)\n - Google Drive Upload (archive PDF)\n - Google Drive Download (fetch archived file)\n - Slack Upload (send message with attachment)\n2. **Configure credentials** for OpenAI, Google Drive, and Slack.\n3. **Map output fields**:\n - `data.markdown` \u2192 Google Docs creation\n - `docId` \u2192 PDF export\n - `fileId` \u2192 Slack upload\n4. **Test run** to ensure PDF is generated, archived, and posted to Slack.\n\n## **Requirements**\n- **Credentials**:\n - OpenAI API key (or compatible LLM provider)\n - Google Drive (OAuth2) with read/write permissions\n - Slack bot token with `files:write` permission\n- **Access**:\n - Write access to target Google Drive folders\n - Slack bot invited to the target channel\n\n## **How to customize the workflow**\n- **Change the prompt** in the OpenAI Chat Model to generate different types of content (reports, meeting notes, checklists).\n- **Automate triggering**:\n - Replace Manual Trigger with Cron for scheduled document generation.\n - Use Webhook Trigger to run on-demand from external apps.\n- **Modify storage logic**:\n - Save both `.md` and `.pdf` versions in Google Drive.\n - Use separate folders for drafts vs. final versions.\n- **Enhance distribution**:\n - Send PDFs to multiple Slack channels or via email.\n - Integrate with project management tools for automated task creation."
},
"typeVersion": 1
},
{
"id": "184cfef9-d92a-462d-9e8b-b6034eaa5ff9",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-272,
-208
],
"parameters": {
"color": 4,
"width": 288,
"height": 480,
"content": "**Trigger the Workflow** \n Start the process manually or replace with another trigger (e.g., Cron or Webhook) to run automatically."
},
"typeVersion": 1
},
{
"id": "49d2e923-1356-4671-96e4-a6a39893e291",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
48,
-208
],
"parameters": {
"color": 4,
"width": 352,
"height": 480,
"content": "**Generate Markdown Content with AI** \n Use the OpenAI Chat Model to create a structured Markdown document based on your prompt, perfect for reports, BRDs, proposals, or meeting notes."
},
"typeVersion": 1
},
{
"id": "350d767b-0ed5-4cbd-9f86-f5ea4044fbff",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
432,
-208
],
"parameters": {
"color": 4,
"width": 432,
"height": 480,
"content": "**Create Google Doc from Markdown** \n Upload the generated Markdown content to Google Drive and convert it into a Google Doc for proper formatting.\n\n[Sample PDF generated from comprehensive markdown](https://wisestackai.s3.ap-southeast-1.amazonaws.com/12082025052957.pdf)"
},
"typeVersion": 1
},
{
"id": "2c5fc8ea-4c52-4b4b-8e13-c2ae0041aa1f",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
896,
-208
],
"parameters": {
"color": 4,
"width": 384,
"height": 480,
"content": "**Export and Archive as PDF** \n Convert the Google Doc to a PDF file, then upload it to your chosen Google Drive folder for storage and record-keeping."
},
"typeVersion": 1
},
{
"id": "c3e95369-34a3-4f11-9204-78ee6b6e2217",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1328,
-208
],
"parameters": {
"color": 4,
"width": 400,
"height": 480,
"content": "**Share the PDF via Slack** \n Download the archived PDF and post it to a Slack channel with a message and links for quick access."
},
"typeVersion": 1
},
{
"id": "9bc94ec2-4bce-4ed4-9afd-9270d2e46052",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1808,
-240
],
"parameters": {
"width": 768,
"height": 528,
"content": ""
},
"typeVersion": 1
},
{
"id": "bf330105-df5e-4956-858a-b29d26e651d4",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
352
],
"parameters": {
"width": 768,
"height": 992,
"content": ""
},
"typeVersion": 1
},
{
"id": "12aea9ee-032f-4522-980b-69bee5d89913",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
544,
352
],
"parameters": {
"width": 768,
"height": 992,
"content": ""
},
"typeVersion": 1
},
{
"id": "e754721c-dce2-4d19-a47d-b146e6bba331",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1328,
352
],
"parameters": {
"width": 768,
"height": 992,
"content": ""
},
"typeVersion": 1
},
{
"id": "53e3dcc8-1e6e-4cb4-9f44-5fa49d731a9a",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
2112,
352
],
"parameters": {
"width": 768,
"height": 992,
"content": ""
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "93a6ffab-7fbe-42af-8025-f3e2a72ceea7",
"connections": {
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Generate sample markdown document",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Archiving PDF File": {
"main": [
[
{
"node": "Download attachment file",
"type": "main",
"index": 0
}
]
]
},
"Create document file": {
"main": [
[
{
"node": "Convert document to PDF",
"type": "main",
"index": 0
}
]
]
},
"Convert document to PDF": {
"main": [
[
{
"node": "Archiving PDF File",
"type": "main",
"index": 0
}
]
]
},
"Download attachment file": {
"main": [
[
{
"node": "Send message",
"type": "main",
"index": 0
}
]
]
},
"Configure Google Drive Folder ": {
"main": [
[
{
"node": "Create document file",
"type": "main",
"index": 0
}
]
]
},
"Generate sample markdown document": {
"main": [
[
{
"node": "Configure Google Drive Folder ",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Generate sample markdown document",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleDriveOAuth2ApiopenAiApislackOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
> A 100% free n8n workflow for generating professionally formatted PDFs without relying on external libraries or paid converters. It uses OpenAI to create Markdown content, Google Docs to format and convert to PDF, and integrates with Google Drive and Slack for archiving and…
Source: https://n8n.io/workflows/7288/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
[](https://www.youtube.com/watch?v=BfMY2jFJR9k)
[](https://www.youtube.com/watch?v=9Kn583UJlqY) > This workflow demos how to use Decodo Scraper API to crawl any public web page (headless JS, device emulation: mobile/desktop/tablet), extract stru
Decodo is a powerful public data access platform offering managed web scraping APIs and proxy infrastructure to collect structured web data at scale. It handles proxies, anti-bot protection, JavaScrip
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.
Generate AI viral videos with NanoBanana & VEO3, shared on socials via Blotato 2. Uses @blotato/n8n-nodes-blotato, googleSheets, lmChatOpenAi, toolThink. Event-driven trigger; 94 nodes.