[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6K3JPT5RCGDAMR8BDRXBK12":3,"skill-same:01M6K3JPT5RCGDAMR8BDRXBK12":88},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6K3JPT5RCGDAMR8BDRXBK12","pdf-service",null,"Extract text and tables from PDFs, fill PDF forms, merge and split PDF files, and convert PDFs to other formats. Use when the user mentions PDFs, document extraction, form filling, or needs to manipulate PDF files.","anjijava16\u002FAgent_Skills","anjijava16","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F5849522?v=4","01M6JZVCV62H56AYM59D11EGAW","Anjaiah Methuku","01M6JZVD04H0QP910VNCZMJFAG",0,"MIT","https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002F.github\u002Fskills\u002Fpdf-service\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,38,39,40,41,42,43],"pdf service","service","PDF","files","fill","pip","split","formats","form","forms","document","use","extract","user","text","convert","extraction","welcome","merge","python","2026-11-10 10:12:30",false,"---\nname: pdf-service\ndescription: >\n  Extract text and tables from PDFs, fill PDF forms, merge and split PDF files,\n  and convert PDFs to other formats. Use when the user mentions PDFs, document\n  extraction, form filling, or needs to manipulate PDF files.\nlicense: MIT\ncompatibility: Requires Python 3.10+ and pip\nmetadata:\n  author: welcome\n  version: \"1.0\"\n---\n\n# PDF Service\n\n## When to use this skill\n\nUse this skill when the user needs to:\n- Extract text or tables from PDF documents\n- Fill out PDF form fields programmatically\n- Merge multiple PDFs into one or split a PDF into pages\n- Convert PDFs to images or other formats\n- Analyze PDF structure (page count, metadata, form fields)\n\n## Prerequisites\n\nInstall dependencies before first use:\n\n```bash\npip install pdfplumber pypdf reportlab pdf2image pikepdf\n```\n\nFor scanned\u002Fimage-based PDFs requiring OCR:\n\n```bash\npip install pytesseract Pillow\nbrew install tesseract  # macOS\n```\n\n## Text Extraction\n\nUse pdfplumber for text extraction. For scanned documents, fall back to pdf2image with pytesseract.\n\n```python\nimport pdfplumber\n\nwith pdfplumber.open(\"input.pdf\") as pdf:\n    for page in pdf.pages:\n        text = page.extract_text()\n        if text:\n            print(text)\n```\n\nFor tables:\n\n```python\nwith pdfplumber.open(\"input.pdf\") as pdf:\n    for page in pdf.pages:\n        tables = page.extract_tables()\n        for table in tables:\n            for row in table:\n                print(row)\n```\n\n## Form Filling\n\nUse the plan-validate-execute pattern:\n\n1. **Analyze** — List all form fields:\n\n```python\nfrom pypdf import PdfReader\n\nreader = PdfReader(\"form.pdf\")\nfields = reader.get_fields()\nfor name, field in fields.items():\n    print(f\"{name}: type={field.get('\u002FFT')}, value={field.get('\u002FV')}\")\n```\n\n2. **Map** — Create a dict mapping field names to values\n3. **Fill** — Write values into the form:\n\n```python\nfrom pypdf import PdfReader, PdfWriter\n\nreader = PdfReader(\"form.pdf\")\nwriter = PdfWriter()\nwriter.append(reader)\nwriter.update_page_form_field_values(writer.pages[0], {\"field_name\": \"value\"})\nwith open(\"filled.pdf\", \"wb\") as f:\n    writer.write(f)\n```\n\n## Merge and Split\n\nMerge multiple PDFs:\n\n```python\nfrom pypdf import PdfMerger\n\nmerger = PdfMerger()\nfor path in [\"file1.pdf\", \"file2.pdf\", \"file3.pdf\"]:\n    merger.append(path)\nmerger.write(\"merged.pdf\")\nmerger.close()\n```\n\nSplit into individual pages:\n\n```python\nfrom pypdf import PdfReader, PdfWriter\n\nreader = PdfReader(\"input.pdf\")\nfor i, page in enumerate(reader.pages):\n    writer = PdfWriter()\n    writer.add_page(page)\n    writer.write(f\"page_{i + 1}.pdf\")\n```\n\n## PDF to Images\n\n```python\nfrom pdf2image import convert_from_path\n\nimages = convert_from_path(\"input.pdf\", dpi=300)\nfor i, img in enumerate(images):\n    img.save(f\"page_{i + 1}.png\", \"PNG\")\n```\n\n## Gotchas\n\n- **pdfplumber vs pypdf**: Use pdfplumber for *reading* text\u002Ftables. Use pypdf for *writing* (merge, split, form fill). They solve different problems.\n- **Scanned PDFs return empty text**: `extract_text()` returns `None` or `\"\"` for image-based PDFs. Detect this and fall back to OCR with pytesseract.\n- **Form field names are case-sensitive** and often contain spaces or special characters. Always list fields first before attempting to fill.\n- **Encrypted PDFs**: pypdf can open PDFs with an empty password (`PdfReader(\"file.pdf\", password=\"\")`), but truly encrypted files need the actual password.\n- **Large PDFs**: Process page-by-page instead of loading entire documents into memory.\n- **pdf2image requires poppler**: On macOS install via `brew install poppler`. Without it, `convert_from_path` will fail with a cryptic error.\n\n## Validation\n\nAfter any PDF operation:\n1. Open the output file to verify it renders correctly\n2. For form fills, re-read the filled PDF and check field values match expected\n3. For merges, verify page count equals sum of input page counts\n\n## References\n\n- See [references\u002FREFERENCE.md](references\u002FREFERENCE.md) for advanced patterns (watermarks, encryption, metadata editing)\n","# PDF Service\n\n## When to use this skill\n\nUse this skill when the user needs to:\n- Extract text or tables from PDF documents\n- Fill out PDF form fields programmatically\n- Merge multiple PDFs into one or split a PDF into pages\n- Convert PDFs to images or other formats\n- Analyze PDF structure (page count, metadata, form fields)\n\n## Prerequisites\n\nInstall dependencies before first use:\n\n```bash\npip install pdfplumber pypdf reportlab pdf2image pikepdf\n```\n\nFor scanned\u002Fimage-based PDFs requiring OCR:\n\n```bash\npip install pytesseract Pillow\nbrew install tesseract  # macOS\n```\n\n## Text Extraction\n\nUse pdfplumber for text extraction. For scanned documents, fall back to pdf2image with pytesseract.\n\n```python\nimport pdfplumber\n\nwith pdfplumber.open(\"input.pdf\") as pdf:\n    for page in pdf.pages:\n        text = page.extract_text()\n        if text:\n            print(text)\n```\n\nFor tables:\n\n```python\nwith pdfplumber.open(\"input.pdf\") as pdf:\n    for page in pdf.pages:\n        tables = page.extract_tables()\n        for table in tables:\n            for row in table:\n                print(row)\n```\n\n## Form Filling\n\nUse the plan-validate-execute pattern:\n\n1. **Analyze** — List all form fields:\n\n```python\nfrom pypdf import PdfReader\n\nreader = PdfReader(\"form.pdf\")\nfields = reader.get_fields()\nfor name, field in fields.items():\n    print(f\"{name}: type={field.get('\u002FFT')}, value={field.get('\u002FV')}\")\n```\n\n2. **Map** — Create a dict mapping field names to values\n3. **Fill** — Write values into the form:\n\n```python\nfrom pypdf import PdfReader, PdfWriter\n\nreader = PdfReader(\"form.pdf\")\nwriter = PdfWriter()\nwriter.append(reader)\nwriter.update_page_form_field_values(writer.pages[0], {\"field_name\": \"value\"})\nwith open(\"filled.pdf\", \"wb\") as f:\n    writer.write(f)\n```\n\n## Merge and Split\n\nMerge multiple PDFs:\n\n```python\nfrom pypdf import PdfMerger\n\nmerger = PdfMerger()\nfor path in [\"file1.pdf\", \"file2.pdf\", \"file3.pdf\"]:\n    merger.append(path)\nmerger.write(\"merged.pdf\")\nmerger.close()\n```\n\nSplit into individual pages:\n\n```python\nfrom pypdf import PdfReader, PdfWriter\n\nreader = PdfReader(\"input.pdf\")\nfor i, page in enumerate(reader.pages):\n    writer = PdfWriter()\n    writer.add_page(page)\n    writer.write(f\"page_{i + 1}.pdf\")\n```\n\n## PDF to Images\n\n```python\nfrom pdf2image import convert_from_path\n\nimages = convert_from_path(\"input.pdf\", dpi=300)\nfor i, img in enumerate(images):\n    img.save(f\"page_{i + 1}.png\", \"PNG\")\n```\n\n## Gotchas\n\n- **pdfplumber vs pypdf**: Use pdfplumber for *reading* text\u002Ftables. Use pypdf for *writing* (merge, split, form fill). They solve different problems.\n- **Scanned PDFs return empty text**: `extract_text()` returns `None` or `\"\"` for image-based PDFs. Detect this and fall back to OCR with pytesseract.\n- **Form field names are case-sensitive** and often contain spaces or special characters. Always list fields first before attempting to fill.\n- **Encrypted PDFs**: pypdf can open PDFs with an empty password (`PdfReader(\"file.pdf\", password=\"\")`), but truly encrypted files need the actual password.\n- **Large PDFs**: Process page-by-page instead of loading entire documents into memory.\n- **pdf2image requires poppler**: On macOS install via `brew install poppler`. Without it, `convert_from_path` will fail with a cryptic error.\n\n## Validation\n\nAfter any PDF operation:\n1. Open the output file to verify it renders correctly\n2. For form fills, re-read the filled PDF and check field values match expected\n3. For merges, verify page count equals sum of input page counts\n\n## References\n\n- See [references\u002FREFERENCE.md](references\u002FREFERENCE.md) for advanced patterns (watermarks, encryption, metadata editing)\n",{"name":5,"license":15,"metadata":49,"description":51,"compatibility":52},{"author":41,"version":50},"1.0","Extract text and tables from PDFs, fill PDF forms, merge and split PDF files, and convert PDFs to other formats. Use when the user mentions PDFs, document extraction, form filling, or needs to manipulate PDF files.\n","Requires Python 3.10+ and pip","develop","d85a5e71a5e3e82038a005e5dfa50b6a78cafa7e",".github\u002Fskills\u002Fpdf-service",1,"https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills","https:\u002F\u002Fgithub.com\u002Fanjijava16","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fanjaiahmethuku\u002F","AI & Data Engineer ■ Real-time Streaming ■ BigData ■ Machine Learning ■ CLOUD ■ JAVA ■ PYTHON ■ Blog ■  Remain Curious And Keep Learning .....","2026-10-08 08:03:12",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add anjijava16\u002FAgent_Skills --skill pdf-service",{"tool":68,"command":69},"bunx","bunx skills add anjijava16\u002FAgent_Skills --skill pdf-service",{"tool":71,"command":72},"pnpm","pnpm dlx skills add anjijava16\u002FAgent_Skills --skill pdf-service","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002F.github\u002Fskills\u002Fpdf-service\u002FSKILL.md",true,[76,82],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"references\u002FREFERENCE.md","REFERENCE","参考文档",2083,"https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002F.github\u002Fskills\u002Fpdf-service\u002Freferences\u002FREFERENCE.md",{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},"scripts\u002Fextract_text.py","SCRIPT","脚本",1171,"https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002F.github\u002Fskills\u002Fpdf-service\u002Fscripts\u002Fextract_text.py",[89,108,114,134,151,183],{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":44},"01M6K52P5M72CRGAHJTVAWSNRA","roll-dice","Roll dice using a random number generator. Use when asked to roll a die (d4, d6, d8, d10, d12, d20, d100), roll multiple dice, or generate random dice rolls for tabletop RPGs, board games, or decision making.","https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002Froll-dice\u002FSKILL.md",[],[96,97,41,98,99,100,101,35,102,103,104,105,106,107],"roll dice","dice","generate","tabletop","decision","board","decision making","random","games","generator","number","for",{"skillNo":109,"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":110,"categories":111,"keywords":113,"publishedAt":44},"01M6K52JJKRBM0A5EXT12G87RW","https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002Fpdf-service\u002FSKILL.md",[112],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[26,25,24,43,42,41,40,39,38,37,36,35,27,34,33,32,31,30,29,28],{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":121,"publishedAt":44},"01M6K52EVG86E60AQFMJAZ1G09","pdf-processing","Extract text, tables, and metadata from PDF documents. Parse scanned PDFs with OCR, analyze PDF structure, and convert PDFs to other formats. Use when the user needs to read, parse, or extract content from PDF files, even if they just say \"get the text from this document.\"","https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002Fpdf-processing\u002FSKILL.md",[120],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[26,122,123,43,124,125,39,126,38,127,128,35,129,27,34,130,131,132,133,29],"pdf processing","processing","documents","ocr","analyze","just","read","say","structure","get","tesseract","with",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":143,"publishedAt":44},"01M6K52A7EC35DTS48PP0VX5TB","my-skill","A template skill for [describe task]. Use when the user asks to [trigger phrases].","https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002Fmy-skill\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[144,145,146,147,37,35,148,149,150,107],"my skill","my","template skill","template","task","trigger","name",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":168,"publishedAt":44},"01M6K51Y5QVHMDX3F01JJRRV33","data-analysis","Analyze datasets — compute summary statistics, clean messy data, add derived columns, detect outliers, and generate charts. Use when the user has a CSV, TSV, Excel, or JSON data file and wants to explore, transform, visualize, or understand the data, even if they don't explicitly mention \"analysis.\"","https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002Fdata-analysis\u002FSKILL.md",[157,160,163],{"categoryNo":158,"categoryName":159,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000004","电子表格",{"categoryNo":161,"categoryName":162,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":164,"categoryName":165,"taxonomyType":166,"taxonomyTypeDesc":167},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[169,170,171,172,43,173,41,98,174,175,176,177,126,35,178,179,180,181,182,29],"data analysis","data","analysis","xlsx","visualize","file","csv","Charts","explore","clean","statistics","add","transform","columns",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":195,"publishedAt":44},"01M6K51P73MWRNWFM80SYVBST0","code-review","Review code for bugs, security vulnerabilities, performance issues, and style problems. Provide actionable feedback with severity levels and fix suggestions. Use when the user asks to review, audit, or check code quality, or wants a second pair of eyes on a pull request, diff, or code change.","https:\u002F\u002Fgithub.com\u002Fanjijava16\u002FAgent_Skills\u002Fblob\u002Fdevelop\u002Fcode-review\u002FSKILL.md",[189,192],{"categoryNo":190,"categoryName":191,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":193,"categoryName":194,"taxonomyType":166,"taxonomyTypeDesc":167},"01JBSEEDCAT000000000000030","开发工程师",[196,197,198,199,200,201,202,203,204,205,206,207,208,35,209,210,211,133,107,212],"code review","review","code","performance","change","code quality","issues","pull","audit","severity","feedback","check","fix","diff","style","actionable","bugs"]