[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KFSKADVCQYZ7XDGP75268T":3,"skill-same:01M6KFSKADVCQYZ7XDGP75268T":71},{"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":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":48,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6KFSKADVCQYZ7XDGP75268T","pdf-verification-cli",null,"Verify PDF page count and content using command-line tools when Python libraries unavailable","xyliu-cs\u002FOpenSpace-GDPval","xyliu-cs","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F89236536?v=4","01M6KF8Z1V4TXS86CKSH48BY8T","xy","01M6KF8Z67443W0SHXM85JEF0B",0,"MIT","https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fpdf-verification-cli\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,37],"PDF","cli","verification","pdf verification cli","pdf verification","python","libraries","content","Tools","verify","page","command","line","command-line","2026-11-10 10:12:30",false,"---\nname: pdf-verification-cli\ndescription: Verify PDF page count and content using command-line tools when Python libraries unavailable\n---\n\n# PDF Verification with Command-Line Tools\n\nWhen verifying PDF files during task execution, Python libraries like PyPDF2 may not be available in the environment. This skill provides a reliable alternative using standard command-line tools from the `poppler-utils` package.\n\n## When to Use This Skill\n\n- Need to verify PDF page count\n- Need to inspect PDF text content\n- PyPDF2 or similar Python PDF libraries are unavailable\n- Working in minimal\u002Fcontainerized environments\n\n## Core Tools\n\n### 1. `pdfinfo` - Extract PDF Metadata\n\nUse `pdfinfo` to get page count and other metadata:\n\n```bash\n# Get full PDF info\npdfinfo document.pdf\n\n# Get only page count\npdfinfo document.pdf | grep Pages\n\n# Extract page count as a number\npdfinfo document.pdf | grep Pages | awk '{print $2}'\n```\n\n**Key metadata fields:**\n- `Pages`: Number of pages in the PDF\n- `Title`: Document title\n- `Author`: Document author\n- `Creator`: Application that created the PDF\n- `Producer`: Application that processed the PDF\n- `CreationDate`: When the PDF was created\n- `ModDate`: Last modification date\n\n### 2. `pdftotext` - Extract Text Content\n\nUse `pdftotext` to inspect the actual content of the PDF:\n\n```bash\n# Extract all text to stdout\npdftotext document.pdf -\n\n# Extract text to a file\npdftotext document.pdf output.txt\n\n# Extract text from specific page range\npdftotext -f 1 -l 3 document.pdf output.txt\n\n# Preserve layout (rough formatting)\npdftotext -layout document.pdf output.txt\n```\n\n## Verification Workflow\n\n### Step 1: Check Tool Availability\n\n```bash\n# Check if tools are installed\nwhich pdfinfo\nwhich pdftotext\n\n# Or test with --help\npdfinfo --help 2>&1 | head -1\n```\n\n### Step 2: Install if Needed\n\n```bash\n# Debian\u002FUbuntu\napt-get update && apt-get install -y poppler-utils\n\n# RHEL\u002FCentOS\u002FFedora\nyum install -y poppler-utils\n# or\ndnf install -y poppler-utils\n\n# macOS (with Homebrew)\nbrew install poppler\n```\n\n### Step 3: Verify PDF Properties\n\n```bash\n# Verify page count matches expected\nEXPECTED_PAGES=4\nACTUAL_PAGES=$(pdfinfo document.pdf | grep Pages | awk '{print $2}')\n\nif [ \"$ACTUAL_PAGES\" -eq \"$EXPECTED_PAGES\" ]; then\n    echo \"✓ Page count verified: $ACTUAL_PAGES pages\"\nelse\n    echo \"✗ Page count mismatch: expected $EXPECTED_PAGES, got $ACTUAL_PAGES\"\nfi\n```\n\n### Step 4: Verify PDF Content\n\n```bash\n# Check for required sections\u002Fcontent\npdftotext document.pdf - | grep -i \"checklist\" && echo \"✓ Contains checklist section\"\npdftotext document.pdf - | grep -i \"references\" && echo \"✓ Contains references section\"\n\n# Count occurrences of key terms\npdftotext document.pdf - | grep -ci \"assessment\"  # Case-insensitive count\n```\n\n## Python Integration Example\n\n```python\nimport subprocess\n\ndef get_pdf_page_count(pdf_path):\n    \"\"\"Get page count using pdfinfo\"\"\"\n    result = subprocess.run(\n        ['pdfinfo', pdf_path],\n        capture_output=True,\n        text=True\n    )\n    for line in result.stdout.split('\\n'):\n        if line.startswith('Pages:'):\n            return int(line.split(':')[1].strip())\n    return None\n\ndef extract_pdf_text(pdf_path):\n    \"\"\"Extract all text from PDF using pdftotext\"\"\"\n    result = subprocess.run(\n        ['pdftotext', pdf_path, '-'],\n        capture_output=True,\n        text=True\n    )\n    return result.stdout\n\ndef verify_pdf(pdf_path, expected_pages, required_terms):\n    \"\"\"Verify PDF has expected page count and contains required terms\"\"\"\n    # Check page count\n    pages = get_pdf_page_count(pdf_path)\n    if pages != expected_pages:\n        return False, f\"Expected {expected_pages} pages, got {pages}\"\n    \n    # Check content\n    text = extract_pdf_text(pdf_path).lower()\n    missing = [term for term in required_terms if term.lower() not in text]\n    \n    if missing:\n        return False, f\"Missing terms: {missing}\"\n    \n    return True, \"PDF verification passed\"\n```\n\n## Common Use Cases\n\n| Task | Command |\n|------|---------|\n| Count pages | `pdfinfo file.pdf \\| grep Pages` |\n| Check if PDF has text | `pdftotext file.pdf - \\| head -5` |\n| Search for keyword | `pdftotext file.pdf - \\| grep -i \"keyword\"` |\n| Extract first page | `pdftotext -f 1 -l 1 file.pdf out.txt` |\n| Get PDF title | `pdfinfo file.pdf \\| grep Title` |\n\n## Troubleshooting\n\n**`pdfinfo: command not found`**\n- Install poppler-utils (see Step 2 above)\n- Ensure PATH includes the installation directory\n\n**`pdftotext` returns empty output**\n- PDF may be image-only (scanned) - requires OCR\n- PDF may be encrypted\u002Fpassword-protected\n- Try `pdftotext -layout` for better text extraction\n\n**Page count seems wrong**\n- Some PDFs have blank pages counted\n- Verify with `pdftotext` to see actual content per page\n\n## Best Practices\n\n1. **Always verify both structure and content** - Page count alone doesn't guarantee content quality\n2. **Use case-insensitive searches** - Content may vary in capitalization\n3. **Handle errors gracefully** - Tools may fail on corrupted or encrypted PDFs\n4. **Combine with file existence checks** - Verify PDF exists before running tools","# PDF Verification with Command-Line Tools\n\nWhen verifying PDF files during task execution, Python libraries like PyPDF2 may not be available in the environment. This skill provides a reliable alternative using standard command-line tools from the `poppler-utils` package.\n\n## When to Use This Skill\n\n- Need to verify PDF page count\n- Need to inspect PDF text content\n- PyPDF2 or similar Python PDF libraries are unavailable\n- Working in minimal\u002Fcontainerized environments\n\n## Core Tools\n\n### 1. `pdfinfo` - Extract PDF Metadata\n\nUse `pdfinfo` to get page count and other metadata:\n\n```bash\n# Get full PDF info\npdfinfo document.pdf\n\n# Get only page count\npdfinfo document.pdf | grep Pages\n\n# Extract page count as a number\npdfinfo document.pdf | grep Pages | awk '{print $2}'\n```\n\n**Key metadata fields:**\n- `Pages`: Number of pages in the PDF\n- `Title`: Document title\n- `Author`: Document author\n- `Creator`: Application that created the PDF\n- `Producer`: Application that processed the PDF\n- `CreationDate`: When the PDF was created\n- `ModDate`: Last modification date\n\n### 2. `pdftotext` - Extract Text Content\n\nUse `pdftotext` to inspect the actual content of the PDF:\n\n```bash\n# Extract all text to stdout\npdftotext document.pdf -\n\n# Extract text to a file\npdftotext document.pdf output.txt\n\n# Extract text from specific page range\npdftotext -f 1 -l 3 document.pdf output.txt\n\n# Preserve layout (rough formatting)\npdftotext -layout document.pdf output.txt\n```\n\n## Verification Workflow\n\n### Step 1: Check Tool Availability\n\n```bash\n# Check if tools are installed\nwhich pdfinfo\nwhich pdftotext\n\n# Or test with --help\npdfinfo --help 2>&1 | head -1\n```\n\n### Step 2: Install if Needed\n\n```bash\n# Debian\u002FUbuntu\napt-get update && apt-get install -y poppler-utils\n\n# RHEL\u002FCentOS\u002FFedora\nyum install -y poppler-utils\n# or\ndnf install -y poppler-utils\n\n# macOS (with Homebrew)\nbrew install poppler\n```\n\n### Step 3: Verify PDF Properties\n\n```bash\n# Verify page count matches expected\nEXPECTED_PAGES=4\nACTUAL_PAGES=$(pdfinfo document.pdf | grep Pages | awk '{print $2}')\n\nif [ \"$ACTUAL_PAGES\" -eq \"$EXPECTED_PAGES\" ]; then\n    echo \"✓ Page count verified: $ACTUAL_PAGES pages\"\nelse\n    echo \"✗ Page count mismatch: expected $EXPECTED_PAGES, got $ACTUAL_PAGES\"\nfi\n```\n\n### Step 4: Verify PDF Content\n\n```bash\n# Check for required sections\u002Fcontent\npdftotext document.pdf - | grep -i \"checklist\" && echo \"✓ Contains checklist section\"\npdftotext document.pdf - | grep -i \"references\" && echo \"✓ Contains references section\"\n\n# Count occurrences of key terms\npdftotext document.pdf - | grep -ci \"assessment\"  # Case-insensitive count\n```\n\n## Python Integration Example\n\n```python\nimport subprocess\n\ndef get_pdf_page_count(pdf_path):\n    \"\"\"Get page count using pdfinfo\"\"\"\n    result = subprocess.run(\n        ['pdfinfo', pdf_path],\n        capture_output=True,\n        text=True\n    )\n    for line in result.stdout.split('\\n'):\n        if line.startswith('Pages:'):\n            return int(line.split(':')[1].strip())\n    return None\n\ndef extract_pdf_text(pdf_path):\n    \"\"\"Extract all text from PDF using pdftotext\"\"\"\n    result = subprocess.run(\n        ['pdftotext', pdf_path, '-'],\n        capture_output=True,\n        text=True\n    )\n    return result.stdout\n\ndef verify_pdf(pdf_path, expected_pages, required_terms):\n    \"\"\"Verify PDF has expected page count and contains required terms\"\"\"\n    # Check page count\n    pages = get_pdf_page_count(pdf_path)\n    if pages != expected_pages:\n        return False, f\"Expected {expected_pages} pages, got {pages}\"\n    \n    # Check content\n    text = extract_pdf_text(pdf_path).lower()\n    missing = [term for term in required_terms if term.lower() not in text]\n    \n    if missing:\n        return False, f\"Missing terms: {missing}\"\n    \n    return True, \"PDF verification passed\"\n```\n\n## Common Use Cases\n\n| Task | Command |\n|------|---------|\n| Count pages | `pdfinfo file.pdf \\| grep Pages` |\n| Check if PDF has text | `pdftotext file.pdf - \\| head -5` |\n| Search for keyword | `pdftotext file.pdf - \\| grep -i \"keyword\"` |\n| Extract first page | `pdftotext -f 1 -l 1 file.pdf out.txt` |\n| Get PDF title | `pdfinfo file.pdf \\| grep Title` |\n\n## Troubleshooting\n\n**`pdfinfo: command not found`**\n- Install poppler-utils (see Step 2 above)\n- Ensure PATH includes the installation directory\n\n**`pdftotext` returns empty output**\n- PDF may be image-only (scanned) - requires OCR\n- PDF may be encrypted\u002Fpassword-protected\n- Try `pdftotext -layout` for better text extraction\n\n**Page count seems wrong**\n- Some PDFs have blank pages counted\n- Verify with `pdftotext` to see actual content per page\n\n## Best Practices\n\n1. **Always verify both structure and content** - Page count alone doesn't guarantee content quality\n2. **Use case-insensitive searches** - Content may vary in capitalization\n3. **Handle errors gracefully** - Tools may fail on corrupted or encrypted PDFs\n4. **Combine with file existence checks** - Verify PDF exists before running tools",{"name":5,"description":7},"main","af1b40a42167d09c30b3a63000aa14ace4c1e229","gdpval_bench\u002Fskills\u002Fpdf-verification-cli","https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval","https:\u002F\u002Fgithub.com\u002Fxyliu-cs","https:\u002F\u002Fxyliu-cs.github.io","PhD Student in CS, CUHK-Shenzhen.","2026-04-06 20:32:15",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add xyliu-cs\u002FOpenSpace-GDPval --skill pdf-verification-cli",{"tool":57,"command":58},"bunx","bunx skills add xyliu-cs\u002FOpenSpace-GDPval --skill pdf-verification-cli",{"tool":60,"command":61},"pnpm","pnpm dlx skills add xyliu-cs\u002FOpenSpace-GDPval --skill pdf-verification-cli","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fpdf-verification-cli\u002FSKILL.md",true,[65],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},".skill_id","OTHER","其他",34,"https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fpdf-verification-cli\u002F.skill_id",[72,85,93,109,135,155],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":38},"01M6KG8MF1S664SWBDENYRSCK8","zip-export-deliverable","Ensures codebase deliverables are properly exported as ZIP archives through a dedicated finalization step","https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fzip-export-deliverable\u002FSKILL.md",[],[79,80,81,82,83,84],"zip export deliverable","zip","export","deliverables","codebase","as",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":38},"01M6KG8GAZWHHEK7VNJDW0ME21","zip-deliverable-finalization","Ensure codebase deliverables are properly packaged as ZIP exports in a dedicated final step","https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fzip-deliverable-finalization\u002FSKILL.md",[],[92,80,82,83,84],"zip deliverable finalization",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":38},"01M6KG8CMQQ1PYMNTSRZ9VS1MD","zero-iteration-failure-analysis","Identify and handle agent failures with 0 iterations as pre-execution system issues","https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fzero-iteration-failure-analysis\u002FSKILL.md",[],[100,101,102,103,104,105,106,107,84,108],"failure analysis","ZeRO","analysis","iteration","zero iteration failure analysis","with","issues","execution","system",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":120,"publishedAt":38},"01M6KG86W3PA07FT9W58YHHERM","write-file-fallback-report","Generate professional documents using write_file when primary data sources fail, leveraging embedded domain knowledge instead of external retrieval","https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fwrite-file-fallback-report\u002FSKILL.md",[115],{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[121,122,123,124,125,126,127,128,129,130,131,132,133,134],"fallback","write","file","report","write file fallback report","domain","professional","sources","retrieval","generate","embedded","documents","data","knowledge",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":144,"publishedAt":38},"01M6KG82GAEY3GG77CMGCK1C2T","fallback-doc-with-delegation","Generate professional documents after tool failures using shell_agent for complex formats or write_file for simple text\u002Fmarkdown","https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fwrite-file-fallback-report-enhanced\u002FSKILL.md",[141],{"categoryNo":142,"categoryName":143,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[145,105,121,146,147,148,132,130,123,149,150,151,122,152,127,153,154],"fallback doc with delegation","doc","delegation","shell","markdown","tool","text","simple","formats","for",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":162,"publishedAt":38},"01M6KG7WT7GX5NYCGEFHW22NV7","context-anchored-fallback-report","Generate documents with write_file when retrieval tools fail, with explicit guardrails against task context drift","https:\u002F\u002Fgithub.com\u002Fxyliu-cs\u002FOpenSpace-GDPval\u002Fblob\u002Fmain\u002Fgdpval_bench\u002Fskills\u002Fwrite-file-fallback-report-enhanced-4bc5c2\u002FSKILL.md",[161],{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},[121,124,163,164,130,123,165,32,122,166,167,129,105,168,132],"context","context anchored fallback report","Guardrails","task","drift","context drift"]