[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KJCANA4EJNR8CD5ECDNF2N":3,"skill-same:01M6KJCANA4EJNR8CD5ECDNF2N":68},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":13,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":46,"updatedAt":47,"install":48,"resources":61},"01M6KJCANA4EJNR8CD5ECDNF2N","pdf-generation-troubleshooting",null,"Systematic fallback workflow for PDF generation through pandoc, reportlab, and fpdf2 with installation verification","AG064\u002FOpenSpace","AG064","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F184930299?v=4","01M6KHVFG7TB73NHX3RDYSTMH2","01M6KHVFMM7XA2PZA9Z83PHS3V",0,"MIT","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fpdf-generation-troubleshooting\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35],"PDF","troubleshooting","generation","pdf generation","pdf generation troubleshooting","workflow","verification","fallback","installation","systematic","pandoc","with","for","2026-11-10 10:12:30",false,"---\nname: pdf-generation-troubleshooting\ndescription: Systematic fallback workflow for PDF generation through pandoc, reportlab, and fpdf2 with installation verification\n---\n\n# PDF Generation Troubleshooting Workflow\n\nThis skill provides a systematic approach to generating PDFs when multiple tools may be unavailable. Follow this fallback sequence to ensure PDF generation succeeds.\n\n## Workflow Overview\n\n1. **Try pandoc first** (simplest for markdown\u002FHTML conversion)\n2. **Fallback to reportlab** (Python library for programmatic PDFs)\n3. **Fallback to fpdf2** (alternative Python PDF library)\n\nEach step includes installation verification before execution.\n\n## Step 1: Attempt pandoc Conversion\n\nUse pandoc for markdown or HTML to PDF conversion. Check availability first:\n\n```bash\n# Check if pandoc is available\nwhich pandoc || echo \"pandoc not found\"\n```\n\nIf available, convert:\n\n```bash\npandoc input.md -o output.pdf\n```\n\nIf pandoc fails or is unavailable, proceed to Step 2.\n\n## Step 2: Attempt reportlab\n\n### Check Installation\n\n```bash\npython3 -c \"import reportlab\" 2>\u002Fdev\u002Fnull && echo \"reportlab available\" || echo \"reportlab not found\"\n```\n\n### Install if Needed\n\n```bash\npip install reportlab\n```\n\n### Create PDF Script\n\nUse `write_file` to create a Python script:\n\n```python\nfrom reportlab.lib.pagesizes import letter\nfrom reportlab.pdfgen import canvas\n\ndef create_pdf(filename, content):\n    c = canvas.Canvas(filename, pagesize=letter)\n    c.drawString(100, 750, content)\n    c.save()\n\nif __name__ == \"__main__\":\n    create_pdf(\"output.pdf\", \"Your content here\")\n```\n\n### Execute Script\n\nUse `run_shell` with proper directory context:\n\n```bash\ncd \u002Fpath\u002Fto\u002Fworking\u002Fdirectory && python3 script.py\n```\n\nIf reportlab fails, proceed to Step 3.\n\n## Step 3: Attempt fpdf2\n\n### Check Installation\n\n```bash\npython3 -c \"from fpdf import FPDF\" 2>\u002Fdev\u002Fnull && echo \"fpdf2 available\" || echo \"fpdf2 not found\"\n```\n\n### Install if Needed\n\n```bash\npip install fpdf2\n```\n\n### Create PDF Script\n\n```python\nfrom fpdf import FPDF\n\ndef create_pdf(filename, text):\n    pdf = FPDF()\n    pdf.add_page()\n    pdf.set_font(\"Arial\", size=12)\n    pdf.cell(200, 10, txt=text, ln=True)\n    pdf.output(filename)\n\nif __name__ == \"__main__\":\n    create_pdf(\"output.pdf\", \"Your content here\")\n```\n\n### Execute Script\n\n```bash\ncd \u002Fpath\u002Fto\u002Fworking\u002Fdirectory && python3 script.py\n```\n\n## Decision Matrix\n\n| Tool | Best For | Limitations |\n|------|----------|-------------|\n| pandoc | Markdown\u002FHTML conversion | Requires external installation |\n| reportlab | Complex layouts, graphics | Steeper learning curve |\n| fpdf2 | Simple text PDFs | Limited formatting options |\n\n## Error Handling Pattern\n\nFor each tool attempt:\n\n1. Check availability\u002Finstallation\n2. Install if missing (`pip install \u003Cpackage>`)\n3. Create script using `write_file`\n4. Execute using `run_shell` with `cd \u003Cdir> && \u003Ccommand>`\n5. Verify output file exists\n6. If fails, move to next tool in sequence\n\n## Example Fallback Implementation\n\n```bash\n# Pseudocode for full workflow\nif command -v pandoc >\u002Fdev\u002Fnull 2>&1; then\n    pandoc input.md -o output.pdf && exit 0\nfi\n\nif python3 -c \"import reportlab\" 2>\u002Fdev\u002Fnull; then\n    # Create and run reportlab script\n    exit 0\nfi\n\n# Final fallback: fpdf2\npip install fpdf2\n# Create and run fpdf2 script\n```\n\n## Key Principles\n\n- **Always verify** tool availability before attempting use\n- **Install on-demand** when a tool is missing\n- **Use write_file** for script creation (ensures clean, versionable code)\n- **Use run_shell** with explicit directory context (`cd \u003Cdir> && \u003Ccmd>`)\n- **Progressive fallback** ensures at least one method succeeds\n- **Verify output** after each attempt before moving to next tool","# PDF Generation Troubleshooting Workflow\n\nThis skill provides a systematic approach to generating PDFs when multiple tools may be unavailable. Follow this fallback sequence to ensure PDF generation succeeds.\n\n## Workflow Overview\n\n1. **Try pandoc first** (simplest for markdown\u002FHTML conversion)\n2. **Fallback to reportlab** (Python library for programmatic PDFs)\n3. **Fallback to fpdf2** (alternative Python PDF library)\n\nEach step includes installation verification before execution.\n\n## Step 1: Attempt pandoc Conversion\n\nUse pandoc for markdown or HTML to PDF conversion. Check availability first:\n\n```bash\n# Check if pandoc is available\nwhich pandoc || echo \"pandoc not found\"\n```\n\nIf available, convert:\n\n```bash\npandoc input.md -o output.pdf\n```\n\nIf pandoc fails or is unavailable, proceed to Step 2.\n\n## Step 2: Attempt reportlab\n\n### Check Installation\n\n```bash\npython3 -c \"import reportlab\" 2>\u002Fdev\u002Fnull && echo \"reportlab available\" || echo \"reportlab not found\"\n```\n\n### Install if Needed\n\n```bash\npip install reportlab\n```\n\n### Create PDF Script\n\nUse `write_file` to create a Python script:\n\n```python\nfrom reportlab.lib.pagesizes import letter\nfrom reportlab.pdfgen import canvas\n\ndef create_pdf(filename, content):\n    c = canvas.Canvas(filename, pagesize=letter)\n    c.drawString(100, 750, content)\n    c.save()\n\nif __name__ == \"__main__\":\n    create_pdf(\"output.pdf\", \"Your content here\")\n```\n\n### Execute Script\n\nUse `run_shell` with proper directory context:\n\n```bash\ncd \u002Fpath\u002Fto\u002Fworking\u002Fdirectory && python3 script.py\n```\n\nIf reportlab fails, proceed to Step 3.\n\n## Step 3: Attempt fpdf2\n\n### Check Installation\n\n```bash\npython3 -c \"from fpdf import FPDF\" 2>\u002Fdev\u002Fnull && echo \"fpdf2 available\" || echo \"fpdf2 not found\"\n```\n\n### Install if Needed\n\n```bash\npip install fpdf2\n```\n\n### Create PDF Script\n\n```python\nfrom fpdf import FPDF\n\ndef create_pdf(filename, text):\n    pdf = FPDF()\n    pdf.add_page()\n    pdf.set_font(\"Arial\", size=12)\n    pdf.cell(200, 10, txt=text, ln=True)\n    pdf.output(filename)\n\nif __name__ == \"__main__\":\n    create_pdf(\"output.pdf\", \"Your content here\")\n```\n\n### Execute Script\n\n```bash\ncd \u002Fpath\u002Fto\u002Fworking\u002Fdirectory && python3 script.py\n```\n\n## Decision Matrix\n\n| Tool | Best For | Limitations |\n|------|----------|-------------|\n| pandoc | Markdown\u002FHTML conversion | Requires external installation |\n| reportlab | Complex layouts, graphics | Steeper learning curve |\n| fpdf2 | Simple text PDFs | Limited formatting options |\n\n## Error Handling Pattern\n\nFor each tool attempt:\n\n1. Check availability\u002Finstallation\n2. Install if missing (`pip install \u003Cpackage>`)\n3. Create script using `write_file`\n4. Execute using `run_shell` with `cd \u003Cdir> && \u003Ccommand>`\n5. Verify output file exists\n6. If fails, move to next tool in sequence\n\n## Example Fallback Implementation\n\n```bash\n# Pseudocode for full workflow\nif command -v pandoc >\u002Fdev\u002Fnull 2>&1; then\n    pandoc input.md -o output.pdf && exit 0\nfi\n\nif python3 -c \"import reportlab\" 2>\u002Fdev\u002Fnull; then\n    # Create and run reportlab script\n    exit 0\nfi\n\n# Final fallback: fpdf2\npip install fpdf2\n# Create and run fpdf2 script\n```\n\n## Key Principles\n\n- **Always verify** tool availability before attempting use\n- **Install on-demand** when a tool is missing\n- **Use write_file** for script creation (ensures clean, versionable code)\n- **Use run_shell** with explicit directory context (`cd \u003Cdir> && \u003Ccmd>`)\n- **Progressive fallback** ensures at least one method succeeds\n- **Verify output** after each attempt before moving to next tool",{"name":5,"description":7},"main","ff671ef61ed6587c49bd54c81cdc751c0b99e363","gdpval_bench\u002Fskills\u002Fpdf-generation-troubleshooting","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace","https:\u002F\u002Fgithub.com\u002FAG064","AG064, E.Mi.\r\n\r\nA person who thinks all the time, yet all they have to think about is nothing. I want to improve the world and work on open source projects","2026-10-08 06:53:48",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add AG064\u002FOpenSpace --skill pdf-generation-troubleshooting",{"tool":54,"command":55},"bunx","bunx skills add AG064\u002FOpenSpace --skill pdf-generation-troubleshooting",{"tool":57,"command":58},"pnpm","pnpm dlx skills add AG064\u002FOpenSpace --skill pdf-generation-troubleshooting","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fpdf-generation-troubleshooting\u002FSKILL.md",true,[62],{"path":63,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":66,"sourceHtmlUrl":67},".skill_id","OTHER","其他",44,"https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fpdf-generation-troubleshooting\u002F.skill_id",[69,92,107,116,146,162],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":36},"01M6KKMPWA0B5SCCH766F8M5EA","write-special-chars-ts-check","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, plus a reliable TypeScript type-checking step that filters output to only the newly-written files to avoid being misled by pre-existing errors.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-ts-check\u002FSKILL.md",[],[76,77,78,79,80,81,35,82,83,84,85,86,87,88,89,90,91],"write special chars ts check","check","write","filters","Existing","type-checking","errors","script","output","type","files","only","template","file","python","typescript",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":36},"01M6KKMJXVBNVEY3TRK055F4A7","write-special-chars-readback","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, with mandatory post-write verification via read_file and cleanup of \u002Ftmp helper scripts.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-readback\u002FSKILL.md",[],[99,100,78,88,101,102,89,90,103,29,104,105,106,35,83,34],"readback","write special chars readback","cleanup","read","scripts","via","post","helper",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":36},"01M6KKMEGX9M9NC105J0W3Q5B9","write-special-chars-heredoc","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) by using a Python heredoc script executed via shell.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-heredoc\u002FSKILL.md",[],[78,114,90,35,104,88,115,89,83],"write special chars heredoc","shell",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":127,"publishedAt":36},"01M6KKM8EJ2AATVHZBNB916WT0","worldmonitor-reference","Curated architecture index of the WorldMonitor open-source dashboard. Reference for extracting patterns — vanilla TypeScript, Panel class hierarchy, service layer, CSS grid, API edge functions, refresh scheduler, and 60+ data source integrations.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fworldmonitor-reference\u002FSKILL.md",[122],{"categoryNo":123,"categoryName":124,"taxonomyType":125,"taxonomyTypeDesc":126},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[128,129,130,131,91,132,133,134,135,136,35,137,138,139,140,141,142,143,144,145],"reference","worldmonitor","worldmonitor reference","dashboard","css","architecture","extracting","hierarchy","source","layer","panel","patterns","edge functions","integrations","open","api","data","scheduler",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":36},"01M6KKM39PHYK627F19GE2B9XN","virtual-list","Implement efficient virtual scrolling for rendering large lists with DOM recycling, chunk-based rendering, and performance optimizations","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fvirtual-list\u002FSKILL.md",[],[153,154,155,156,35,157,34,158,159,160,161],"virtual list","list","virtual","chunk","dom","rendering","recycling","implement","performance",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":36},"01M6KKKY7T2P61Y0JH54CDEJKQ","verify-directory-structure","Diagnose and resolve file access issues by first verifying the directory structure.","https:\u002F\u002Fgithub.com\u002FAG064\u002FOpenSpace\u002Fblob\u002Fmain\u002Fshowcase\u002Fskills\u002Fverify-directory-structure\u002FSKILL.md",[],[169,170,171,172,173,174,89,175,176,177],"directory","verify","structure","verify directory structure","access","first","issues","diagnose","file access"]