[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CF7RH93DHJQVDPGXE2CF5A":3,"skill-same:01M6CF7RH93DHJQVDPGXE2CF5A":120},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":51,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M6CF7RH93DHJQVDPGXE2CF5A","processing-pdfs",null,"Processes PDF files. Extracts text and tables, fills forms, merges and splits documents, batch-processes files, converts to images, and generates PDFs programmatically. Use when working with .pdf files. Do NOT use for Word documents, spreadsheets, or presentations.","telagod\u002Fcode-abyss","telagod","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F39987513?v=4","01M6CF4EH93PP5CWH3J34Z66DP","01M6CF4EN6W4QFXK3PRE9W29X8",245,"MIT","https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\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,38],"processing pdfs","PDF","documents","presentations","spreadsheets","batch","file","Bash","Word","text","read","write","edit","use","images","files","2026-11-10 10:12:30",false,"---\nname: processing-pdfs\ndescription: Processes PDF files. Extracts text and tables, fills forms, merges and splits documents, batch-processes files, converts to images, and generates PDFs programmatically. Use when working with .pdf files. Do NOT use for Word documents, spreadsheets, or presentations.\nuser-invocable: false\nallowed-tools: Bash, Read, Write, Edit, Glob\nargument-hint: \u003Cfile.pdf | task>\n---\n\n# PDF Processing\n\nEssential PDF operations using Python libraries and CLI tools.\n\n## Decision Matrix\n\n| Task | Best Tool | Reference |\n|------|-----------|-----------|\n| Merge \u002F split \u002F metadata \u002F rotate | pypdf | [recipes.md](references\u002Frecipes.md) |\n| Extract text (layout preserved) | pdfplumber | [recipes.md](references\u002Frecipes.md) |\n| Extract tables | pdfplumber | [recipes.md](references\u002Frecipes.md) |\n| Create new PDF | reportlab | [recipes.md](references\u002Frecipes.md) |\n| Batch CLI ops | qpdf \u002F pdftk | [recipes.md](references\u002Frecipes.md) |\n| OCR scanned PDFs | pytesseract + pdf2image | [advanced.md](references\u002Fadvanced.md) |\n| Add watermark \u002F extract images \u002F encrypt | pypdf \u002F pdfimages | [advanced.md](references\u002Fadvanced.md) |\n| Fill PDF forms | pdf-lib \u002F pypdf | [FORMS.md](FORMS.md) |\n| Advanced pypdfium2 \u002F pdf-lib JS | — | [REFERENCE.md](REFERENCE.md) |\n\n## Quick Start\n\n```python\nfrom pypdf import PdfReader\nreader = PdfReader(\"document.pdf\")\nprint(f\"Pages: {len(reader.pages)}\")\ntext = \"\".join(page.extract_text() for page in reader.pages)\n```\n\n## Workflow\n\n1. **Identify task** — text extraction? table? creation? form? Pick row from matrix above.\n2. **Load reference** — recipes.md covers 90% of tasks; advanced.md for OCR \u002F encrypt; FORMS.md for forms.\n3. **Implement** — copy-adapt recipe; verify output.\n4. **Validate** — open in a viewer or grep extracted text.\n\n## Library Selection\n\n| Library | Use for |\n|---------|---------|\n| pypdf | Merge, split, metadata, encryption, rotation |\n| pdfplumber | Text extraction with layout, tables |\n| reportlab | Generate PDFs programmatically |\n| pdf2image + pytesseract | OCR scanned documents |\n| qpdf \u002F pdftk (CLI) | Batch ops, no Python needed |\n","# PDF Processing\n\nEssential PDF operations using Python libraries and CLI tools.\n\n## Decision Matrix\n\n| Task | Best Tool | Reference |\n|------|-----------|-----------|\n| Merge \u002F split \u002F metadata \u002F rotate | pypdf | [recipes.md](references\u002Frecipes.md) |\n| Extract text (layout preserved) | pdfplumber | [recipes.md](references\u002Frecipes.md) |\n| Extract tables | pdfplumber | [recipes.md](references\u002Frecipes.md) |\n| Create new PDF | reportlab | [recipes.md](references\u002Frecipes.md) |\n| Batch CLI ops | qpdf \u002F pdftk | [recipes.md](references\u002Frecipes.md) |\n| OCR scanned PDFs | pytesseract + pdf2image | [advanced.md](references\u002Fadvanced.md) |\n| Add watermark \u002F extract images \u002F encrypt | pypdf \u002F pdfimages | [advanced.md](references\u002Fadvanced.md) |\n| Fill PDF forms | pdf-lib \u002F pypdf | [FORMS.md](FORMS.md) |\n| Advanced pypdfium2 \u002F pdf-lib JS | — | [REFERENCE.md](REFERENCE.md) |\n\n## Quick Start\n\n```python\nfrom pypdf import PdfReader\nreader = PdfReader(\"document.pdf\")\nprint(f\"Pages: {len(reader.pages)}\")\ntext = \"\".join(page.extract_text() for page in reader.pages)\n```\n\n## Workflow\n\n1. **Identify task** — text extraction? table? creation? form? Pick row from matrix above.\n2. **Load reference** — recipes.md covers 90% of tasks; advanced.md for OCR \u002F encrypt; FORMS.md for forms.\n3. **Implement** — copy-adapt recipe; verify output.\n4. **Validate** — open in a viewer or grep extracted text.\n\n## Library Selection\n\n| Library | Use for |\n|---------|---------|\n| pypdf | Merge, split, metadata, encryption, rotation |\n| pdfplumber | Text extraction with layout, tables |\n| reportlab | Generate PDFs programmatically |\n| pdf2image + pytesseract | OCR scanned documents |\n| qpdf \u002F pdftk (CLI) | Batch ops, no Python needed |\n",{"name":5,"description":7,"allowed-tools":44,"argument-hint":45,"user-invocable":40},"Bash, Read, Write, Edit, Glob","\u003Cfile.pdf | task>","main","2544577cf03a67522466450000731e52c64a5184","skills\u002Fprocessing-pdfs",35,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss","https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcode-abyss","https:\u002F\u002Fgithub.com\u002Ftelagod","2026-07-19 23:15:32",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add telagod\u002Fcode-abyss --skill processing-pdfs",{"tool":60,"command":61},"bunx","bunx skills add telagod\u002Fcode-abyss --skill processing-pdfs",{"tool":63,"command":64},"pnpm","pnpm dlx skills add telagod\u002Fcode-abyss --skill processing-pdfs","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002FSKILL.md",true,[68,74,78,82,86,92,96,100,104,108,112,116],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"FORMS.md","REFERENCE","参考文档",9438,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002FFORMS.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"REFERENCE.md",16692,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002FREFERENCE.md",{"path":79,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":80,"sourceHtmlUrl":81},"references\u002Fadvanced.md",1147,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Freferences\u002Fadvanced.md",{"path":83,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Frecipes.md",3423,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Freferences\u002Frecipes.md",{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"scripts\u002Fcheck_bounding_boxes_test.py","SCRIPT","脚本",8818,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Fscripts\u002Fcheck_bounding_boxes_test.py",{"path":93,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":94,"sourceHtmlUrl":95},"scripts\u002Fcheck_bounding_boxes.py",3139,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Fscripts\u002Fcheck_bounding_boxes.py",{"path":97,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":98,"sourceHtmlUrl":99},"scripts\u002Fcheck_fillable_fields.py",362,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Fscripts\u002Fcheck_fillable_fields.py",{"path":101,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":102,"sourceHtmlUrl":103},"scripts\u002Fconvert_pdf_to_images.py",1123,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Fscripts\u002Fconvert_pdf_to_images.py",{"path":105,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":106,"sourceHtmlUrl":107},"scripts\u002Fcreate_validation_image.py",1603,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Fscripts\u002Fcreate_validation_image.py",{"path":109,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":110,"sourceHtmlUrl":111},"scripts\u002Fextract_form_field_info.py",6127,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Fscripts\u002Fextract_form_field_info.py",{"path":113,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":114,"sourceHtmlUrl":115},"scripts\u002Ffill_fillable_fields.py",4863,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Fscripts\u002Ffill_fillable_fields.py",{"path":117,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":118,"sourceHtmlUrl":119},"scripts\u002Ffill_pdf_form_with_annotations.py",3596,"https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Fskills\u002Fprocessing-pdfs\u002Fscripts\u002Ffill_pdf_form_with_annotations.py",[121,128,136,143,153,165],{"skillNo":122,"name":123,"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":124,"categories":125,"keywords":126,"publishedAt":39},"01M6CF94Y2R0JYCS270NC9BKM5","parse-error","https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fskill-contract\u002Fparse-error\u002Ftools\u002Fparse-error\u002FSKILL.md",[],[127],"parse error",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":39},"01M6CF925B128W5YAHWVYSJQTG","multi-script","too many scripts","https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fskill-contract\u002Fmulti-script\u002Ftools\u002Fmulti-script\u002FSKILL.md",[],[135],"multi script",{"skillNo":137,"name":138,"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":139,"categories":140,"keywords":141,"publishedAt":39},"01M6CF8ZYT3KZ4ZZAATFJH0DV4","missing-description","https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fskill-contract\u002Fmissing-description\u002Ftools\u002Fmissing-description\u002FSKILL.md",[],[142],"missing description",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":39},"01M6CF8XB2Z8NAPYW3W7S7KW1S","invalid-tools","invalid tool name","https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fskill-contract\u002Finvalid-tools\u002Ftools\u002Finvalid-tools\u002FSKILL.md",[],[150,151,30,152],"Tools","invalid tools","tool",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":162,"publishedAt":39},"01M6CF8TTPYFV83HSF057F95QM","clash-skill","first duplicate","https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fskill-contract\u002Fduplicate\u002Ftools\u002Falpha\u002FSKILL.md",[159],{"categoryNo":160,"categoryName":161,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[163,164],"clash skill","first",{"skillNo":166,"name":155,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":171,"publishedAt":39},"01M6CF8RAHFEPXNB6SWBR2T49M","second duplicate","https:\u002F\u002Fgithub.com\u002Ftelagod\u002Fcode-abyss\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fskill-contract\u002Fduplicate\u002Fdomains\u002Falpha\u002FSKILL.md",[170],{"categoryNo":160,"categoryName":161,"taxonomyType":20,"taxonomyTypeDesc":21},[163]]