[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HXRAV08ADY801PDDYQXCZX":3,"skill-same:01M6HXRAV08ADY801PDDYQXCZX":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":45,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":48,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6HXRAV08ADY801PDDYQXCZX","pdf-text-extraction-9424c5",null,"Extract text from PDF files using pdftotext when read_file returns binary data","HKUDS\u002FAgentPilot","HKUDS","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F118165258?v=4","01M6HW8VRNZP64G0P4MVJW2KKQ","✨Data Intelligence Lab@HKU✨","01M6HW8VWZVHBRHYH3T330PFWV",8024,"MIT","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fgdpval_bench\u002Fskills\u002Fpdf-text-extraction-9424c5\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36],"PDF","extraction","text","pdf text extraction 9424c5","pdf text extraction","file","data","returns","read","extract","files","binary","pdftotext","2026-11-10 10:12:30",false,"---\nname: pdf-text-extraction-9424c5\ndescription: Extract text from PDF files using pdftotext when read_file returns binary data\n---\n\n# PDF Text Extraction via pdftotext\n\n## Problem\n\nWhen using `read_file` on PDF documents, the function may return binary image data or garbled content instead of readable text. This occurs because PDFs can contain scanned images or complex binary structures that `read_file` cannot properly parse as text.\n\n## Solution\n\nUse the `pdftotext` command-line utility via `run_shell` to extract clean text content from PDF files.\n\n## Steps\n\n### 1. Verify PDF file exists\n\n```python\nimport os\n\npdf_path = \"path\u002Fto\u002Fdocument.pdf\"\nif not os.path.exists(pdf_path):\n    raise FileNotFoundError(f\"PDF not found: {pdf_path}\")\n```\n\n### 2. Extract text using pdftotext\n\n```python\nfrom tools import run_shell\n\n# Extract text to stdout\nresult = run_shell(command=f\"pdftotext '{pdf_path}' -\", timeout=60)\npdf_text = result.stdout\n\n# Alternative: extract to a temporary file\ntemp_txt = \"\u002Ftmp\u002Fextracted.txt\"\nrun_shell(command=f\"pdftotext '{pdf_path}' '{temp_txt}'\", timeout=60)\nwith open(temp_txt, 'r') as f:\n    pdf_text = f.read()\n```\n\n### 3. Handle parameter naming carefully\n\nWhen calling `read_file`, be aware of the parameter name:\n- Use `filetype=\"pdf\"` (not `file_type`)\n- Some tool implementations may use different parameter names\n\n```python\n# Correct parameter usage\ncontent = read_file(file_path=\"doc.pdf\", filetype=\"pdf\")\n\n# If this returns binary\u002Fgarbled data, fall back to pdftotext\n```\n\n## Common pdftotext Options\n\n| Option | Description |\n|--------|-------------|\n| `-` | Output to stdout |\n| `-layout` | Maintain original layout |\n| `-f \u003Cn>` | Start from page n |\n| `-l \u003Cn>` | End at page n |\n| `-q` | Quiet mode |\n\nExample with options:\n```python\nresult = run_shell(command=f\"pdftotext -layout -q '{pdf_path}' -\", timeout=60)\n```\n\n## Error Handling\n\n```python\nfrom tools import run_shell\n\ndef extract_pdf_text(pdf_path):\n    \"\"\"Extract text from PDF using pdftotext with error handling.\"\"\"\n    import os\n    \n    if not os.path.exists(pdf_path):\n        raise FileNotFoundError(f\"PDF not found: {pdf_path}\")\n    \n    result = run_shell(command=f\"pdftotext '{pdf_path}' -\", timeout=60)\n    \n    if result.returncode != 0:\n        raise RuntimeError(f\"pdftotext failed: {result.stderr}\")\n    \n    return result.stdout.strip()\n```\n\n## When to Use This Pattern\n\n- `read_file` returns binary data, garbled text, or image content for a PDF\n- You need searchable\u002Fprocessable text from PDF documents\n- The PDF contains text (not just scanned images - for those, consider OCR tools)\n\n## Prerequisites\n\n- `pdftotext` must be installed (part of `poppler-utils` on Debian\u002FUbuntu, `poppler` on macOS via Homebrew)\n- Verify availability: `run_shell(command=\"which pdftotext\")`","# PDF Text Extraction via pdftotext\n\n## Problem\n\nWhen using `read_file` on PDF documents, the function may return binary image data or garbled content instead of readable text. This occurs because PDFs can contain scanned images or complex binary structures that `read_file` cannot properly parse as text.\n\n## Solution\n\nUse the `pdftotext` command-line utility via `run_shell` to extract clean text content from PDF files.\n\n## Steps\n\n### 1. Verify PDF file exists\n\n```python\nimport os\n\npdf_path = \"path\u002Fto\u002Fdocument.pdf\"\nif not os.path.exists(pdf_path):\n    raise FileNotFoundError(f\"PDF not found: {pdf_path}\")\n```\n\n### 2. Extract text using pdftotext\n\n```python\nfrom tools import run_shell\n\n# Extract text to stdout\nresult = run_shell(command=f\"pdftotext '{pdf_path}' -\", timeout=60)\npdf_text = result.stdout\n\n# Alternative: extract to a temporary file\ntemp_txt = \"\u002Ftmp\u002Fextracted.txt\"\nrun_shell(command=f\"pdftotext '{pdf_path}' '{temp_txt}'\", timeout=60)\nwith open(temp_txt, 'r') as f:\n    pdf_text = f.read()\n```\n\n### 3. Handle parameter naming carefully\n\nWhen calling `read_file`, be aware of the parameter name:\n- Use `filetype=\"pdf\"` (not `file_type`)\n- Some tool implementations may use different parameter names\n\n```python\n# Correct parameter usage\ncontent = read_file(file_path=\"doc.pdf\", filetype=\"pdf\")\n\n# If this returns binary\u002Fgarbled data, fall back to pdftotext\n```\n\n## Common pdftotext Options\n\n| Option | Description |\n|--------|-------------|\n| `-` | Output to stdout |\n| `-layout` | Maintain original layout |\n| `-f \u003Cn>` | Start from page n |\n| `-l \u003Cn>` | End at page n |\n| `-q` | Quiet mode |\n\nExample with options:\n```python\nresult = run_shell(command=f\"pdftotext -layout -q '{pdf_path}' -\", timeout=60)\n```\n\n## Error Handling\n\n```python\nfrom tools import run_shell\n\ndef extract_pdf_text(pdf_path):\n    \"\"\"Extract text from PDF using pdftotext with error handling.\"\"\"\n    import os\n    \n    if not os.path.exists(pdf_path):\n        raise FileNotFoundError(f\"PDF not found: {pdf_path}\")\n    \n    result = run_shell(command=f\"pdftotext '{pdf_path}' -\", timeout=60)\n    \n    if result.returncode != 0:\n        raise RuntimeError(f\"pdftotext failed: {result.stderr}\")\n    \n    return result.stdout.strip()\n```\n\n## When to Use This Pattern\n\n- `read_file` returns binary data, garbled text, or image content for a PDF\n- You need searchable\u002Fprocessable text from PDF documents\n- The PDF contains text (not just scanned images - for those, consider OCR tools)\n\n## Prerequisites\n\n- `pdftotext` must be installed (part of `poppler-utils` on Debian\u002FUbuntu, `poppler` on macOS via Homebrew)\n- Verify availability: `run_shell(command=\"which pdftotext\")`",{"name":5,"description":7},"main","6b84b0689ca0d9e7b1e4061188ff6b60758e0f8a","openspace\u002Flegacy\u002Fv1\u002Fgdpval_bench\u002Fskills\u002Fpdf-text-extraction-9424c5",941,"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot","https:\u002F\u002Fgithub.com\u002FHKUDS","https:\u002F\u002Fsites.google.com\u002Fview\u002Fchaoh","2026-11-12 22:26:39",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add HKUDS\u002FAgentPilot --skill pdf-text-extraction-9424c5",{"tool":56,"command":57},"bunx","bunx skills add HKUDS\u002FAgentPilot --skill pdf-text-extraction-9424c5",{"tool":59,"command":60},"pnpm","pnpm dlx skills add HKUDS\u002FAgentPilot --skill pdf-text-extraction-9424c5","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fgdpval_bench\u002Fskills\u002Fpdf-text-extraction-9424c5\u002FSKILL.md",true,[64],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},".skill_id","OTHER","其他",40,"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fgdpval_bench\u002Fskills\u002Fpdf-text-extraction-9424c5\u002F.skill_id",[71,91,110,133,157,178],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":37},"01M6HYB297NDABRERJRVG0K8R0","agentpilot","Set up AgentPilot and use its single entry to prepare missing inputs and run configured RSI experiments. Use when the user requests AgentPilot installation or work with AgentPilot.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fplugins\u002Fagentpilot\u002Fskills\u002Fagentpilot\u002FSKILL.md",[],[73,78,79,80,81,82,83,84,85,86,87,88,89,90],"prepare","requests","with","missing","installation","rsi","up","use","user","work","SET","run","experiments",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":37},"01M6HYAYWXTTE1J7DJM0MFNQ4H","remember","Review auto-memory entries and propose promotions to OPENSPACE.md, OPENSPACE.local.md, or retained auto-memory topics; detect duplicates, stale facts, conflicts, and ambiguous entries before making changes.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fskills\u002Fremember\u002FSKILL.md",[],[93,98,99,100,101,102,103,104,105,106,107,108,109],"memory","review","auto","openspace","changes","facts","detect","entries","local","conflicts","stale","duplicates",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":119,"publishedAt":37},"01M6HYAVMPM4SBDV60R2B5HPV8","skill-discovery","Search reusable OpenSpace skills locally, and browse cloud packages step by step when a cloud skill may help. Reusing proven skills saves tokens, improves reliability, and extends your capabilities beyond built-in tools.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fhost_skills\u002Fskill-discovery\u002FSKILL.md",[116],{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[120,121,122,101,123,124,125,126,127,128,129,130,131,132],"skill discovery","discovery","reusable","step by step","tokens","packages","help","cloud","reliability","capabilities","browse","search","Tools",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":140,"publishedAt":37},"01M6HYAR811B3RB0M50RBEDGN6","delegate-task","Delegate tasks to OpenSpace — a full-stack autonomous worker for coding, DevOps, web research, and desktop automation, backed by an extensive MCP tool and skill library. Skills auto-improve through use, reducing token consumption over time. A cloud community lets agents share and collectively evolve reusable skills.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fhost_skills\u002Fdelegate-task\u002FSKILL.md",[139],{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},[141,142,143,101,144,145,146,147,148,122,100,85,149,150,151,152,153,154,155,156],"delegate","task","delegate task","time","improve","desktop automation","worker","community","autonomous","tool","stack","for","share","tasks","automation","MCP",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":163,"publishedAt":37},"01M6HYAM9FSGV6E52AYENDQXYH","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\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-ts-check\u002FSKILL.md",[],[164,165,166,167,34,168,169,170,29,171,172,173,174,175,152,176,177],"write special chars ts check","write","check","type","filters","only","template","python","typescript","output","Existing","type-checking","errors","script",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":184,"publishedAt":37},"01M6HYAH05HGV7SVWSVR8PJRQD","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\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-readback\u002FSKILL.md",[],[185,186,165,80,152,177,187,188,189,190,32,170,29,191,192,171],"write special chars readback","readback","helper","post","via","scripts","verification","cleanup"]