[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XCTNEN32RTSDF203WJ0HHY":3,"skill-same:01M6XCTNEN32RTSDF203WJ0HHY":64},{"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":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":13,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":48,"updatedAt":49,"install":50,"resources":63},"01M6XCTNEN32RTSDF203WJ0HHY","pdf-reading",null,"Extract text, tables, and structured information from PDF documents using pdfplumber, PyPDF2, or pdftotext command-line tools.","Waaaalnut\u002Fskillsbench","Waaaalnut","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103995656?v=4","01M6XCS9K1V51EY3JMB7DGMX24","01M6XCS9Q4WPW88W62C55G1H44",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Flibs\u002Fartifact-runner\u002Ftasks\u002Fnodemedic-demo\u002Fenvironment\u002Fskills\u002Fpdf-reading\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,36,37],"PDF","reading","pdf reading","documents","Tools","text","command","extract","structured","line","information","command-line","tables","pdfplumber","pdftotext","2026-11-10 10:12:30",false,"---\nname: pdf-reading\ndescription: \"Extract text, tables, and structured information from PDF documents using pdfplumber, PyPDF2, or pdftotext command-line tools.\"\n---\n\n# PDF Reading Skill\n\nThis skill helps agents extract information from PDF documents.\n\n## Tools Available\n\nThe environment has these PDF tools pre-installed:\n- `pdfplumber` - Python library for precise text\u002Ftable extraction\n- `PyPDF2` - Python library for PDF manipulation\n- `pdftotext` - Command-line tool from poppler-utils\n\n## Quick Extraction\n\n### Command Line (Fast)\n\n```bash\n# Extract all text from a PDF\npdftotext \u002Froot\u002Fartifacts\u002Fpaper.pdf -\n\n# Extract specific pages\npdftotext -f 1 -l 3 \u002Froot\u002Fartifacts\u002Fpaper.pdf -\n\n# Extract to a file\npdftotext \u002Froot\u002Fartifacts\u002Fpaper.pdf \u002Ftmp\u002Fpaper.txt\n```\n\n### Python (More Control)\n\n```python\nimport pdfplumber\nfrom pathlib import Path\n\ndef extract_pdf_text(pdf_path: str) -> str:\n    \"\"\"Extract all text from a PDF file.\"\"\"\n    text_parts = []\n    with pdfplumber.open(pdf_path) as pdf:\n        for page in pdf.pages:\n            text = page.extract_text()\n            if text:\n                text_parts.append(text)\n    return \"\\n\\n\".join(text_parts)\n\n# Usage\ntext = extract_pdf_text(\"\u002Froot\u002Fartifacts\u002Fpaper.pdf\")\nprint(text)\n```\n\n## Extracting Specific Information\n\n### Find Commands in Text\n\n```python\nimport re\n\ndef find_commands(text: str) -> list:\n    \"\"\"Extract shell commands from text.\"\"\"\n    # Look for common command patterns\n    patterns = [\n        r'docker run[^\\n]+',\n        r'\\$[^\\n]+',\n        r'--package=[^\\s]+\\s+--version=[^\\s]+',\n    ]\n    commands = []\n    for pattern in patterns:\n        commands.extend(re.findall(pattern, text))\n    return commands\n\ntext = extract_pdf_text(\"\u002Froot\u002Fartifacts\u002Fpaper.pdf\")\ncommands = find_commands(text)\n```\n\n### Extract Tables\n\n```python\nimport pdfplumber\n\ndef extract_tables(pdf_path: str) -> list:\n    \"\"\"Extract all tables from a PDF.\"\"\"\n    tables = []\n    with pdfplumber.open(pdf_path) as pdf:\n        for i, page in enumerate(pdf.pages):\n            page_tables = page.extract_tables()\n            for table in page_tables:\n                tables.append({\n                    \"page\": i + 1,\n                    \"data\": table\n                })\n    return tables\n```\n\n### Find Package Information\n\n```python\nimport re\n\ndef find_package_info(text: str) -> list:\n    \"\"\"Find npm package references (name@version).\"\"\"\n    # Match patterns like node-rsync@1.0.3\n    pattern = r'([a-z0-9-]+)@(\\d+\\.\\d+\\.\\d+)'\n    matches = re.findall(pattern, text.lower())\n    return [{\"name\": m[0], \"version\": m[1]} for m in matches]\n```\n\n## Tips\n\n1. **Check available PDFs first**:\n   ```bash\n   ls -la \u002Froot\u002Fartifacts\u002F\n   ```\n\n2. **Preview before full extraction**:\n   ```bash\n   pdftotext \u002Froot\u002Fartifacts\u002Fpaper.pdf - | head -100\n   ```\n\n3. **Handle multi-column layouts**: pdfplumber handles them better than pdftotext\n\n4. **For structured data**: Look for JSON blocks in the text:\n   ```python\n   import json\n   import re\n\n   json_blocks = re.findall(r'\\{[^{}]*\\}', text)\n   for block in json_blocks:\n       try:\n           data = json.loads(block)\n           print(data)\n       except json.JSONDecodeError:\n           pass\n   ```\n","# PDF Reading Skill\n\nThis skill helps agents extract information from PDF documents.\n\n## Tools Available\n\nThe environment has these PDF tools pre-installed:\n- `pdfplumber` - Python library for precise text\u002Ftable extraction\n- `PyPDF2` - Python library for PDF manipulation\n- `pdftotext` - Command-line tool from poppler-utils\n\n## Quick Extraction\n\n### Command Line (Fast)\n\n```bash\n# Extract all text from a PDF\npdftotext \u002Froot\u002Fartifacts\u002Fpaper.pdf -\n\n# Extract specific pages\npdftotext -f 1 -l 3 \u002Froot\u002Fartifacts\u002Fpaper.pdf -\n\n# Extract to a file\npdftotext \u002Froot\u002Fartifacts\u002Fpaper.pdf \u002Ftmp\u002Fpaper.txt\n```\n\n### Python (More Control)\n\n```python\nimport pdfplumber\nfrom pathlib import Path\n\ndef extract_pdf_text(pdf_path: str) -> str:\n    \"\"\"Extract all text from a PDF file.\"\"\"\n    text_parts = []\n    with pdfplumber.open(pdf_path) as pdf:\n        for page in pdf.pages:\n            text = page.extract_text()\n            if text:\n                text_parts.append(text)\n    return \"\\n\\n\".join(text_parts)\n\n# Usage\ntext = extract_pdf_text(\"\u002Froot\u002Fartifacts\u002Fpaper.pdf\")\nprint(text)\n```\n\n## Extracting Specific Information\n\n### Find Commands in Text\n\n```python\nimport re\n\ndef find_commands(text: str) -> list:\n    \"\"\"Extract shell commands from text.\"\"\"\n    # Look for common command patterns\n    patterns = [\n        r'docker run[^\\n]+',\n        r'\\$[^\\n]+',\n        r'--package=[^\\s]+\\s+--version=[^\\s]+',\n    ]\n    commands = []\n    for pattern in patterns:\n        commands.extend(re.findall(pattern, text))\n    return commands\n\ntext = extract_pdf_text(\"\u002Froot\u002Fartifacts\u002Fpaper.pdf\")\ncommands = find_commands(text)\n```\n\n### Extract Tables\n\n```python\nimport pdfplumber\n\ndef extract_tables(pdf_path: str) -> list:\n    \"\"\"Extract all tables from a PDF.\"\"\"\n    tables = []\n    with pdfplumber.open(pdf_path) as pdf:\n        for i, page in enumerate(pdf.pages):\n            page_tables = page.extract_tables()\n            for table in page_tables:\n                tables.append({\n                    \"page\": i + 1,\n                    \"data\": table\n                })\n    return tables\n```\n\n### Find Package Information\n\n```python\nimport re\n\ndef find_package_info(text: str) -> list:\n    \"\"\"Find npm package references (name@version).\"\"\"\n    # Match patterns like node-rsync@1.0.3\n    pattern = r'([a-z0-9-]+)@(\\d+\\.\\d+\\.\\d+)'\n    matches = re.findall(pattern, text.lower())\n    return [{\"name\": m[0], \"version\": m[1]} for m in matches]\n```\n\n## Tips\n\n1. **Check available PDFs first**:\n   ```bash\n   ls -la \u002Froot\u002Fartifacts\u002F\n   ```\n\n2. **Preview before full extraction**:\n   ```bash\n   pdftotext \u002Froot\u002Fartifacts\u002Fpaper.pdf - | head -100\n   ```\n\n3. **Handle multi-column layouts**: pdfplumber handles them better than pdftotext\n\n4. **For structured data**: Look for JSON blocks in the text:\n   ```python\n   import json\n   import re\n\n   json_blocks = re.findall(r'\\{[^{}]*\\}', text)\n   for block in json_blocks:\n       try:\n           data = json.loads(block)\n           print(data)\n       except json.JSONDecodeError:\n           pass\n   ```\n",{"name":5,"description":7},"main","7eeb258ada72b7f58119b0e7a2c00ea89d9beedd","libs\u002Fartifact-runner\u002Ftasks\u002Fnodemedic-demo\u002Fenvironment\u002Fskills\u002Fpdf-reading","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench","https:\u002F\u002Fgithub.com\u002FWaaaalnut","student of Zhejiang University","2026-04-21 23:16:23",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add Waaaalnut\u002Fskillsbench --skill pdf-reading",{"tool":56,"command":57},"bunx","bunx skills add Waaaalnut\u002Fskillsbench --skill pdf-reading",{"tool":59,"command":60},"pnpm","pnpm dlx skills add Waaaalnut\u002Fskillsbench --skill pdf-reading","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Flibs\u002Fartifact-runner\u002Ftasks\u002Fnodemedic-demo\u002Fenvironment\u002Fskills\u002Fpdf-reading\u002FSKILL.md",true,[],[65,79,93,119,141,160],{"skillNo":66,"name":67,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":75,"publishedAt":38},"01M6XEWMJ6VY3ZC53MPDCPG3GH","data-reconciliation","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fxlsx-recover-data\u002Fenvironment\u002Fskills\u002Fdata-reconciliation\u002FSKILL.md",[70],{"categoryNo":71,"categoryName":72,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[76,77,78],"data reconciliation","reconciliation","data",{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":38},"01M6XEW8MNPMF1KRXV6ATGFRQF","speech-to-text","Transcribe video to timestamped text using Whisper tiny model (pre-installed).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-tutorial-indexer\u002Fenvironment\u002Fskills\u002Fspeech-to-text\u002FSKILL.md",[],[86,28,87,88,89,90,91,92],"speech","speech to text","transcribe video","whisper","model","Video","transcribe",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":102,"publishedAt":38},"01M6XEW3FQZP0T1RKQQJFXVY9T","video-processor","Process videos by removing segments and concatenating remaining parts. Use when you need to remove detected pauses\u002Fopenings from videos, create highlight reels, or batch process segment removals using ffmpeg filter_complex.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fvideo-processor\u002FSKILL.md",[99],{"categoryNo":100,"categoryName":101,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",[91,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118],"processor","video processor","batch","create","reels","when","parts","segments","process","videos","you","segment","filter","ffmpeg","use","remove",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":126,"publishedAt":38},"01M6XEVXJ5KZ0NTY3XZKRY4AS1","silence-detector","Detect initial silence segments in audio\u002Fvideo using energy-based analysis. Use when you need to find low-energy periods at the start of recordings (title slides, setup time, pre-roll silence).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsilence-detector\u002FSKILL.md",[125],{"categoryNo":100,"categoryName":101,"taxonomyType":20,"taxonomyTypeDesc":21},[127,128,129,130,108,113,131,132,133,134,135,110,136,137,91,138,139,140,117],"detector","silence detector","title","slides","time","energy","at","recordings","detect","find","Audio","analysis","start","setup",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":38},"01M6XEVT3NGRN1FT7JPMAPXS6M","segment-combiner","Combine multiple segment detection results into a unified list. Use when you need to merge segments from different detectors, prepare removal lists for video processing, or consolidate detection outputs.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsegment-combiner\u002FSKILL.md",[],[114,148,91,149,150,151,152,153,108,154,155,110,113,156,157,117,158,159],"segment combiner","detection","prepare","merge","video processing","for","outputs","combine","processing","consolidate","results","list",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":169,"publishedAt":38},"01M6XEVMPVASGS2KX86QK4FMT7","report-generator","Generate compression reports for video processing. Use when you need to create structured JSON reports with duration statistics, compression ratios, and segment details after video processing.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Freport-generator\u002FSKILL.md",[166],{"categoryNo":167,"categoryName":168,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000034","行政与办公人员",[170,171,172,114,108,153,113,173,156,174,31,175,117,152,176,91,177,178,106],"generator","report generator","report","with","statistics","reports","json","compression","generate"]