{"slug":"geo-report-pdf","title":"geo-report-pdf","summary":"Generate a professional PDF report from GEO audit data using ReportLab. Creates a polished, client-ready PDF with score gauges, bar charts, platform readiness visualizations, color-coded tables, and prioritized action plans.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-24T17:05:07.885164Z","repo":{"url":"https://github.com/TheSmokeDev/geo-skills","stars":26,"forks":6,"license":"MIT","updatedAt":"2026-09-03T13:13:04Z"},"bodyHtml":"<hr>\n<h2>name: geo-report-pdf\ndescription: Generate a professional PDF report from GEO audit data using ReportLab. Creates a polished, client-ready PDF with score gauges, bar charts, platform readiness visualizations, color-coded tables, and prioritized action plans.\nmetadata:\nversion: \"1.0.0\"\nauthor: geo-seo-claude\ntags: [geo, pdf, report, client-deliverable, professional]</h2>\n<h1>GEO PDF Report Generator</h1>\n<h2>Purpose</h2>\n<p>This skill generates a professional, visually polished PDF report from GEO audit data. The PDF includes score gauges, bar charts, platform readiness visualizations, color-coded tables, and a prioritized action plan — ready to deliver directly to clients.</p>\n<h2>Prerequisites</h2>\n<ul>\n<li><strong>ReportLab</strong> must be installed: <code>pip install reportlab</code></li>\n<li>The PDF generation script is located at: <code>~/.claude/skills/geo/scripts/generate_pdf_report.py</code></li>\n<li>Run a full GEO audit first (using <code>/geo-audit</code>) to have data to include in the report</li>\n</ul>\n<h2>How to Generate a PDF Report</h2>\n<h3>Step 1: Collect Audit Data</h3>\n<p>After running a full <code>/geo-audit</code>, collect all scores, findings, and recommendations into a JSON structure. The JSON data must follow this schema:</p>\n<pre><code>{\n    \"url\": \"https://example.com\",\n    \"brand_name\": \"Example Company\",\n    \"date\": \"2026-02-18\",\n    \"geo_score\": 65,\n    \"scores\": {\n        \"ai_citability\": 62,\n        \"brand_authority\": 78,\n        \"content_eeat\": 74,\n        \"technical\": 72,\n        \"schema\": 45,\n        \"platform_optimization\": 59\n    },\n    \"platforms\": {\n        \"Google AI Overviews\": 68,\n        \"ChatGPT\": 62,\n        \"Perplexity\": 55,\n        \"Gemini\": 60,\n        \"Bing Copilot\": 50\n    },\n    \"executive_summary\": \"A 4-6 sentence summary of the audit findings...\",\n    \"findings\": [\n        {\n            \"severity\": \"critical\",\n            \"title\": \"Finding Title\",\n            \"description\": \"Description of the finding and its impact.\"\n        }\n    ],\n    \"quick_wins\": [\n        \"Action item 1\",\n        \"Action item 2\"\n    ],\n    \"medium_term\": [\n        \"Action item 1\",\n        \"Action item 2\"\n    ],\n    \"strategic\": [\n        \"Action item 1\",\n        \"Action item 2\"\n    ],\n    \"crawler_access\": {\n        \"GPTBot\": {\"platform\": \"ChatGPT\", \"status\": \"Allowed\", \"recommendation\": \"Keep allowed\"},\n        \"ClaudeBot\": {\"platform\": \"Claude\", \"status\": \"Blocked\", \"recommendation\": \"Unblock for visibility\"}\n    }\n}\n</code></pre>\n<h3>Step 2: Write JSON Data to a Temp File</h3>\n<p>Write the collected audit data to a temporary JSON file:</p>\n<pre><code># Write audit data to temp file\ncat &gt; /tmp/geo-audit-data.json &lt;&lt; 'EOF'\n{ ... audit JSON data ... }\nEOF\n</code></pre>\n<h3>Step 3: Generate the PDF</h3>\n<p>Run the PDF generation script:</p>\n<pre><code>python3 ~/.claude/skills/geo/scripts/generate_pdf_report.py /tmp/geo-audit-data.json GEO-REPORT-[brand].pdf\n</code></pre>\n<p>The script will produce a professional PDF report with:</p>\n<ul>\n<li><strong>Cover Page</strong> — Brand name, URL, date, overall GEO score with visual gauge</li>\n<li><strong>Executive Summary</strong> — Key findings and top recommendations</li>\n<li><strong>Score Breakdown</strong> — Table and bar chart of all 6 scoring categories</li>\n<li><strong>AI Platform Readiness</strong> — Visual horizontal bar chart per platform with scores</li>\n<li><strong>AI Crawler Access</strong> — Color-coded table (green=allowed, red=blocked)</li>\n<li><strong>Key Findings</strong> — Severity-coded findings list (critical/high/medium/low)</li>\n<li><strong>Prioritized Action Plan</strong> — Quick wins, medium-term, and strategic initiatives</li>\n<li><strong>Appendix</strong> — Methodology, data sources, and glossary</li>\n</ul>\n<h3>Step 4: Return the PDF Path</h3>\n<p>After generation, tell the user where the PDF was saved and its file size.</p>\n<h2>Complete Workflow Example</h2>\n<p>When the user runs this skill, follow this exact sequence:</p>\n<ol>\n<li><p><strong>Check for existing audit data</strong> — Look for recent GEO audit reports in the current directory:</p>\n<ul>\n<li><code>GEO-CLIENT-REPORT.md</code></li>\n<li><code>GEO-AUDIT-REPORT.md</code></li>\n<li>Or any <code>GEO-*.md</code> files from a recent audit</li>\n</ul>\n</li>\n<li><p><strong>If no audit data exists</strong> — Tell the user to run <code>/geo-audit &lt;url&gt;</code> first, then come back for the PDF.</p>\n</li>\n<li><p><strong>If audit data exists</strong> — Parse the markdown report to extract:</p>\n<ul>\n<li>Overall GEO score</li>\n<li>Category scores (citability, brand authority, content/E-E-A-T, technical, schema, platform)</li>\n<li>Platform readiness scores (Google AIO, ChatGPT, Perplexity, Gemini, Bing Copilot)</li>\n<li>AI crawler access status</li>\n<li>Key findings with severity levels</li>\n<li>Quick wins, medium-term, and strategic action items</li>\n<li>Executive summary</li>\n</ul>\n</li>\n<li><p><strong>Build the JSON</strong> — Structure all data into the JSON schema shown above.</p>\n</li>\n<li><p><strong>Write JSON to temp file</strong> — Save to <code>/tmp/geo-audit-data.json</code></p>\n</li>\n<li><p><strong>Run the PDF generator</strong>:</p>\n<pre><code>python3 ~/.claude/skills/geo/scripts/generate_pdf_report.py /tmp/geo-audit-data.json \"GEO-REPORT-[brand_name].pdf\"\n</code></pre>\n</li>\n<li><p><strong>Report success</strong> — Tell the user the PDF was generated, its location, and file size.</p>\n</li>\n</ol>\n<h2>If the User Provides a URL</h2>\n<p>If the user runs <code>/geo-report-pdf https://example.com</code> with a URL:</p>\n<ol>\n<li>First run a full audit: invoke the <code>geo-audit</code> skill for that URL</li>\n<li>Then collect all the audit data from the generated report files</li>\n<li>Generate the PDF as described above</li>\n</ol>\n<h2>Parsing Markdown Audit Data</h2>\n<p>When extracting data from existing GEO markdown reports, look for these patterns:</p>\n<ul>\n<li><strong>GEO Score</strong>: Look for \"GEO Score: XX/100\" or \"Overall: XX/100\" or \"GEO Readiness Score: XX\"</li>\n<li><strong>Category Scores</strong>: Look for score tables with columns like \"Component | Score | Weight\"</li>\n<li><strong>Platform Scores</strong>: Look for tables with \"Google AI Overviews\", \"ChatGPT\", \"Perplexity\", etc.</li>\n<li><strong>Crawler Status</strong>: Look for tables with \"Allowed\" or \"Blocked\" status for crawlers like GPTBot, ClaudeBot</li>\n<li><strong>Findings</strong>: Look for sections titled \"Key Findings\", \"Critical Issues\", \"Recommendations\"</li>\n<li><strong>Action Items</strong>: Look for sections titled \"Quick Wins\", \"Action Plan\", \"Recommendations\"</li>\n</ul>\n<h2>Notes</h2>\n<ul>\n<li>If ReportLab is not installed, run: <code>pip install reportlab</code></li>\n<li>The PDF is designed for US Letter size (8.5\" x 11\")</li>\n<li>Color palette: Navy primary (#1a1a2e), Blue accent (#0f3460), Coral highlight (#e94560), Green success (#00b894)</li>\n<li>Each page has a header line, page numbers, \"Confidential\" watermark, and generation date</li>\n<li>Score gauges use traffic-light colors: green (80+), blue (60-79), yellow (40-59), red (below 40)</li>\n</ul>\n","files":[{"path":"SKILL.md","sizeBytes":6193,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-08-24T17:05:49.105072Z","sha256":"B3F55A3D34E9DE324D86CBDB50C8DC6D128BD858FE8D9F00B50EA29EDE30178E","sizeBytes":2638},"review":null,"source":{"repositoryUrl":"https://github.com/TheSmokeDev/geo-skills","path":"skills/geo-report-pdf","license":"MIT","commit":"35810d3ee8aa6cf1de151c9ea79265237c71df7b","subtreeSha":"7F183159312053B5C3228D06B654E2E4664FE0B0A8A92D057742321BD2384FF9","lastSyncedAt":"2026-09-27T20:54:07.404568Z"},"reviewedAt":"2026-08-24T17:21:08.451296Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/TheSmokeDev/geo-skills/tree/main/skills/geo-report-pdf"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install thesmokedev-geo-skills@llmmart"},{"target":"git","command":"git clone https://github.com/TheSmokeDev/geo-skills.git"}]}