[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-shareAI-lab-learn-claude-code-skills-pdf":3},{"error":4,"detail":5,"metadata":24,"markdownContent":25,"rawMarkdown":21},false,{"repo_full_name":6,"owner":7,"repo_name":8,"repo_forks":9,"skill_path":10,"repo_stars":11,"name":12,"category_id":13,"description":14,"file_tree":15,"skill_md_content":21,"skill_id":22,"skill_key":23},"shareAI-lab/learn-claude-code","shareAI-lab","learn-claude-code",5371,"skills/pdf",32595,"pdf",1,"Process PDF files - extract text, create PDFs, merge documents. Use when user asks to read PDF, create PDF, or work with PDF files.",[16],{"name":17,"path":18,"size":19,"type":20},"SKILL.md","skills/pdf/SKILL.md",2581,"file","---\nname: pdf\ndescription: Process PDF files - extract text, create PDFs, merge documents. Use when user asks to read PDF, create PDF, or work with PDF files.\n---\n\n# PDF Processing Skill\n\nYou now have expertise in PDF manipulation. Follow these workflows:\n\n## Reading PDFs\n\n**Option 1: Quick text extraction (preferred)**\n```bash\n# Using pdftotext (poppler-utils)\npdftotext input.pdf -  # Output to stdout\npdftotext input.pdf output.txt  # Output to file\n\n# If pdftotext not available, try:\npython3 -c \"\nimport fitz  # PyMuPDF\ndoc = fitz.open('input.pdf')\nfor page in doc:\n    print(page.get_text())\n\"\n```\n\n**Option 2: Page-by-page with metadata**\n```python\nimport fitz  # pip install pymupdf\n\ndoc = fitz.open(\"input.pdf\")\nprint(f\"Pages: {len(doc)}\")\nprint(f\"Metadata: {doc.metadata}\")\n\nfor i, page in enumerate(doc):\n    text = page.get_text()\n    print(f\"--- Page {i+1} ---\")\n    print(text)\n```\n\n## Creating PDFs\n\n**Option 1: From Markdown (recommended)**\n```bash\n# Using pandoc\npandoc input.md -o output.pdf\n\n# With custom styling\npandoc input.md -o output.pdf --pdf-engine=xelatex -V geometry:margin=1in\n```\n\n**Option 2: Programmatically**\n```python\nfrom reportlab.lib.pagesizes import letter\nfrom reportlab.pdfgen import canvas\n\nc = canvas.Canvas(\"output.pdf\", pagesize=letter)\nc.drawString(100, 750, \"Hello, PDF!\")\nc.save()\n```\n\n**Option 3: From HTML**\n```bash\n# Using wkhtmltopdf\nwkhtmltopdf input.html output.pdf\n\n# Or with Python\npython3 -c \"\nimport pdfkit\npdfkit.from_file('input.html', 'output.pdf')\n\"\n```\n\n## Merging PDFs\n\n```python\nimport fitz\n\nresult = fitz.open()\nfor pdf_path in [\"file1.pdf\", \"file2.pdf\", \"file3.pdf\"]:\n    doc = fitz.open(pdf_path)\n    result.insert_pdf(doc)\nresult.save(\"merged.pdf\")\n```\n\n## Splitting PDFs\n\n```python\nimport fitz\n\ndoc = fitz.open(\"input.pdf\")\nfor i in range(len(doc)):\n    single = fitz.open()\n    single.insert_pdf(doc, from_page=i, to_page=i)\n    single.save(f\"page_{i+1}.pdf\")\n```\n\n## Key Libraries\n\n| Task | Library | Install |\n|------|---------|---------|\n| Read/Write/Merge | PyMuPDF | `pip install pymupdf` |\n| Create from scratch | ReportLab | `pip install reportlab` |\n| HTML to PDF | pdfkit | `pip install pdfkit` + wkhtmltopdf |\n| Text extraction | pdftotext | `brew install poppler` / `apt install poppler-utils` |\n\n## Best Practices\n\n1. **Always check if tools are installed** before using them\n2. **Handle encoding issues** - PDFs may contain various character encodings\n3. **Large PDFs**: Process page by page to avoid memory issues\n4. **OCR for scanned PDFs**: Use `pytesseract` if text extraction returns empty\n","46da186a-cc5c-57f8-a7a0-0412c72f9117","shareAI-lab-learn-claude-code-skills-pdf",{"name":12,"description":14},"\u003Ch1>PDF Processing Skill\u003C/h1>\n\u003Cp>You now have expertise in PDF manipulation. Follow these workflows:\u003C/p>\n\u003Ch2>Reading PDFs\u003C/h2>\n\u003Cp>\u003Cstrong>Option 1: Quick text extraction (preferred)\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Using pdftotext (poppler-utils)\u003C/span>\npdftotext input.pdf -  \u003Cspan class=\"hljs-comment\"># Output to stdout\u003C/span>\npdftotext input.pdf output.txt  \u003Cspan class=\"hljs-comment\"># Output to file\u003C/span>\n\n\u003Cspan class=\"hljs-comment\"># If pdftotext not available, try:\u003C/span>\npython3 -c \u003Cspan class=\"hljs-string\">&quot;\nimport fitz  # PyMuPDF\ndoc = fitz.open(&#x27;input.pdf&#x27;)\nfor page in doc:\n    print(page.get_text())\n&quot;\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003Cp>\u003Cstrong>Option 2: Page-by-page with metadata\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">python\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-keyword\">import\u003C/span> fitz  \u003Cspan class=\"hljs-comment\"># pip install pymupdf\u003C/span>\n\ndoc = fitz.\u003Cspan class=\"hljs-built_in\">open\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;input.pdf&quot;\u003C/span>)\n\u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Pages: \u003Cspan class=\"hljs-subst\">{\u003Cspan class=\"hljs-built_in\">len\u003C/span>(doc)}\u003C/span>&quot;\u003C/span>)\n\u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;Metadata: \u003Cspan class=\"hljs-subst\">{doc.metadata}\u003C/span>&quot;\u003C/span>)\n\n\u003Cspan class=\"hljs-keyword\">for\u003C/span> i, page \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">enumerate\u003C/span>(doc):\n    text = page.get_text()\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(\u003Cspan class=\"hljs-string\">f&quot;--- Page \u003Cspan class=\"hljs-subst\">{i+\u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span> ---&quot;\u003C/span>)\n    \u003Cspan class=\"hljs-built_in\">print\u003C/span>(text)\u003C/code>\u003C/pre>\u003C/div>\u003Ch2>Creating PDFs\u003C/h2>\n\u003Cp>\u003Cstrong>Option 1: From Markdown (recommended)\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Using pandoc\u003C/span>\npandoc input.md -o output.pdf\n\n\u003Cspan class=\"hljs-comment\"># With custom styling\u003C/span>\npandoc input.md -o output.pdf --pdf-engine=xelatex -V geometry:margin=1in\u003C/code>\u003C/pre>\u003C/div>\u003Cp>\u003Cstrong>Option 2: Programmatically\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">python\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-keyword\">from\u003C/span> reportlab.lib.pagesizes \u003Cspan class=\"hljs-keyword\">import\u003C/span> letter\n\u003Cspan class=\"hljs-keyword\">from\u003C/span> reportlab.pdfgen \u003Cspan class=\"hljs-keyword\">import\u003C/span> canvas\n\nc = canvas.Canvas(\u003Cspan class=\"hljs-string\">&quot;output.pdf&quot;\u003C/span>, pagesize=letter)\nc.drawString(\u003Cspan class=\"hljs-number\">100\u003C/span>, \u003Cspan class=\"hljs-number\">750\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;Hello, PDF!&quot;\u003C/span>)\nc.save()\u003C/code>\u003C/pre>\u003C/div>\u003Cp>\u003Cstrong>Option 3: From HTML\u003C/strong>\u003C/p>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">bash\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-comment\"># Using wkhtmltopdf\u003C/span>\nwkhtmltopdf input.html output.pdf\n\n\u003Cspan class=\"hljs-comment\"># Or with Python\u003C/span>\npython3 -c \u003Cspan class=\"hljs-string\">&quot;\nimport pdfkit\npdfkit.from_file(&#x27;input.html&#x27;, &#x27;output.pdf&#x27;)\n&quot;\u003C/span>\u003C/code>\u003C/pre>\u003C/div>\u003Ch2>Merging PDFs\u003C/h2>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">python\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-keyword\">import\u003C/span> fitz\n\nresult = fitz.\u003Cspan class=\"hljs-built_in\">open\u003C/span>()\n\u003Cspan class=\"hljs-keyword\">for\u003C/span> pdf_path \u003Cspan class=\"hljs-keyword\">in\u003C/span> [\u003Cspan class=\"hljs-string\">&quot;file1.pdf&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;file2.pdf&quot;\u003C/span>, \u003Cspan class=\"hljs-string\">&quot;file3.pdf&quot;\u003C/span>]:\n    doc = fitz.\u003Cspan class=\"hljs-built_in\">open\u003C/span>(pdf_path)\n    result.insert_pdf(doc)\nresult.save(\u003Cspan class=\"hljs-string\">&quot;merged.pdf&quot;\u003C/span>)\u003C/code>\u003C/pre>\u003C/div>\u003Ch2>Splitting PDFs\u003C/h2>\n\u003Cdiv class=\"md-code-block\">\u003Cdiv class=\"md-code-lang\">python\u003C/div>\u003Cpre>\u003Ccode class=\"hljs language-python\">\u003Cspan class=\"hljs-keyword\">import\u003C/span> fitz\n\ndoc = fitz.\u003Cspan class=\"hljs-built_in\">open\u003C/span>(\u003Cspan class=\"hljs-string\">&quot;input.pdf&quot;\u003C/span>)\n\u003Cspan class=\"hljs-keyword\">for\u003C/span> i \u003Cspan class=\"hljs-keyword\">in\u003C/span> \u003Cspan class=\"hljs-built_in\">range\u003C/span>(\u003Cspan class=\"hljs-built_in\">len\u003C/span>(doc)):\n    single = fitz.\u003Cspan class=\"hljs-built_in\">open\u003C/span>()\n    single.insert_pdf(doc, from_page=i, to_page=i)\n    single.save(\u003Cspan class=\"hljs-string\">f&quot;page_\u003Cspan class=\"hljs-subst\">{i+\u003Cspan class=\"hljs-number\">1\u003C/span>}\u003C/span>.pdf&quot;\u003C/span>)\u003C/code>\u003C/pre>\u003C/div>\u003Ch2>Key Libraries\u003C/h2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Task\u003C/th>\n\u003Cth>Library\u003C/th>\n\u003Cth>Install\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Read/Write/Merge\u003C/td>\n\u003Ctd>PyMuPDF\u003C/td>\n\u003Ctd>\u003Ccode>pip install pymupdf\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Create from scratch\u003C/td>\n\u003Ctd>ReportLab\u003C/td>\n\u003Ctd>\u003Ccode>pip install reportlab\u003C/code>\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>HTML to PDF\u003C/td>\n\u003Ctd>pdfkit\u003C/td>\n\u003Ctd>\u003Ccode>pip install pdfkit\u003C/code> + wkhtmltopdf\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Text extraction\u003C/td>\n\u003Ctd>pdftotext\u003C/td>\n\u003Ctd>\u003Ccode>brew install poppler\u003C/code> / \u003Ccode>apt install poppler-utils\u003C/code>\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch2>Best Practices\u003C/h2>\n\u003Col>\n\u003Cli>\u003Cstrong>Always check if tools are installed\u003C/strong> before using them\u003C/li>\n\u003Cli>\u003Cstrong>Handle encoding issues\u003C/strong> - PDFs may contain various character encodings\u003C/li>\n\u003Cli>\u003Cstrong>Large PDFs\u003C/strong>: Process page by page to avoid memory issues\u003C/li>\n\u003Cli>\u003Cstrong>OCR for scanned PDFs\u003C/strong>: Use \u003Ccode>pytesseract\u003C/code> if text extraction returns empty\u003C/li>\n\u003C/ol>\n"]