[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-anthropic-pdf":3,"mdc-rqerek-key":31,"related-org-anthropic-pdf":2329,"related-repo-anthropic-pdf":2509},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":19,"repoUrl":20,"updatedAt":21,"license":22,"forks":23,"topics":24,"repo":26,"sourceUrl":29,"mdContent":30},"pdf","read edit and manipulate PDF files","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"anthropic","Anthropic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fanthropic.png","anthropics",[13,16],{"name":14,"slug":4,"type":15},"PDF","tag",{"name":17,"slug":18,"type":15},"Documents","documents",161831,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills","2026-04-06T17:56:02.483316","Proprietary. LICENSE.txt has complete terms",19131,[25],"agent-skills",{"repoUrl":20,"stars":19,"forks":23,"topics":27,"description":28},[25],"Public repository for Agent Skills","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fpdf","---\nname: pdf\ndescription: Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.\nlicense: Proprietary. LICENSE.txt has complete terms\n---\n\n# PDF Processing Guide\n\n## Overview\n\nThis guide covers essential PDF processing operations using Python libraries and command-line tools. For advanced features, JavaScript libraries, and detailed examples, see REFERENCE.md. If you need to fill out a PDF form, read FORMS.md and follow its instructions.\n\n## Quick Start\n\n```python\nfrom pypdf import PdfReader, PdfWriter\n\n# Read a PDF\nreader = PdfReader(\"document.pdf\")\nprint(f\"Pages: {len(reader.pages)}\")\n\n# Extract text\ntext = \"\"\nfor page in reader.pages:\n    text += page.extract_text()\n```\n\n## Python Libraries\n\n### pypdf - Basic Operations\n\n#### Merge PDFs\n```python\nfrom pypdf import PdfWriter, PdfReader\n\nwriter = PdfWriter()\nfor pdf_file in [\"doc1.pdf\", \"doc2.pdf\", \"doc3.pdf\"]:\n    reader = PdfReader(pdf_file)\n    for page in reader.pages:\n        writer.add_page(page)\n\nwith open(\"merged.pdf\", \"wb\") as output:\n    writer.write(output)\n```\n\n#### Split PDF\n```python\nreader = PdfReader(\"input.pdf\")\nfor i, page in enumerate(reader.pages):\n    writer = PdfWriter()\n    writer.add_page(page)\n    with open(f\"page_{i+1}.pdf\", \"wb\") as output:\n        writer.write(output)\n```\n\n#### Extract Metadata\n```python\nreader = PdfReader(\"document.pdf\")\nmeta = reader.metadata\nprint(f\"Title: {meta.title}\")\nprint(f\"Author: {meta.author}\")\nprint(f\"Subject: {meta.subject}\")\nprint(f\"Creator: {meta.creator}\")\n```\n\n#### Rotate Pages\n```python\nreader = PdfReader(\"input.pdf\")\nwriter = PdfWriter()\n\npage = reader.pages[0]\npage.rotate(90)  # Rotate 90 degrees clockwise\nwriter.add_page(page)\n\nwith open(\"rotated.pdf\", \"wb\") as output:\n    writer.write(output)\n```\n\n### pdfplumber - Text and Table Extraction\n\n#### Extract Text with Layout\n```python\nimport pdfplumber\n\nwith pdfplumber.open(\"document.pdf\") as pdf:\n    for page in pdf.pages:\n        text = page.extract_text()\n        print(text)\n```\n\n#### Extract Tables\n```python\nwith pdfplumber.open(\"document.pdf\") as pdf:\n    for i, page in enumerate(pdf.pages):\n        tables = page.extract_tables()\n        for j, table in enumerate(tables):\n            print(f\"Table {j+1} on page {i+1}:\")\n            for row in table:\n                print(row)\n```\n\n#### Advanced Table Extraction\n```python\nimport pandas as pd\n\nwith pdfplumber.open(\"document.pdf\") as pdf:\n    all_tables = []\n    for page in pdf.pages:\n        tables = page.extract_tables()\n        for table in tables:\n            if table:  # Check if table is not empty\n                df = pd.DataFrame(table[1:], columns=table[0])\n                all_tables.append(df)\n\n# Combine all tables\nif all_tables:\n    combined_df = pd.concat(all_tables, ignore_index=True)\n    combined_df.to_excel(\"extracted_tables.xlsx\", index=False)\n```\n\n### reportlab - Create PDFs\n\n#### Basic PDF Creation\n```python\nfrom reportlab.lib.pagesizes import letter\nfrom reportlab.pdfgen import canvas\n\nc = canvas.Canvas(\"hello.pdf\", pagesize=letter)\nwidth, height = letter\n\n# Add text\nc.drawString(100, height - 100, \"Hello World!\")\nc.drawString(100, height - 120, \"This is a PDF created with reportlab\")\n\n# Add a line\nc.line(100, height - 140, 400, height - 140)\n\n# Save\nc.save()\n```\n\n#### Create PDF with Multiple Pages\n```python\nfrom reportlab.lib.pagesizes import letter\nfrom reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak\nfrom reportlab.lib.styles import getSampleStyleSheet\n\ndoc = SimpleDocTemplate(\"report.pdf\", pagesize=letter)\nstyles = getSampleStyleSheet()\nstory = []\n\n# Add content\ntitle = Paragraph(\"Report Title\", styles['Title'])\nstory.append(title)\nstory.append(Spacer(1, 12))\n\nbody = Paragraph(\"This is the body of the report. \" * 20, styles['Normal'])\nstory.append(body)\nstory.append(PageBreak())\n\n# Page 2\nstory.append(Paragraph(\"Page 2\", styles['Heading1']))\nstory.append(Paragraph(\"Content for page 2\", styles['Normal']))\n\n# Build PDF\ndoc.build(story)\n```\n\n#### Subscripts and Superscripts\n\n**IMPORTANT**: Never use Unicode subscript\u002Fsuperscript characters (₀₁₂₃₄₅₆₇₈₉, ⁰¹²³⁴⁵⁶⁷⁸⁹) in ReportLab PDFs. The built-in fonts do not include these glyphs, causing them to render as solid black boxes.\n\nInstead, use ReportLab's XML markup tags in Paragraph objects:\n```python\nfrom reportlab.platypus import Paragraph\nfrom reportlab.lib.styles import getSampleStyleSheet\n\nstyles = getSampleStyleSheet()\n\n# Subscripts: use \u003Csub> tag\nchemical = Paragraph(\"H\u003Csub>2\u003C\u002Fsub>O\", styles['Normal'])\n\n# Superscripts: use \u003Csuper> tag\nsquared = Paragraph(\"x\u003Csuper>2\u003C\u002Fsuper> + y\u003Csuper>2\u003C\u002Fsuper>\", styles['Normal'])\n```\n\nFor canvas-drawn text (not Paragraph objects), manually adjust font the size and position rather than using Unicode subscripts\u002Fsuperscripts.\n\n## Command-Line Tools\n\n### pdftotext (poppler-utils)\n```bash\n# Extract text\npdftotext input.pdf output.txt\n\n# Extract text preserving layout\npdftotext -layout input.pdf output.txt\n\n# Extract specific pages\npdftotext -f 1 -l 5 input.pdf output.txt  # Pages 1-5\n```\n\n### qpdf\n```bash\n# Merge PDFs\nqpdf --empty --pages file1.pdf file2.pdf -- merged.pdf\n\n# Split pages\nqpdf input.pdf --pages . 1-5 -- pages1-5.pdf\nqpdf input.pdf --pages . 6-10 -- pages6-10.pdf\n\n# Rotate pages\nqpdf input.pdf output.pdf --rotate=+90:1  # Rotate page 1 by 90 degrees\n\n# Remove password\nqpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf\n```\n\n### pdftk (if available)\n```bash\n# Merge\npdftk file1.pdf file2.pdf cat output merged.pdf\n\n# Split\npdftk input.pdf burst\n\n# Rotate\npdftk input.pdf rotate 1east output rotated.pdf\n```\n\n## Common Tasks\n\n### Extract Text from Scanned PDFs\n```python\n# Requires: pip install pytesseract pdf2image\nimport pytesseract\nfrom pdf2image import convert_from_path\n\n# Convert PDF to images\nimages = convert_from_path('scanned.pdf')\n\n# OCR each page\ntext = \"\"\nfor i, image in enumerate(images):\n    text += f\"Page {i+1}:\\n\"\n    text += pytesseract.image_to_string(image)\n    text += \"\\n\\n\"\n\nprint(text)\n```\n\n### Add Watermark\n```python\nfrom pypdf import PdfReader, PdfWriter\n\n# Create watermark (or load existing)\nwatermark = PdfReader(\"watermark.pdf\").pages[0]\n\n# Apply to all pages\nreader = PdfReader(\"document.pdf\")\nwriter = PdfWriter()\n\nfor page in reader.pages:\n    page.merge_page(watermark)\n    writer.add_page(page)\n\nwith open(\"watermarked.pdf\", \"wb\") as output:\n    writer.write(output)\n```\n\n### Extract Images\n```bash\n# Using pdfimages (poppler-utils)\npdfimages -j input.pdf output_prefix\n\n# This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc.\n```\n\n### Password Protection\n```python\nfrom pypdf import PdfReader, PdfWriter\n\nreader = PdfReader(\"input.pdf\")\nwriter = PdfWriter()\n\nfor page in reader.pages:\n    writer.add_page(page)\n\n# Add password\nwriter.encrypt(\"userpassword\", \"ownerpassword\")\n\nwith open(\"encrypted.pdf\", \"wb\") as output:\n    writer.write(output)\n```\n\n## Quick Reference\n\n| Task | Best Tool | Command\u002FCode |\n|------|-----------|--------------|\n| Merge PDFs | pypdf | `writer.add_page(page)` |\n| Split PDFs | pypdf | One page per file |\n| Extract text | pdfplumber | `page.extract_text()` |\n| Extract tables | pdfplumber | `page.extract_tables()` |\n| Create PDFs | reportlab | Canvas or Platypus |\n| Command line merge | qpdf | `qpdf --empty --pages ...` |\n| OCR scanned PDFs | pytesseract | Convert to image first |\n| Fill PDF forms | pdf-lib or pypdf (see FORMS.md) | See FORMS.md |\n\n## Next Steps\n\n- For advanced pypdfium2 usage, see REFERENCE.md\n- For JavaScript libraries (pdf-lib), see REFERENCE.md\n- If you need to fill out a PDF form, follow the instructions in FORMS.md\n- For troubleshooting guides, see REFERENCE.md\n",{"data":32,"body":33},{"name":4,"description":6,"license":22},{"type":34,"children":35},"root",[36,45,52,58,64,168,174,181,188,273,279,334,340,394,400,474,480,486,540,546,608,614,741,747,753,876,882,1075,1081,1092,1097,1179,1184,1190,1196,1325,1330,1547,1553,1674,1680,1686,1809,1815,1932,1938,1990,1996,2097,2103,2292,2298,2323],{"type":37,"tag":38,"props":39,"children":41},"element","h1",{"id":40},"pdf-processing-guide",[42],{"type":43,"value":44},"text","PDF Processing Guide",{"type":37,"tag":46,"props":47,"children":49},"h2",{"id":48},"overview",[50],{"type":43,"value":51},"Overview",{"type":37,"tag":53,"props":54,"children":55},"p",{},[56],{"type":43,"value":57},"This guide covers essential PDF processing operations using Python libraries and command-line tools. For advanced features, JavaScript libraries, and detailed examples, see REFERENCE.md. If you need to fill out a PDF form, read FORMS.md and follow its instructions.",{"type":37,"tag":46,"props":59,"children":61},{"id":60},"quick-start",[62],{"type":43,"value":63},"Quick Start",{"type":37,"tag":65,"props":66,"children":71},"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from pypdf import PdfReader, PdfWriter\n\n# Read a PDF\nreader = PdfReader(\"document.pdf\")\nprint(f\"Pages: {len(reader.pages)}\")\n\n# Extract text\ntext = \"\"\nfor page in reader.pages:\n    text += page.extract_text()\n","python","",[72],{"type":37,"tag":73,"props":74,"children":75},"code",{"__ignoreMap":70},[76,87,97,106,115,124,132,141,150,159],{"type":37,"tag":77,"props":78,"children":81},"span",{"class":79,"line":80},"line",1,[82],{"type":37,"tag":77,"props":83,"children":84},{},[85],{"type":43,"value":86},"from pypdf import PdfReader, PdfWriter\n",{"type":37,"tag":77,"props":88,"children":90},{"class":79,"line":89},2,[91],{"type":37,"tag":77,"props":92,"children":94},{"emptyLinePlaceholder":93},true,[95],{"type":43,"value":96},"\n",{"type":37,"tag":77,"props":98,"children":100},{"class":79,"line":99},3,[101],{"type":37,"tag":77,"props":102,"children":103},{},[104],{"type":43,"value":105},"# Read a PDF\n",{"type":37,"tag":77,"props":107,"children":109},{"class":79,"line":108},4,[110],{"type":37,"tag":77,"props":111,"children":112},{},[113],{"type":43,"value":114},"reader = PdfReader(\"document.pdf\")\n",{"type":37,"tag":77,"props":116,"children":118},{"class":79,"line":117},5,[119],{"type":37,"tag":77,"props":120,"children":121},{},[122],{"type":43,"value":123},"print(f\"Pages: {len(reader.pages)}\")\n",{"type":37,"tag":77,"props":125,"children":127},{"class":79,"line":126},6,[128],{"type":37,"tag":77,"props":129,"children":130},{"emptyLinePlaceholder":93},[131],{"type":43,"value":96},{"type":37,"tag":77,"props":133,"children":135},{"class":79,"line":134},7,[136],{"type":37,"tag":77,"props":137,"children":138},{},[139],{"type":43,"value":140},"# Extract text\n",{"type":37,"tag":77,"props":142,"children":144},{"class":79,"line":143},8,[145],{"type":37,"tag":77,"props":146,"children":147},{},[148],{"type":43,"value":149},"text = \"\"\n",{"type":37,"tag":77,"props":151,"children":153},{"class":79,"line":152},9,[154],{"type":37,"tag":77,"props":155,"children":156},{},[157],{"type":43,"value":158},"for page in reader.pages:\n",{"type":37,"tag":77,"props":160,"children":162},{"class":79,"line":161},10,[163],{"type":37,"tag":77,"props":164,"children":165},{},[166],{"type":43,"value":167},"    text += page.extract_text()\n",{"type":37,"tag":46,"props":169,"children":171},{"id":170},"python-libraries",[172],{"type":43,"value":173},"Python Libraries",{"type":37,"tag":175,"props":176,"children":178},"h3",{"id":177},"pypdf-basic-operations",[179],{"type":43,"value":180},"pypdf - Basic Operations",{"type":37,"tag":182,"props":183,"children":185},"h4",{"id":184},"merge-pdfs",[186],{"type":43,"value":187},"Merge PDFs",{"type":37,"tag":65,"props":189,"children":191},{"className":67,"code":190,"language":69,"meta":70,"style":70},"from pypdf import PdfWriter, PdfReader\n\nwriter = PdfWriter()\nfor pdf_file in [\"doc1.pdf\", \"doc2.pdf\", \"doc3.pdf\"]:\n    reader = PdfReader(pdf_file)\n    for page in reader.pages:\n        writer.add_page(page)\n\nwith open(\"merged.pdf\", \"wb\") as output:\n    writer.write(output)\n",[192],{"type":37,"tag":73,"props":193,"children":194},{"__ignoreMap":70},[195,203,210,218,226,234,242,250,257,265],{"type":37,"tag":77,"props":196,"children":197},{"class":79,"line":80},[198],{"type":37,"tag":77,"props":199,"children":200},{},[201],{"type":43,"value":202},"from pypdf import PdfWriter, PdfReader\n",{"type":37,"tag":77,"props":204,"children":205},{"class":79,"line":89},[206],{"type":37,"tag":77,"props":207,"children":208},{"emptyLinePlaceholder":93},[209],{"type":43,"value":96},{"type":37,"tag":77,"props":211,"children":212},{"class":79,"line":99},[213],{"type":37,"tag":77,"props":214,"children":215},{},[216],{"type":43,"value":217},"writer = PdfWriter()\n",{"type":37,"tag":77,"props":219,"children":220},{"class":79,"line":108},[221],{"type":37,"tag":77,"props":222,"children":223},{},[224],{"type":43,"value":225},"for pdf_file in [\"doc1.pdf\", \"doc2.pdf\", \"doc3.pdf\"]:\n",{"type":37,"tag":77,"props":227,"children":228},{"class":79,"line":117},[229],{"type":37,"tag":77,"props":230,"children":231},{},[232],{"type":43,"value":233},"    reader = PdfReader(pdf_file)\n",{"type":37,"tag":77,"props":235,"children":236},{"class":79,"line":126},[237],{"type":37,"tag":77,"props":238,"children":239},{},[240],{"type":43,"value":241},"    for page in reader.pages:\n",{"type":37,"tag":77,"props":243,"children":244},{"class":79,"line":134},[245],{"type":37,"tag":77,"props":246,"children":247},{},[248],{"type":43,"value":249},"        writer.add_page(page)\n",{"type":37,"tag":77,"props":251,"children":252},{"class":79,"line":143},[253],{"type":37,"tag":77,"props":254,"children":255},{"emptyLinePlaceholder":93},[256],{"type":43,"value":96},{"type":37,"tag":77,"props":258,"children":259},{"class":79,"line":152},[260],{"type":37,"tag":77,"props":261,"children":262},{},[263],{"type":43,"value":264},"with open(\"merged.pdf\", \"wb\") as output:\n",{"type":37,"tag":77,"props":266,"children":267},{"class":79,"line":161},[268],{"type":37,"tag":77,"props":269,"children":270},{},[271],{"type":43,"value":272},"    writer.write(output)\n",{"type":37,"tag":182,"props":274,"children":276},{"id":275},"split-pdf",[277],{"type":43,"value":278},"Split PDF",{"type":37,"tag":65,"props":280,"children":282},{"className":67,"code":281,"language":69,"meta":70,"style":70},"reader = PdfReader(\"input.pdf\")\nfor i, page in enumerate(reader.pages):\n    writer = PdfWriter()\n    writer.add_page(page)\n    with open(f\"page_{i+1}.pdf\", \"wb\") as output:\n        writer.write(output)\n",[283],{"type":37,"tag":73,"props":284,"children":285},{"__ignoreMap":70},[286,294,302,310,318,326],{"type":37,"tag":77,"props":287,"children":288},{"class":79,"line":80},[289],{"type":37,"tag":77,"props":290,"children":291},{},[292],{"type":43,"value":293},"reader = PdfReader(\"input.pdf\")\n",{"type":37,"tag":77,"props":295,"children":296},{"class":79,"line":89},[297],{"type":37,"tag":77,"props":298,"children":299},{},[300],{"type":43,"value":301},"for i, page in enumerate(reader.pages):\n",{"type":37,"tag":77,"props":303,"children":304},{"class":79,"line":99},[305],{"type":37,"tag":77,"props":306,"children":307},{},[308],{"type":43,"value":309},"    writer = PdfWriter()\n",{"type":37,"tag":77,"props":311,"children":312},{"class":79,"line":108},[313],{"type":37,"tag":77,"props":314,"children":315},{},[316],{"type":43,"value":317},"    writer.add_page(page)\n",{"type":37,"tag":77,"props":319,"children":320},{"class":79,"line":117},[321],{"type":37,"tag":77,"props":322,"children":323},{},[324],{"type":43,"value":325},"    with open(f\"page_{i+1}.pdf\", \"wb\") as output:\n",{"type":37,"tag":77,"props":327,"children":328},{"class":79,"line":126},[329],{"type":37,"tag":77,"props":330,"children":331},{},[332],{"type":43,"value":333},"        writer.write(output)\n",{"type":37,"tag":182,"props":335,"children":337},{"id":336},"extract-metadata",[338],{"type":43,"value":339},"Extract Metadata",{"type":37,"tag":65,"props":341,"children":343},{"className":67,"code":342,"language":69,"meta":70,"style":70},"reader = PdfReader(\"document.pdf\")\nmeta = reader.metadata\nprint(f\"Title: {meta.title}\")\nprint(f\"Author: {meta.author}\")\nprint(f\"Subject: {meta.subject}\")\nprint(f\"Creator: {meta.creator}\")\n",[344],{"type":37,"tag":73,"props":345,"children":346},{"__ignoreMap":70},[347,354,362,370,378,386],{"type":37,"tag":77,"props":348,"children":349},{"class":79,"line":80},[350],{"type":37,"tag":77,"props":351,"children":352},{},[353],{"type":43,"value":114},{"type":37,"tag":77,"props":355,"children":356},{"class":79,"line":89},[357],{"type":37,"tag":77,"props":358,"children":359},{},[360],{"type":43,"value":361},"meta = reader.metadata\n",{"type":37,"tag":77,"props":363,"children":364},{"class":79,"line":99},[365],{"type":37,"tag":77,"props":366,"children":367},{},[368],{"type":43,"value":369},"print(f\"Title: {meta.title}\")\n",{"type":37,"tag":77,"props":371,"children":372},{"class":79,"line":108},[373],{"type":37,"tag":77,"props":374,"children":375},{},[376],{"type":43,"value":377},"print(f\"Author: {meta.author}\")\n",{"type":37,"tag":77,"props":379,"children":380},{"class":79,"line":117},[381],{"type":37,"tag":77,"props":382,"children":383},{},[384],{"type":43,"value":385},"print(f\"Subject: {meta.subject}\")\n",{"type":37,"tag":77,"props":387,"children":388},{"class":79,"line":126},[389],{"type":37,"tag":77,"props":390,"children":391},{},[392],{"type":43,"value":393},"print(f\"Creator: {meta.creator}\")\n",{"type":37,"tag":182,"props":395,"children":397},{"id":396},"rotate-pages",[398],{"type":43,"value":399},"Rotate Pages",{"type":37,"tag":65,"props":401,"children":403},{"className":67,"code":402,"language":69,"meta":70,"style":70},"reader = PdfReader(\"input.pdf\")\nwriter = PdfWriter()\n\npage = reader.pages[0]\npage.rotate(90)  # Rotate 90 degrees clockwise\nwriter.add_page(page)\n\nwith open(\"rotated.pdf\", \"wb\") as output:\n    writer.write(output)\n",[404],{"type":37,"tag":73,"props":405,"children":406},{"__ignoreMap":70},[407,414,421,428,436,444,452,459,467],{"type":37,"tag":77,"props":408,"children":409},{"class":79,"line":80},[410],{"type":37,"tag":77,"props":411,"children":412},{},[413],{"type":43,"value":293},{"type":37,"tag":77,"props":415,"children":416},{"class":79,"line":89},[417],{"type":37,"tag":77,"props":418,"children":419},{},[420],{"type":43,"value":217},{"type":37,"tag":77,"props":422,"children":423},{"class":79,"line":99},[424],{"type":37,"tag":77,"props":425,"children":426},{"emptyLinePlaceholder":93},[427],{"type":43,"value":96},{"type":37,"tag":77,"props":429,"children":430},{"class":79,"line":108},[431],{"type":37,"tag":77,"props":432,"children":433},{},[434],{"type":43,"value":435},"page = reader.pages[0]\n",{"type":37,"tag":77,"props":437,"children":438},{"class":79,"line":117},[439],{"type":37,"tag":77,"props":440,"children":441},{},[442],{"type":43,"value":443},"page.rotate(90)  # Rotate 90 degrees clockwise\n",{"type":37,"tag":77,"props":445,"children":446},{"class":79,"line":126},[447],{"type":37,"tag":77,"props":448,"children":449},{},[450],{"type":43,"value":451},"writer.add_page(page)\n",{"type":37,"tag":77,"props":453,"children":454},{"class":79,"line":134},[455],{"type":37,"tag":77,"props":456,"children":457},{"emptyLinePlaceholder":93},[458],{"type":43,"value":96},{"type":37,"tag":77,"props":460,"children":461},{"class":79,"line":143},[462],{"type":37,"tag":77,"props":463,"children":464},{},[465],{"type":43,"value":466},"with open(\"rotated.pdf\", \"wb\") as output:\n",{"type":37,"tag":77,"props":468,"children":469},{"class":79,"line":152},[470],{"type":37,"tag":77,"props":471,"children":472},{},[473],{"type":43,"value":272},{"type":37,"tag":175,"props":475,"children":477},{"id":476},"pdfplumber-text-and-table-extraction",[478],{"type":43,"value":479},"pdfplumber - Text and Table Extraction",{"type":37,"tag":182,"props":481,"children":483},{"id":482},"extract-text-with-layout",[484],{"type":43,"value":485},"Extract Text with Layout",{"type":37,"tag":65,"props":487,"children":489},{"className":67,"code":488,"language":69,"meta":70,"style":70},"import pdfplumber\n\nwith pdfplumber.open(\"document.pdf\") as pdf:\n    for page in pdf.pages:\n        text = page.extract_text()\n        print(text)\n",[490],{"type":37,"tag":73,"props":491,"children":492},{"__ignoreMap":70},[493,501,508,516,524,532],{"type":37,"tag":77,"props":494,"children":495},{"class":79,"line":80},[496],{"type":37,"tag":77,"props":497,"children":498},{},[499],{"type":43,"value":500},"import pdfplumber\n",{"type":37,"tag":77,"props":502,"children":503},{"class":79,"line":89},[504],{"type":37,"tag":77,"props":505,"children":506},{"emptyLinePlaceholder":93},[507],{"type":43,"value":96},{"type":37,"tag":77,"props":509,"children":510},{"class":79,"line":99},[511],{"type":37,"tag":77,"props":512,"children":513},{},[514],{"type":43,"value":515},"with pdfplumber.open(\"document.pdf\") as pdf:\n",{"type":37,"tag":77,"props":517,"children":518},{"class":79,"line":108},[519],{"type":37,"tag":77,"props":520,"children":521},{},[522],{"type":43,"value":523},"    for page in pdf.pages:\n",{"type":37,"tag":77,"props":525,"children":526},{"class":79,"line":117},[527],{"type":37,"tag":77,"props":528,"children":529},{},[530],{"type":43,"value":531},"        text = page.extract_text()\n",{"type":37,"tag":77,"props":533,"children":534},{"class":79,"line":126},[535],{"type":37,"tag":77,"props":536,"children":537},{},[538],{"type":43,"value":539},"        print(text)\n",{"type":37,"tag":182,"props":541,"children":543},{"id":542},"extract-tables",[544],{"type":43,"value":545},"Extract Tables",{"type":37,"tag":65,"props":547,"children":549},{"className":67,"code":548,"language":69,"meta":70,"style":70},"with pdfplumber.open(\"document.pdf\") as pdf:\n    for i, page in enumerate(pdf.pages):\n        tables = page.extract_tables()\n        for j, table in enumerate(tables):\n            print(f\"Table {j+1} on page {i+1}:\")\n            for row in table:\n                print(row)\n",[550],{"type":37,"tag":73,"props":551,"children":552},{"__ignoreMap":70},[553,560,568,576,584,592,600],{"type":37,"tag":77,"props":554,"children":555},{"class":79,"line":80},[556],{"type":37,"tag":77,"props":557,"children":558},{},[559],{"type":43,"value":515},{"type":37,"tag":77,"props":561,"children":562},{"class":79,"line":89},[563],{"type":37,"tag":77,"props":564,"children":565},{},[566],{"type":43,"value":567},"    for i, page in enumerate(pdf.pages):\n",{"type":37,"tag":77,"props":569,"children":570},{"class":79,"line":99},[571],{"type":37,"tag":77,"props":572,"children":573},{},[574],{"type":43,"value":575},"        tables = page.extract_tables()\n",{"type":37,"tag":77,"props":577,"children":578},{"class":79,"line":108},[579],{"type":37,"tag":77,"props":580,"children":581},{},[582],{"type":43,"value":583},"        for j, table in enumerate(tables):\n",{"type":37,"tag":77,"props":585,"children":586},{"class":79,"line":117},[587],{"type":37,"tag":77,"props":588,"children":589},{},[590],{"type":43,"value":591},"            print(f\"Table {j+1} on page {i+1}:\")\n",{"type":37,"tag":77,"props":593,"children":594},{"class":79,"line":126},[595],{"type":37,"tag":77,"props":596,"children":597},{},[598],{"type":43,"value":599},"            for row in table:\n",{"type":37,"tag":77,"props":601,"children":602},{"class":79,"line":134},[603],{"type":37,"tag":77,"props":604,"children":605},{},[606],{"type":43,"value":607},"                print(row)\n",{"type":37,"tag":182,"props":609,"children":611},{"id":610},"advanced-table-extraction",[612],{"type":43,"value":613},"Advanced Table Extraction",{"type":37,"tag":65,"props":615,"children":617},{"className":67,"code":616,"language":69,"meta":70,"style":70},"import pandas as pd\n\nwith pdfplumber.open(\"document.pdf\") as pdf:\n    all_tables = []\n    for page in pdf.pages:\n        tables = page.extract_tables()\n        for table in tables:\n            if table:  # Check if table is not empty\n                df = pd.DataFrame(table[1:], columns=table[0])\n                all_tables.append(df)\n\n# Combine all tables\nif all_tables:\n    combined_df = pd.concat(all_tables, ignore_index=True)\n    combined_df.to_excel(\"extracted_tables.xlsx\", index=False)\n",[618],{"type":37,"tag":73,"props":619,"children":620},{"__ignoreMap":70},[621,629,636,643,651,658,665,673,681,689,697,705,714,723,732],{"type":37,"tag":77,"props":622,"children":623},{"class":79,"line":80},[624],{"type":37,"tag":77,"props":625,"children":626},{},[627],{"type":43,"value":628},"import pandas as pd\n",{"type":37,"tag":77,"props":630,"children":631},{"class":79,"line":89},[632],{"type":37,"tag":77,"props":633,"children":634},{"emptyLinePlaceholder":93},[635],{"type":43,"value":96},{"type":37,"tag":77,"props":637,"children":638},{"class":79,"line":99},[639],{"type":37,"tag":77,"props":640,"children":641},{},[642],{"type":43,"value":515},{"type":37,"tag":77,"props":644,"children":645},{"class":79,"line":108},[646],{"type":37,"tag":77,"props":647,"children":648},{},[649],{"type":43,"value":650},"    all_tables = []\n",{"type":37,"tag":77,"props":652,"children":653},{"class":79,"line":117},[654],{"type":37,"tag":77,"props":655,"children":656},{},[657],{"type":43,"value":523},{"type":37,"tag":77,"props":659,"children":660},{"class":79,"line":126},[661],{"type":37,"tag":77,"props":662,"children":663},{},[664],{"type":43,"value":575},{"type":37,"tag":77,"props":666,"children":667},{"class":79,"line":134},[668],{"type":37,"tag":77,"props":669,"children":670},{},[671],{"type":43,"value":672},"        for table in tables:\n",{"type":37,"tag":77,"props":674,"children":675},{"class":79,"line":143},[676],{"type":37,"tag":77,"props":677,"children":678},{},[679],{"type":43,"value":680},"            if table:  # Check if table is not empty\n",{"type":37,"tag":77,"props":682,"children":683},{"class":79,"line":152},[684],{"type":37,"tag":77,"props":685,"children":686},{},[687],{"type":43,"value":688},"                df = pd.DataFrame(table[1:], columns=table[0])\n",{"type":37,"tag":77,"props":690,"children":691},{"class":79,"line":161},[692],{"type":37,"tag":77,"props":693,"children":694},{},[695],{"type":43,"value":696},"                all_tables.append(df)\n",{"type":37,"tag":77,"props":698,"children":700},{"class":79,"line":699},11,[701],{"type":37,"tag":77,"props":702,"children":703},{"emptyLinePlaceholder":93},[704],{"type":43,"value":96},{"type":37,"tag":77,"props":706,"children":708},{"class":79,"line":707},12,[709],{"type":37,"tag":77,"props":710,"children":711},{},[712],{"type":43,"value":713},"# Combine all tables\n",{"type":37,"tag":77,"props":715,"children":717},{"class":79,"line":716},13,[718],{"type":37,"tag":77,"props":719,"children":720},{},[721],{"type":43,"value":722},"if all_tables:\n",{"type":37,"tag":77,"props":724,"children":726},{"class":79,"line":725},14,[727],{"type":37,"tag":77,"props":728,"children":729},{},[730],{"type":43,"value":731},"    combined_df = pd.concat(all_tables, ignore_index=True)\n",{"type":37,"tag":77,"props":733,"children":735},{"class":79,"line":734},15,[736],{"type":37,"tag":77,"props":737,"children":738},{},[739],{"type":43,"value":740},"    combined_df.to_excel(\"extracted_tables.xlsx\", index=False)\n",{"type":37,"tag":175,"props":742,"children":744},{"id":743},"reportlab-create-pdfs",[745],{"type":43,"value":746},"reportlab - Create PDFs",{"type":37,"tag":182,"props":748,"children":750},{"id":749},"basic-pdf-creation",[751],{"type":43,"value":752},"Basic PDF Creation",{"type":37,"tag":65,"props":754,"children":756},{"className":67,"code":755,"language":69,"meta":70,"style":70},"from reportlab.lib.pagesizes import letter\nfrom reportlab.pdfgen import canvas\n\nc = canvas.Canvas(\"hello.pdf\", pagesize=letter)\nwidth, height = letter\n\n# Add text\nc.drawString(100, height - 100, \"Hello World!\")\nc.drawString(100, height - 120, \"This is a PDF created with reportlab\")\n\n# Add a line\nc.line(100, height - 140, 400, height - 140)\n\n# Save\nc.save()\n",[757],{"type":37,"tag":73,"props":758,"children":759},{"__ignoreMap":70},[760,768,776,783,791,799,806,814,822,830,837,845,853,860,868],{"type":37,"tag":77,"props":761,"children":762},{"class":79,"line":80},[763],{"type":37,"tag":77,"props":764,"children":765},{},[766],{"type":43,"value":767},"from reportlab.lib.pagesizes import letter\n",{"type":37,"tag":77,"props":769,"children":770},{"class":79,"line":89},[771],{"type":37,"tag":77,"props":772,"children":773},{},[774],{"type":43,"value":775},"from reportlab.pdfgen import canvas\n",{"type":37,"tag":77,"props":777,"children":778},{"class":79,"line":99},[779],{"type":37,"tag":77,"props":780,"children":781},{"emptyLinePlaceholder":93},[782],{"type":43,"value":96},{"type":37,"tag":77,"props":784,"children":785},{"class":79,"line":108},[786],{"type":37,"tag":77,"props":787,"children":788},{},[789],{"type":43,"value":790},"c = canvas.Canvas(\"hello.pdf\", pagesize=letter)\n",{"type":37,"tag":77,"props":792,"children":793},{"class":79,"line":117},[794],{"type":37,"tag":77,"props":795,"children":796},{},[797],{"type":43,"value":798},"width, height = letter\n",{"type":37,"tag":77,"props":800,"children":801},{"class":79,"line":126},[802],{"type":37,"tag":77,"props":803,"children":804},{"emptyLinePlaceholder":93},[805],{"type":43,"value":96},{"type":37,"tag":77,"props":807,"children":808},{"class":79,"line":134},[809],{"type":37,"tag":77,"props":810,"children":811},{},[812],{"type":43,"value":813},"# Add text\n",{"type":37,"tag":77,"props":815,"children":816},{"class":79,"line":143},[817],{"type":37,"tag":77,"props":818,"children":819},{},[820],{"type":43,"value":821},"c.drawString(100, height - 100, \"Hello World!\")\n",{"type":37,"tag":77,"props":823,"children":824},{"class":79,"line":152},[825],{"type":37,"tag":77,"props":826,"children":827},{},[828],{"type":43,"value":829},"c.drawString(100, height - 120, \"This is a PDF created with reportlab\")\n",{"type":37,"tag":77,"props":831,"children":832},{"class":79,"line":161},[833],{"type":37,"tag":77,"props":834,"children":835},{"emptyLinePlaceholder":93},[836],{"type":43,"value":96},{"type":37,"tag":77,"props":838,"children":839},{"class":79,"line":699},[840],{"type":37,"tag":77,"props":841,"children":842},{},[843],{"type":43,"value":844},"# Add a line\n",{"type":37,"tag":77,"props":846,"children":847},{"class":79,"line":707},[848],{"type":37,"tag":77,"props":849,"children":850},{},[851],{"type":43,"value":852},"c.line(100, height - 140, 400, height - 140)\n",{"type":37,"tag":77,"props":854,"children":855},{"class":79,"line":716},[856],{"type":37,"tag":77,"props":857,"children":858},{"emptyLinePlaceholder":93},[859],{"type":43,"value":96},{"type":37,"tag":77,"props":861,"children":862},{"class":79,"line":725},[863],{"type":37,"tag":77,"props":864,"children":865},{},[866],{"type":43,"value":867},"# Save\n",{"type":37,"tag":77,"props":869,"children":870},{"class":79,"line":734},[871],{"type":37,"tag":77,"props":872,"children":873},{},[874],{"type":43,"value":875},"c.save()\n",{"type":37,"tag":182,"props":877,"children":879},{"id":878},"create-pdf-with-multiple-pages",[880],{"type":43,"value":881},"Create PDF with Multiple Pages",{"type":37,"tag":65,"props":883,"children":885},{"className":67,"code":884,"language":69,"meta":70,"style":70},"from reportlab.lib.pagesizes import letter\nfrom reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak\nfrom reportlab.lib.styles import getSampleStyleSheet\n\ndoc = SimpleDocTemplate(\"report.pdf\", pagesize=letter)\nstyles = getSampleStyleSheet()\nstory = []\n\n# Add content\ntitle = Paragraph(\"Report Title\", styles['Title'])\nstory.append(title)\nstory.append(Spacer(1, 12))\n\nbody = Paragraph(\"This is the body of the report. \" * 20, styles['Normal'])\nstory.append(body)\nstory.append(PageBreak())\n\n# Page 2\nstory.append(Paragraph(\"Page 2\", styles['Heading1']))\nstory.append(Paragraph(\"Content for page 2\", styles['Normal']))\n\n# Build PDF\ndoc.build(story)\n",[886],{"type":37,"tag":73,"props":887,"children":888},{"__ignoreMap":70},[889,896,904,912,919,927,935,943,950,958,966,974,982,989,997,1005,1014,1022,1031,1040,1049,1057,1066],{"type":37,"tag":77,"props":890,"children":891},{"class":79,"line":80},[892],{"type":37,"tag":77,"props":893,"children":894},{},[895],{"type":43,"value":767},{"type":37,"tag":77,"props":897,"children":898},{"class":79,"line":89},[899],{"type":37,"tag":77,"props":900,"children":901},{},[902],{"type":43,"value":903},"from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak\n",{"type":37,"tag":77,"props":905,"children":906},{"class":79,"line":99},[907],{"type":37,"tag":77,"props":908,"children":909},{},[910],{"type":43,"value":911},"from reportlab.lib.styles import getSampleStyleSheet\n",{"type":37,"tag":77,"props":913,"children":914},{"class":79,"line":108},[915],{"type":37,"tag":77,"props":916,"children":917},{"emptyLinePlaceholder":93},[918],{"type":43,"value":96},{"type":37,"tag":77,"props":920,"children":921},{"class":79,"line":117},[922],{"type":37,"tag":77,"props":923,"children":924},{},[925],{"type":43,"value":926},"doc = SimpleDocTemplate(\"report.pdf\", pagesize=letter)\n",{"type":37,"tag":77,"props":928,"children":929},{"class":79,"line":126},[930],{"type":37,"tag":77,"props":931,"children":932},{},[933],{"type":43,"value":934},"styles = getSampleStyleSheet()\n",{"type":37,"tag":77,"props":936,"children":937},{"class":79,"line":134},[938],{"type":37,"tag":77,"props":939,"children":940},{},[941],{"type":43,"value":942},"story = []\n",{"type":37,"tag":77,"props":944,"children":945},{"class":79,"line":143},[946],{"type":37,"tag":77,"props":947,"children":948},{"emptyLinePlaceholder":93},[949],{"type":43,"value":96},{"type":37,"tag":77,"props":951,"children":952},{"class":79,"line":152},[953],{"type":37,"tag":77,"props":954,"children":955},{},[956],{"type":43,"value":957},"# Add content\n",{"type":37,"tag":77,"props":959,"children":960},{"class":79,"line":161},[961],{"type":37,"tag":77,"props":962,"children":963},{},[964],{"type":43,"value":965},"title = Paragraph(\"Report Title\", styles['Title'])\n",{"type":37,"tag":77,"props":967,"children":968},{"class":79,"line":699},[969],{"type":37,"tag":77,"props":970,"children":971},{},[972],{"type":43,"value":973},"story.append(title)\n",{"type":37,"tag":77,"props":975,"children":976},{"class":79,"line":707},[977],{"type":37,"tag":77,"props":978,"children":979},{},[980],{"type":43,"value":981},"story.append(Spacer(1, 12))\n",{"type":37,"tag":77,"props":983,"children":984},{"class":79,"line":716},[985],{"type":37,"tag":77,"props":986,"children":987},{"emptyLinePlaceholder":93},[988],{"type":43,"value":96},{"type":37,"tag":77,"props":990,"children":991},{"class":79,"line":725},[992],{"type":37,"tag":77,"props":993,"children":994},{},[995],{"type":43,"value":996},"body = Paragraph(\"This is the body of the report. \" * 20, styles['Normal'])\n",{"type":37,"tag":77,"props":998,"children":999},{"class":79,"line":734},[1000],{"type":37,"tag":77,"props":1001,"children":1002},{},[1003],{"type":43,"value":1004},"story.append(body)\n",{"type":37,"tag":77,"props":1006,"children":1008},{"class":79,"line":1007},16,[1009],{"type":37,"tag":77,"props":1010,"children":1011},{},[1012],{"type":43,"value":1013},"story.append(PageBreak())\n",{"type":37,"tag":77,"props":1015,"children":1017},{"class":79,"line":1016},17,[1018],{"type":37,"tag":77,"props":1019,"children":1020},{"emptyLinePlaceholder":93},[1021],{"type":43,"value":96},{"type":37,"tag":77,"props":1023,"children":1025},{"class":79,"line":1024},18,[1026],{"type":37,"tag":77,"props":1027,"children":1028},{},[1029],{"type":43,"value":1030},"# Page 2\n",{"type":37,"tag":77,"props":1032,"children":1034},{"class":79,"line":1033},19,[1035],{"type":37,"tag":77,"props":1036,"children":1037},{},[1038],{"type":43,"value":1039},"story.append(Paragraph(\"Page 2\", styles['Heading1']))\n",{"type":37,"tag":77,"props":1041,"children":1043},{"class":79,"line":1042},20,[1044],{"type":37,"tag":77,"props":1045,"children":1046},{},[1047],{"type":43,"value":1048},"story.append(Paragraph(\"Content for page 2\", styles['Normal']))\n",{"type":37,"tag":77,"props":1050,"children":1052},{"class":79,"line":1051},21,[1053],{"type":37,"tag":77,"props":1054,"children":1055},{"emptyLinePlaceholder":93},[1056],{"type":43,"value":96},{"type":37,"tag":77,"props":1058,"children":1060},{"class":79,"line":1059},22,[1061],{"type":37,"tag":77,"props":1062,"children":1063},{},[1064],{"type":43,"value":1065},"# Build PDF\n",{"type":37,"tag":77,"props":1067,"children":1069},{"class":79,"line":1068},23,[1070],{"type":37,"tag":77,"props":1071,"children":1072},{},[1073],{"type":43,"value":1074},"doc.build(story)\n",{"type":37,"tag":182,"props":1076,"children":1078},{"id":1077},"subscripts-and-superscripts",[1079],{"type":43,"value":1080},"Subscripts and Superscripts",{"type":37,"tag":53,"props":1082,"children":1083},{},[1084,1090],{"type":37,"tag":1085,"props":1086,"children":1087},"strong",{},[1088],{"type":43,"value":1089},"IMPORTANT",{"type":43,"value":1091},": Never use Unicode subscript\u002Fsuperscript characters (₀₁₂₃₄₅₆₇₈₉, ⁰¹²³⁴⁵⁶⁷⁸⁹) in ReportLab PDFs. The built-in fonts do not include these glyphs, causing them to render as solid black boxes.",{"type":37,"tag":53,"props":1093,"children":1094},{},[1095],{"type":43,"value":1096},"Instead, use ReportLab's XML markup tags in Paragraph objects:",{"type":37,"tag":65,"props":1098,"children":1100},{"className":67,"code":1099,"language":69,"meta":70,"style":70},"from reportlab.platypus import Paragraph\nfrom reportlab.lib.styles import getSampleStyleSheet\n\nstyles = getSampleStyleSheet()\n\n# Subscripts: use \u003Csub> tag\nchemical = Paragraph(\"H\u003Csub>2\u003C\u002Fsub>O\", styles['Normal'])\n\n# Superscripts: use \u003Csuper> tag\nsquared = Paragraph(\"x\u003Csuper>2\u003C\u002Fsuper> + y\u003Csuper>2\u003C\u002Fsuper>\", styles['Normal'])\n",[1101],{"type":37,"tag":73,"props":1102,"children":1103},{"__ignoreMap":70},[1104,1112,1119,1126,1133,1140,1148,1156,1163,1171],{"type":37,"tag":77,"props":1105,"children":1106},{"class":79,"line":80},[1107],{"type":37,"tag":77,"props":1108,"children":1109},{},[1110],{"type":43,"value":1111},"from reportlab.platypus import Paragraph\n",{"type":37,"tag":77,"props":1113,"children":1114},{"class":79,"line":89},[1115],{"type":37,"tag":77,"props":1116,"children":1117},{},[1118],{"type":43,"value":911},{"type":37,"tag":77,"props":1120,"children":1121},{"class":79,"line":99},[1122],{"type":37,"tag":77,"props":1123,"children":1124},{"emptyLinePlaceholder":93},[1125],{"type":43,"value":96},{"type":37,"tag":77,"props":1127,"children":1128},{"class":79,"line":108},[1129],{"type":37,"tag":77,"props":1130,"children":1131},{},[1132],{"type":43,"value":934},{"type":37,"tag":77,"props":1134,"children":1135},{"class":79,"line":117},[1136],{"type":37,"tag":77,"props":1137,"children":1138},{"emptyLinePlaceholder":93},[1139],{"type":43,"value":96},{"type":37,"tag":77,"props":1141,"children":1142},{"class":79,"line":126},[1143],{"type":37,"tag":77,"props":1144,"children":1145},{},[1146],{"type":43,"value":1147},"# Subscripts: use \u003Csub> tag\n",{"type":37,"tag":77,"props":1149,"children":1150},{"class":79,"line":134},[1151],{"type":37,"tag":77,"props":1152,"children":1153},{},[1154],{"type":43,"value":1155},"chemical = Paragraph(\"H\u003Csub>2\u003C\u002Fsub>O\", styles['Normal'])\n",{"type":37,"tag":77,"props":1157,"children":1158},{"class":79,"line":143},[1159],{"type":37,"tag":77,"props":1160,"children":1161},{"emptyLinePlaceholder":93},[1162],{"type":43,"value":96},{"type":37,"tag":77,"props":1164,"children":1165},{"class":79,"line":152},[1166],{"type":37,"tag":77,"props":1167,"children":1168},{},[1169],{"type":43,"value":1170},"# Superscripts: use \u003Csuper> tag\n",{"type":37,"tag":77,"props":1172,"children":1173},{"class":79,"line":161},[1174],{"type":37,"tag":77,"props":1175,"children":1176},{},[1177],{"type":43,"value":1178},"squared = Paragraph(\"x\u003Csuper>2\u003C\u002Fsuper> + y\u003Csuper>2\u003C\u002Fsuper>\", styles['Normal'])\n",{"type":37,"tag":53,"props":1180,"children":1181},{},[1182],{"type":43,"value":1183},"For canvas-drawn text (not Paragraph objects), manually adjust font the size and position rather than using Unicode subscripts\u002Fsuperscripts.",{"type":37,"tag":46,"props":1185,"children":1187},{"id":1186},"command-line-tools",[1188],{"type":43,"value":1189},"Command-Line Tools",{"type":37,"tag":175,"props":1191,"children":1193},{"id":1192},"pdftotext-poppler-utils",[1194],{"type":43,"value":1195},"pdftotext (poppler-utils)",{"type":37,"tag":65,"props":1197,"children":1201},{"className":1198,"code":1199,"language":1200,"meta":70,"style":70},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Extract text\npdftotext input.pdf output.txt\n\n# Extract text preserving layout\npdftotext -layout input.pdf output.txt\n\n# Extract specific pages\npdftotext -f 1 -l 5 input.pdf output.txt  # Pages 1-5\n","bash",[1202],{"type":37,"tag":73,"props":1203,"children":1204},{"__ignoreMap":70},[1205,1213,1233,1240,1248,1268,1275,1283],{"type":37,"tag":77,"props":1206,"children":1207},{"class":79,"line":80},[1208],{"type":37,"tag":77,"props":1209,"children":1211},{"style":1210},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1212],{"type":43,"value":140},{"type":37,"tag":77,"props":1214,"children":1215},{"class":79,"line":89},[1216,1222,1228],{"type":37,"tag":77,"props":1217,"children":1219},{"style":1218},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1220],{"type":43,"value":1221},"pdftotext",{"type":37,"tag":77,"props":1223,"children":1225},{"style":1224},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1226],{"type":43,"value":1227}," input.pdf",{"type":37,"tag":77,"props":1229,"children":1230},{"style":1224},[1231],{"type":43,"value":1232}," output.txt\n",{"type":37,"tag":77,"props":1234,"children":1235},{"class":79,"line":99},[1236],{"type":37,"tag":77,"props":1237,"children":1238},{"emptyLinePlaceholder":93},[1239],{"type":43,"value":96},{"type":37,"tag":77,"props":1241,"children":1242},{"class":79,"line":108},[1243],{"type":37,"tag":77,"props":1244,"children":1245},{"style":1210},[1246],{"type":43,"value":1247},"# Extract text preserving layout\n",{"type":37,"tag":77,"props":1249,"children":1250},{"class":79,"line":117},[1251,1255,1260,1264],{"type":37,"tag":77,"props":1252,"children":1253},{"style":1218},[1254],{"type":43,"value":1221},{"type":37,"tag":77,"props":1256,"children":1257},{"style":1224},[1258],{"type":43,"value":1259}," -layout",{"type":37,"tag":77,"props":1261,"children":1262},{"style":1224},[1263],{"type":43,"value":1227},{"type":37,"tag":77,"props":1265,"children":1266},{"style":1224},[1267],{"type":43,"value":1232},{"type":37,"tag":77,"props":1269,"children":1270},{"class":79,"line":126},[1271],{"type":37,"tag":77,"props":1272,"children":1273},{"emptyLinePlaceholder":93},[1274],{"type":43,"value":96},{"type":37,"tag":77,"props":1276,"children":1277},{"class":79,"line":134},[1278],{"type":37,"tag":77,"props":1279,"children":1280},{"style":1210},[1281],{"type":43,"value":1282},"# Extract specific pages\n",{"type":37,"tag":77,"props":1284,"children":1285},{"class":79,"line":143},[1286,1290,1295,1301,1306,1311,1315,1320],{"type":37,"tag":77,"props":1287,"children":1288},{"style":1218},[1289],{"type":43,"value":1221},{"type":37,"tag":77,"props":1291,"children":1292},{"style":1224},[1293],{"type":43,"value":1294}," -f",{"type":37,"tag":77,"props":1296,"children":1298},{"style":1297},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1299],{"type":43,"value":1300}," 1",{"type":37,"tag":77,"props":1302,"children":1303},{"style":1224},[1304],{"type":43,"value":1305}," -l",{"type":37,"tag":77,"props":1307,"children":1308},{"style":1297},[1309],{"type":43,"value":1310}," 5",{"type":37,"tag":77,"props":1312,"children":1313},{"style":1224},[1314],{"type":43,"value":1227},{"type":37,"tag":77,"props":1316,"children":1317},{"style":1224},[1318],{"type":43,"value":1319}," output.txt",{"type":37,"tag":77,"props":1321,"children":1322},{"style":1210},[1323],{"type":43,"value":1324},"  # Pages 1-5\n",{"type":37,"tag":175,"props":1326,"children":1328},{"id":1327},"qpdf",[1329],{"type":43,"value":1327},{"type":37,"tag":65,"props":1331,"children":1333},{"className":1198,"code":1332,"language":1200,"meta":70,"style":70},"# Merge PDFs\nqpdf --empty --pages file1.pdf file2.pdf -- merged.pdf\n\n# Split pages\nqpdf input.pdf --pages . 1-5 -- pages1-5.pdf\nqpdf input.pdf --pages . 6-10 -- pages6-10.pdf\n\n# Rotate pages\nqpdf input.pdf output.pdf --rotate=+90:1  # Rotate page 1 by 90 degrees\n\n# Remove password\nqpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf\n",[1334],{"type":37,"tag":73,"props":1335,"children":1336},{"__ignoreMap":70},[1337,1345,1382,1389,1397,1431,1464,1471,1479,1505,1512,1520],{"type":37,"tag":77,"props":1338,"children":1339},{"class":79,"line":80},[1340],{"type":37,"tag":77,"props":1341,"children":1342},{"style":1210},[1343],{"type":43,"value":1344},"# Merge PDFs\n",{"type":37,"tag":77,"props":1346,"children":1347},{"class":79,"line":89},[1348,1352,1357,1362,1367,1372,1377],{"type":37,"tag":77,"props":1349,"children":1350},{"style":1218},[1351],{"type":43,"value":1327},{"type":37,"tag":77,"props":1353,"children":1354},{"style":1224},[1355],{"type":43,"value":1356}," --empty",{"type":37,"tag":77,"props":1358,"children":1359},{"style":1224},[1360],{"type":43,"value":1361}," --pages",{"type":37,"tag":77,"props":1363,"children":1364},{"style":1224},[1365],{"type":43,"value":1366}," file1.pdf",{"type":37,"tag":77,"props":1368,"children":1369},{"style":1224},[1370],{"type":43,"value":1371}," file2.pdf",{"type":37,"tag":77,"props":1373,"children":1374},{"style":1224},[1375],{"type":43,"value":1376}," --",{"type":37,"tag":77,"props":1378,"children":1379},{"style":1224},[1380],{"type":43,"value":1381}," merged.pdf\n",{"type":37,"tag":77,"props":1383,"children":1384},{"class":79,"line":99},[1385],{"type":37,"tag":77,"props":1386,"children":1387},{"emptyLinePlaceholder":93},[1388],{"type":43,"value":96},{"type":37,"tag":77,"props":1390,"children":1391},{"class":79,"line":108},[1392],{"type":37,"tag":77,"props":1393,"children":1394},{"style":1210},[1395],{"type":43,"value":1396},"# Split pages\n",{"type":37,"tag":77,"props":1398,"children":1399},{"class":79,"line":117},[1400,1404,1408,1412,1417,1422,1426],{"type":37,"tag":77,"props":1401,"children":1402},{"style":1218},[1403],{"type":43,"value":1327},{"type":37,"tag":77,"props":1405,"children":1406},{"style":1224},[1407],{"type":43,"value":1227},{"type":37,"tag":77,"props":1409,"children":1410},{"style":1224},[1411],{"type":43,"value":1361},{"type":37,"tag":77,"props":1413,"children":1414},{"style":1224},[1415],{"type":43,"value":1416}," .",{"type":37,"tag":77,"props":1418,"children":1419},{"style":1224},[1420],{"type":43,"value":1421}," 1-5",{"type":37,"tag":77,"props":1423,"children":1424},{"style":1224},[1425],{"type":43,"value":1376},{"type":37,"tag":77,"props":1427,"children":1428},{"style":1224},[1429],{"type":43,"value":1430}," pages1-5.pdf\n",{"type":37,"tag":77,"props":1432,"children":1433},{"class":79,"line":126},[1434,1438,1442,1446,1450,1455,1459],{"type":37,"tag":77,"props":1435,"children":1436},{"style":1218},[1437],{"type":43,"value":1327},{"type":37,"tag":77,"props":1439,"children":1440},{"style":1224},[1441],{"type":43,"value":1227},{"type":37,"tag":77,"props":1443,"children":1444},{"style":1224},[1445],{"type":43,"value":1361},{"type":37,"tag":77,"props":1447,"children":1448},{"style":1224},[1449],{"type":43,"value":1416},{"type":37,"tag":77,"props":1451,"children":1452},{"style":1224},[1453],{"type":43,"value":1454}," 6-10",{"type":37,"tag":77,"props":1456,"children":1457},{"style":1224},[1458],{"type":43,"value":1376},{"type":37,"tag":77,"props":1460,"children":1461},{"style":1224},[1462],{"type":43,"value":1463}," pages6-10.pdf\n",{"type":37,"tag":77,"props":1465,"children":1466},{"class":79,"line":134},[1467],{"type":37,"tag":77,"props":1468,"children":1469},{"emptyLinePlaceholder":93},[1470],{"type":43,"value":96},{"type":37,"tag":77,"props":1472,"children":1473},{"class":79,"line":143},[1474],{"type":37,"tag":77,"props":1475,"children":1476},{"style":1210},[1477],{"type":43,"value":1478},"# Rotate pages\n",{"type":37,"tag":77,"props":1480,"children":1481},{"class":79,"line":152},[1482,1486,1490,1495,1500],{"type":37,"tag":77,"props":1483,"children":1484},{"style":1218},[1485],{"type":43,"value":1327},{"type":37,"tag":77,"props":1487,"children":1488},{"style":1224},[1489],{"type":43,"value":1227},{"type":37,"tag":77,"props":1491,"children":1492},{"style":1224},[1493],{"type":43,"value":1494}," output.pdf",{"type":37,"tag":77,"props":1496,"children":1497},{"style":1224},[1498],{"type":43,"value":1499}," --rotate=+90:1",{"type":37,"tag":77,"props":1501,"children":1502},{"style":1210},[1503],{"type":43,"value":1504},"  # Rotate page 1 by 90 degrees\n",{"type":37,"tag":77,"props":1506,"children":1507},{"class":79,"line":161},[1508],{"type":37,"tag":77,"props":1509,"children":1510},{"emptyLinePlaceholder":93},[1511],{"type":43,"value":96},{"type":37,"tag":77,"props":1513,"children":1514},{"class":79,"line":699},[1515],{"type":37,"tag":77,"props":1516,"children":1517},{"style":1210},[1518],{"type":43,"value":1519},"# Remove password\n",{"type":37,"tag":77,"props":1521,"children":1522},{"class":79,"line":707},[1523,1527,1532,1537,1542],{"type":37,"tag":77,"props":1524,"children":1525},{"style":1218},[1526],{"type":43,"value":1327},{"type":37,"tag":77,"props":1528,"children":1529},{"style":1224},[1530],{"type":43,"value":1531}," --password=mypassword",{"type":37,"tag":77,"props":1533,"children":1534},{"style":1224},[1535],{"type":43,"value":1536}," --decrypt",{"type":37,"tag":77,"props":1538,"children":1539},{"style":1224},[1540],{"type":43,"value":1541}," encrypted.pdf",{"type":37,"tag":77,"props":1543,"children":1544},{"style":1224},[1545],{"type":43,"value":1546}," decrypted.pdf\n",{"type":37,"tag":175,"props":1548,"children":1550},{"id":1549},"pdftk-if-available",[1551],{"type":43,"value":1552},"pdftk (if available)",{"type":37,"tag":65,"props":1554,"children":1556},{"className":1198,"code":1555,"language":1200,"meta":70,"style":70},"# Merge\npdftk file1.pdf file2.pdf cat output merged.pdf\n\n# Split\npdftk input.pdf burst\n\n# Rotate\npdftk input.pdf rotate 1east output rotated.pdf\n",[1557],{"type":37,"tag":73,"props":1558,"children":1559},{"__ignoreMap":70},[1560,1568,1598,1605,1613,1629,1636,1644],{"type":37,"tag":77,"props":1561,"children":1562},{"class":79,"line":80},[1563],{"type":37,"tag":77,"props":1564,"children":1565},{"style":1210},[1566],{"type":43,"value":1567},"# Merge\n",{"type":37,"tag":77,"props":1569,"children":1570},{"class":79,"line":89},[1571,1576,1580,1584,1589,1594],{"type":37,"tag":77,"props":1572,"children":1573},{"style":1218},[1574],{"type":43,"value":1575},"pdftk",{"type":37,"tag":77,"props":1577,"children":1578},{"style":1224},[1579],{"type":43,"value":1366},{"type":37,"tag":77,"props":1581,"children":1582},{"style":1224},[1583],{"type":43,"value":1371},{"type":37,"tag":77,"props":1585,"children":1586},{"style":1224},[1587],{"type":43,"value":1588}," cat",{"type":37,"tag":77,"props":1590,"children":1591},{"style":1224},[1592],{"type":43,"value":1593}," output",{"type":37,"tag":77,"props":1595,"children":1596},{"style":1224},[1597],{"type":43,"value":1381},{"type":37,"tag":77,"props":1599,"children":1600},{"class":79,"line":99},[1601],{"type":37,"tag":77,"props":1602,"children":1603},{"emptyLinePlaceholder":93},[1604],{"type":43,"value":96},{"type":37,"tag":77,"props":1606,"children":1607},{"class":79,"line":108},[1608],{"type":37,"tag":77,"props":1609,"children":1610},{"style":1210},[1611],{"type":43,"value":1612},"# Split\n",{"type":37,"tag":77,"props":1614,"children":1615},{"class":79,"line":117},[1616,1620,1624],{"type":37,"tag":77,"props":1617,"children":1618},{"style":1218},[1619],{"type":43,"value":1575},{"type":37,"tag":77,"props":1621,"children":1622},{"style":1224},[1623],{"type":43,"value":1227},{"type":37,"tag":77,"props":1625,"children":1626},{"style":1224},[1627],{"type":43,"value":1628}," burst\n",{"type":37,"tag":77,"props":1630,"children":1631},{"class":79,"line":126},[1632],{"type":37,"tag":77,"props":1633,"children":1634},{"emptyLinePlaceholder":93},[1635],{"type":43,"value":96},{"type":37,"tag":77,"props":1637,"children":1638},{"class":79,"line":134},[1639],{"type":37,"tag":77,"props":1640,"children":1641},{"style":1210},[1642],{"type":43,"value":1643},"# Rotate\n",{"type":37,"tag":77,"props":1645,"children":1646},{"class":79,"line":143},[1647,1651,1655,1660,1665,1669],{"type":37,"tag":77,"props":1648,"children":1649},{"style":1218},[1650],{"type":43,"value":1575},{"type":37,"tag":77,"props":1652,"children":1653},{"style":1224},[1654],{"type":43,"value":1227},{"type":37,"tag":77,"props":1656,"children":1657},{"style":1224},[1658],{"type":43,"value":1659}," rotate",{"type":37,"tag":77,"props":1661,"children":1662},{"style":1224},[1663],{"type":43,"value":1664}," 1east",{"type":37,"tag":77,"props":1666,"children":1667},{"style":1224},[1668],{"type":43,"value":1593},{"type":37,"tag":77,"props":1670,"children":1671},{"style":1224},[1672],{"type":43,"value":1673}," rotated.pdf\n",{"type":37,"tag":46,"props":1675,"children":1677},{"id":1676},"common-tasks",[1678],{"type":43,"value":1679},"Common Tasks",{"type":37,"tag":175,"props":1681,"children":1683},{"id":1682},"extract-text-from-scanned-pdfs",[1684],{"type":43,"value":1685},"Extract Text from Scanned PDFs",{"type":37,"tag":65,"props":1687,"children":1689},{"className":67,"code":1688,"language":69,"meta":70,"style":70},"# Requires: pip install pytesseract pdf2image\nimport pytesseract\nfrom pdf2image import convert_from_path\n\n# Convert PDF to images\nimages = convert_from_path('scanned.pdf')\n\n# OCR each page\ntext = \"\"\nfor i, image in enumerate(images):\n    text += f\"Page {i+1}:\\n\"\n    text += pytesseract.image_to_string(image)\n    text += \"\\n\\n\"\n\nprint(text)\n",[1690],{"type":37,"tag":73,"props":1691,"children":1692},{"__ignoreMap":70},[1693,1701,1709,1717,1724,1732,1740,1747,1755,1762,1770,1778,1786,1794,1801],{"type":37,"tag":77,"props":1694,"children":1695},{"class":79,"line":80},[1696],{"type":37,"tag":77,"props":1697,"children":1698},{},[1699],{"type":43,"value":1700},"# Requires: pip install pytesseract pdf2image\n",{"type":37,"tag":77,"props":1702,"children":1703},{"class":79,"line":89},[1704],{"type":37,"tag":77,"props":1705,"children":1706},{},[1707],{"type":43,"value":1708},"import pytesseract\n",{"type":37,"tag":77,"props":1710,"children":1711},{"class":79,"line":99},[1712],{"type":37,"tag":77,"props":1713,"children":1714},{},[1715],{"type":43,"value":1716},"from pdf2image import convert_from_path\n",{"type":37,"tag":77,"props":1718,"children":1719},{"class":79,"line":108},[1720],{"type":37,"tag":77,"props":1721,"children":1722},{"emptyLinePlaceholder":93},[1723],{"type":43,"value":96},{"type":37,"tag":77,"props":1725,"children":1726},{"class":79,"line":117},[1727],{"type":37,"tag":77,"props":1728,"children":1729},{},[1730],{"type":43,"value":1731},"# Convert PDF to images\n",{"type":37,"tag":77,"props":1733,"children":1734},{"class":79,"line":126},[1735],{"type":37,"tag":77,"props":1736,"children":1737},{},[1738],{"type":43,"value":1739},"images = convert_from_path('scanned.pdf')\n",{"type":37,"tag":77,"props":1741,"children":1742},{"class":79,"line":134},[1743],{"type":37,"tag":77,"props":1744,"children":1745},{"emptyLinePlaceholder":93},[1746],{"type":43,"value":96},{"type":37,"tag":77,"props":1748,"children":1749},{"class":79,"line":143},[1750],{"type":37,"tag":77,"props":1751,"children":1752},{},[1753],{"type":43,"value":1754},"# OCR each page\n",{"type":37,"tag":77,"props":1756,"children":1757},{"class":79,"line":152},[1758],{"type":37,"tag":77,"props":1759,"children":1760},{},[1761],{"type":43,"value":149},{"type":37,"tag":77,"props":1763,"children":1764},{"class":79,"line":161},[1765],{"type":37,"tag":77,"props":1766,"children":1767},{},[1768],{"type":43,"value":1769},"for i, image in enumerate(images):\n",{"type":37,"tag":77,"props":1771,"children":1772},{"class":79,"line":699},[1773],{"type":37,"tag":77,"props":1774,"children":1775},{},[1776],{"type":43,"value":1777},"    text += f\"Page {i+1}:\\n\"\n",{"type":37,"tag":77,"props":1779,"children":1780},{"class":79,"line":707},[1781],{"type":37,"tag":77,"props":1782,"children":1783},{},[1784],{"type":43,"value":1785},"    text += pytesseract.image_to_string(image)\n",{"type":37,"tag":77,"props":1787,"children":1788},{"class":79,"line":716},[1789],{"type":37,"tag":77,"props":1790,"children":1791},{},[1792],{"type":43,"value":1793},"    text += \"\\n\\n\"\n",{"type":37,"tag":77,"props":1795,"children":1796},{"class":79,"line":725},[1797],{"type":37,"tag":77,"props":1798,"children":1799},{"emptyLinePlaceholder":93},[1800],{"type":43,"value":96},{"type":37,"tag":77,"props":1802,"children":1803},{"class":79,"line":734},[1804],{"type":37,"tag":77,"props":1805,"children":1806},{},[1807],{"type":43,"value":1808},"print(text)\n",{"type":37,"tag":175,"props":1810,"children":1812},{"id":1811},"add-watermark",[1813],{"type":43,"value":1814},"Add Watermark",{"type":37,"tag":65,"props":1816,"children":1818},{"className":67,"code":1817,"language":69,"meta":70,"style":70},"from pypdf import PdfReader, PdfWriter\n\n# Create watermark (or load existing)\nwatermark = PdfReader(\"watermark.pdf\").pages[0]\n\n# Apply to all pages\nreader = PdfReader(\"document.pdf\")\nwriter = PdfWriter()\n\nfor page in reader.pages:\n    page.merge_page(watermark)\n    writer.add_page(page)\n\nwith open(\"watermarked.pdf\", \"wb\") as output:\n    writer.write(output)\n",[1819],{"type":37,"tag":73,"props":1820,"children":1821},{"__ignoreMap":70},[1822,1829,1836,1844,1852,1859,1867,1874,1881,1888,1895,1903,1910,1917,1925],{"type":37,"tag":77,"props":1823,"children":1824},{"class":79,"line":80},[1825],{"type":37,"tag":77,"props":1826,"children":1827},{},[1828],{"type":43,"value":86},{"type":37,"tag":77,"props":1830,"children":1831},{"class":79,"line":89},[1832],{"type":37,"tag":77,"props":1833,"children":1834},{"emptyLinePlaceholder":93},[1835],{"type":43,"value":96},{"type":37,"tag":77,"props":1837,"children":1838},{"class":79,"line":99},[1839],{"type":37,"tag":77,"props":1840,"children":1841},{},[1842],{"type":43,"value":1843},"# Create watermark (or load existing)\n",{"type":37,"tag":77,"props":1845,"children":1846},{"class":79,"line":108},[1847],{"type":37,"tag":77,"props":1848,"children":1849},{},[1850],{"type":43,"value":1851},"watermark = PdfReader(\"watermark.pdf\").pages[0]\n",{"type":37,"tag":77,"props":1853,"children":1854},{"class":79,"line":117},[1855],{"type":37,"tag":77,"props":1856,"children":1857},{"emptyLinePlaceholder":93},[1858],{"type":43,"value":96},{"type":37,"tag":77,"props":1860,"children":1861},{"class":79,"line":126},[1862],{"type":37,"tag":77,"props":1863,"children":1864},{},[1865],{"type":43,"value":1866},"# Apply to all pages\n",{"type":37,"tag":77,"props":1868,"children":1869},{"class":79,"line":134},[1870],{"type":37,"tag":77,"props":1871,"children":1872},{},[1873],{"type":43,"value":114},{"type":37,"tag":77,"props":1875,"children":1876},{"class":79,"line":143},[1877],{"type":37,"tag":77,"props":1878,"children":1879},{},[1880],{"type":43,"value":217},{"type":37,"tag":77,"props":1882,"children":1883},{"class":79,"line":152},[1884],{"type":37,"tag":77,"props":1885,"children":1886},{"emptyLinePlaceholder":93},[1887],{"type":43,"value":96},{"type":37,"tag":77,"props":1889,"children":1890},{"class":79,"line":161},[1891],{"type":37,"tag":77,"props":1892,"children":1893},{},[1894],{"type":43,"value":158},{"type":37,"tag":77,"props":1896,"children":1897},{"class":79,"line":699},[1898],{"type":37,"tag":77,"props":1899,"children":1900},{},[1901],{"type":43,"value":1902},"    page.merge_page(watermark)\n",{"type":37,"tag":77,"props":1904,"children":1905},{"class":79,"line":707},[1906],{"type":37,"tag":77,"props":1907,"children":1908},{},[1909],{"type":43,"value":317},{"type":37,"tag":77,"props":1911,"children":1912},{"class":79,"line":716},[1913],{"type":37,"tag":77,"props":1914,"children":1915},{"emptyLinePlaceholder":93},[1916],{"type":43,"value":96},{"type":37,"tag":77,"props":1918,"children":1919},{"class":79,"line":725},[1920],{"type":37,"tag":77,"props":1921,"children":1922},{},[1923],{"type":43,"value":1924},"with open(\"watermarked.pdf\", \"wb\") as output:\n",{"type":37,"tag":77,"props":1926,"children":1927},{"class":79,"line":734},[1928],{"type":37,"tag":77,"props":1929,"children":1930},{},[1931],{"type":43,"value":272},{"type":37,"tag":175,"props":1933,"children":1935},{"id":1934},"extract-images",[1936],{"type":43,"value":1937},"Extract Images",{"type":37,"tag":65,"props":1939,"children":1941},{"className":1198,"code":1940,"language":1200,"meta":70,"style":70},"# Using pdfimages (poppler-utils)\npdfimages -j input.pdf output_prefix\n\n# This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc.\n",[1942],{"type":37,"tag":73,"props":1943,"children":1944},{"__ignoreMap":70},[1945,1953,1975,1982],{"type":37,"tag":77,"props":1946,"children":1947},{"class":79,"line":80},[1948],{"type":37,"tag":77,"props":1949,"children":1950},{"style":1210},[1951],{"type":43,"value":1952},"# Using pdfimages (poppler-utils)\n",{"type":37,"tag":77,"props":1954,"children":1955},{"class":79,"line":89},[1956,1961,1966,1970],{"type":37,"tag":77,"props":1957,"children":1958},{"style":1218},[1959],{"type":43,"value":1960},"pdfimages",{"type":37,"tag":77,"props":1962,"children":1963},{"style":1224},[1964],{"type":43,"value":1965}," -j",{"type":37,"tag":77,"props":1967,"children":1968},{"style":1224},[1969],{"type":43,"value":1227},{"type":37,"tag":77,"props":1971,"children":1972},{"style":1224},[1973],{"type":43,"value":1974}," output_prefix\n",{"type":37,"tag":77,"props":1976,"children":1977},{"class":79,"line":99},[1978],{"type":37,"tag":77,"props":1979,"children":1980},{"emptyLinePlaceholder":93},[1981],{"type":43,"value":96},{"type":37,"tag":77,"props":1983,"children":1984},{"class":79,"line":108},[1985],{"type":37,"tag":77,"props":1986,"children":1987},{"style":1210},[1988],{"type":43,"value":1989},"# This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc.\n",{"type":37,"tag":175,"props":1991,"children":1993},{"id":1992},"password-protection",[1994],{"type":43,"value":1995},"Password Protection",{"type":37,"tag":65,"props":1997,"children":1999},{"className":67,"code":1998,"language":69,"meta":70,"style":70},"from pypdf import PdfReader, PdfWriter\n\nreader = PdfReader(\"input.pdf\")\nwriter = PdfWriter()\n\nfor page in reader.pages:\n    writer.add_page(page)\n\n# Add password\nwriter.encrypt(\"userpassword\", \"ownerpassword\")\n\nwith open(\"encrypted.pdf\", \"wb\") as output:\n    writer.write(output)\n",[2000],{"type":37,"tag":73,"props":2001,"children":2002},{"__ignoreMap":70},[2003,2010,2017,2024,2031,2038,2045,2052,2059,2067,2075,2082,2090],{"type":37,"tag":77,"props":2004,"children":2005},{"class":79,"line":80},[2006],{"type":37,"tag":77,"props":2007,"children":2008},{},[2009],{"type":43,"value":86},{"type":37,"tag":77,"props":2011,"children":2012},{"class":79,"line":89},[2013],{"type":37,"tag":77,"props":2014,"children":2015},{"emptyLinePlaceholder":93},[2016],{"type":43,"value":96},{"type":37,"tag":77,"props":2018,"children":2019},{"class":79,"line":99},[2020],{"type":37,"tag":77,"props":2021,"children":2022},{},[2023],{"type":43,"value":293},{"type":37,"tag":77,"props":2025,"children":2026},{"class":79,"line":108},[2027],{"type":37,"tag":77,"props":2028,"children":2029},{},[2030],{"type":43,"value":217},{"type":37,"tag":77,"props":2032,"children":2033},{"class":79,"line":117},[2034],{"type":37,"tag":77,"props":2035,"children":2036},{"emptyLinePlaceholder":93},[2037],{"type":43,"value":96},{"type":37,"tag":77,"props":2039,"children":2040},{"class":79,"line":126},[2041],{"type":37,"tag":77,"props":2042,"children":2043},{},[2044],{"type":43,"value":158},{"type":37,"tag":77,"props":2046,"children":2047},{"class":79,"line":134},[2048],{"type":37,"tag":77,"props":2049,"children":2050},{},[2051],{"type":43,"value":317},{"type":37,"tag":77,"props":2053,"children":2054},{"class":79,"line":143},[2055],{"type":37,"tag":77,"props":2056,"children":2057},{"emptyLinePlaceholder":93},[2058],{"type":43,"value":96},{"type":37,"tag":77,"props":2060,"children":2061},{"class":79,"line":152},[2062],{"type":37,"tag":77,"props":2063,"children":2064},{},[2065],{"type":43,"value":2066},"# Add password\n",{"type":37,"tag":77,"props":2068,"children":2069},{"class":79,"line":161},[2070],{"type":37,"tag":77,"props":2071,"children":2072},{},[2073],{"type":43,"value":2074},"writer.encrypt(\"userpassword\", \"ownerpassword\")\n",{"type":37,"tag":77,"props":2076,"children":2077},{"class":79,"line":699},[2078],{"type":37,"tag":77,"props":2079,"children":2080},{"emptyLinePlaceholder":93},[2081],{"type":43,"value":96},{"type":37,"tag":77,"props":2083,"children":2084},{"class":79,"line":707},[2085],{"type":37,"tag":77,"props":2086,"children":2087},{},[2088],{"type":43,"value":2089},"with open(\"encrypted.pdf\", \"wb\") as output:\n",{"type":37,"tag":77,"props":2091,"children":2092},{"class":79,"line":716},[2093],{"type":37,"tag":77,"props":2094,"children":2095},{},[2096],{"type":43,"value":272},{"type":37,"tag":46,"props":2098,"children":2100},{"id":2099},"quick-reference",[2101],{"type":43,"value":2102},"Quick Reference",{"type":37,"tag":2104,"props":2105,"children":2106},"table",{},[2107,2131],{"type":37,"tag":2108,"props":2109,"children":2110},"thead",{},[2111],{"type":37,"tag":2112,"props":2113,"children":2114},"tr",{},[2115,2121,2126],{"type":37,"tag":2116,"props":2117,"children":2118},"th",{},[2119],{"type":43,"value":2120},"Task",{"type":37,"tag":2116,"props":2122,"children":2123},{},[2124],{"type":43,"value":2125},"Best Tool",{"type":37,"tag":2116,"props":2127,"children":2128},{},[2129],{"type":43,"value":2130},"Command\u002FCode",{"type":37,"tag":2132,"props":2133,"children":2134},"tbody",{},[2135,2157,2174,2196,2217,2235,2256,2274],{"type":37,"tag":2112,"props":2136,"children":2137},{},[2138,2143,2148],{"type":37,"tag":2139,"props":2140,"children":2141},"td",{},[2142],{"type":43,"value":187},{"type":37,"tag":2139,"props":2144,"children":2145},{},[2146],{"type":43,"value":2147},"pypdf",{"type":37,"tag":2139,"props":2149,"children":2150},{},[2151],{"type":37,"tag":73,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":43,"value":2156},"writer.add_page(page)",{"type":37,"tag":2112,"props":2158,"children":2159},{},[2160,2165,2169],{"type":37,"tag":2139,"props":2161,"children":2162},{},[2163],{"type":43,"value":2164},"Split PDFs",{"type":37,"tag":2139,"props":2166,"children":2167},{},[2168],{"type":43,"value":2147},{"type":37,"tag":2139,"props":2170,"children":2171},{},[2172],{"type":43,"value":2173},"One page per file",{"type":37,"tag":2112,"props":2175,"children":2176},{},[2177,2182,2187],{"type":37,"tag":2139,"props":2178,"children":2179},{},[2180],{"type":43,"value":2181},"Extract text",{"type":37,"tag":2139,"props":2183,"children":2184},{},[2185],{"type":43,"value":2186},"pdfplumber",{"type":37,"tag":2139,"props":2188,"children":2189},{},[2190],{"type":37,"tag":73,"props":2191,"children":2193},{"className":2192},[],[2194],{"type":43,"value":2195},"page.extract_text()",{"type":37,"tag":2112,"props":2197,"children":2198},{},[2199,2204,2208],{"type":37,"tag":2139,"props":2200,"children":2201},{},[2202],{"type":43,"value":2203},"Extract tables",{"type":37,"tag":2139,"props":2205,"children":2206},{},[2207],{"type":43,"value":2186},{"type":37,"tag":2139,"props":2209,"children":2210},{},[2211],{"type":37,"tag":73,"props":2212,"children":2214},{"className":2213},[],[2215],{"type":43,"value":2216},"page.extract_tables()",{"type":37,"tag":2112,"props":2218,"children":2219},{},[2220,2225,2230],{"type":37,"tag":2139,"props":2221,"children":2222},{},[2223],{"type":43,"value":2224},"Create PDFs",{"type":37,"tag":2139,"props":2226,"children":2227},{},[2228],{"type":43,"value":2229},"reportlab",{"type":37,"tag":2139,"props":2231,"children":2232},{},[2233],{"type":43,"value":2234},"Canvas or Platypus",{"type":37,"tag":2112,"props":2236,"children":2237},{},[2238,2243,2247],{"type":37,"tag":2139,"props":2239,"children":2240},{},[2241],{"type":43,"value":2242},"Command line merge",{"type":37,"tag":2139,"props":2244,"children":2245},{},[2246],{"type":43,"value":1327},{"type":37,"tag":2139,"props":2248,"children":2249},{},[2250],{"type":37,"tag":73,"props":2251,"children":2253},{"className":2252},[],[2254],{"type":43,"value":2255},"qpdf --empty --pages ...",{"type":37,"tag":2112,"props":2257,"children":2258},{},[2259,2264,2269],{"type":37,"tag":2139,"props":2260,"children":2261},{},[2262],{"type":43,"value":2263},"OCR scanned PDFs",{"type":37,"tag":2139,"props":2265,"children":2266},{},[2267],{"type":43,"value":2268},"pytesseract",{"type":37,"tag":2139,"props":2270,"children":2271},{},[2272],{"type":43,"value":2273},"Convert to image first",{"type":37,"tag":2112,"props":2275,"children":2276},{},[2277,2282,2287],{"type":37,"tag":2139,"props":2278,"children":2279},{},[2280],{"type":43,"value":2281},"Fill PDF forms",{"type":37,"tag":2139,"props":2283,"children":2284},{},[2285],{"type":43,"value":2286},"pdf-lib or pypdf (see FORMS.md)",{"type":37,"tag":2139,"props":2288,"children":2289},{},[2290],{"type":43,"value":2291},"See FORMS.md",{"type":37,"tag":46,"props":2293,"children":2295},{"id":2294},"next-steps",[2296],{"type":43,"value":2297},"Next Steps",{"type":37,"tag":2299,"props":2300,"children":2301},"ul",{},[2302,2308,2313,2318],{"type":37,"tag":2303,"props":2304,"children":2305},"li",{},[2306],{"type":43,"value":2307},"For advanced pypdfium2 usage, see REFERENCE.md",{"type":37,"tag":2303,"props":2309,"children":2310},{},[2311],{"type":43,"value":2312},"For JavaScript libraries (pdf-lib), see REFERENCE.md",{"type":37,"tag":2303,"props":2314,"children":2315},{},[2316],{"type":43,"value":2317},"If you need to fill out a PDF form, follow the instructions in FORMS.md",{"type":37,"tag":2303,"props":2319,"children":2320},{},[2321],{"type":43,"value":2322},"For troubleshooting guides, see REFERENCE.md",{"type":37,"tag":2324,"props":2325,"children":2326},"style",{},[2327],{"type":43,"value":2328},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2330,"total":2508},[2331,2350,2364,2374,2393,2406,2425,2445,2459,2474,2479,2492],{"slug":2332,"name":2332,"fn":2333,"description":2334,"org":2335,"tags":2336,"stars":19,"repoUrl":20,"updatedAt":2349},"algorithmic-art","create algorithmic art with p5.js","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2337,2340,2343,2346],{"name":2338,"slug":2339,"type":15},"Creative","creative",{"name":2341,"slug":2342,"type":15},"Design","design",{"name":2344,"slug":2345,"type":15},"Generative Art","generative-art",{"name":2347,"slug":2348,"type":15},"JavaScript","javascript","2026-04-06T17:56:15.455818",{"slug":2351,"name":2351,"fn":2352,"description":2353,"org":2354,"tags":2355,"stars":19,"repoUrl":20,"updatedAt":2363},"brand-guidelines","apply Anthropic brand colors and typography","Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2356,2359,2360],{"name":2357,"slug":2358,"type":15},"Branding","branding",{"name":2341,"slug":2342,"type":15},{"name":2361,"slug":2362,"type":15},"Typography","typography","2026-04-06T17:56:05.042852",{"slug":2365,"name":2365,"fn":2366,"description":2367,"org":2368,"tags":2369,"stars":19,"repoUrl":20,"updatedAt":2373},"canvas-design","create posters and visual art as PNG or PDF","Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2370,2371,2372],{"name":2338,"slug":2339,"type":15},{"name":2341,"slug":2342,"type":15},{"name":14,"slug":4,"type":15},"2026-04-06T17:56:03.794732",{"slug":2375,"name":2375,"fn":2376,"description":2377,"org":2378,"tags":2379,"stars":19,"repoUrl":20,"updatedAt":2392},"claude-api","build apps with the Claude API","Reference for the Claude API \u002F Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude\u002FAnthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing\u002Fmodel choice\u002Flimits\u002Fcaching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent\u002FMCP\u002Ftool-definition\u002Fmulti-agent\u002FRAG\u002FLLM-judge\u002Fcomputer-use; generate\u002Fsummarize\u002Fextract\u002Fclassify\u002Frewrite\u002Fconverse over NL; debugging refusals\u002Fcutoffs\u002Fstreaming\u002Ftool-calls\u002Ftokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI\u002FGPT\u002FGemini\u002FLlama\u002FMistral\u002FCohere\u002FOllama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2380,2383,2384,2387,2389],{"name":2381,"slug":2382,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},{"name":2385,"slug":2386,"type":15},"Anthropic SDK","anthropic-sdk",{"name":2388,"slug":2375,"type":15},"Claude API",{"name":2390,"slug":2391,"type":15},"LLM","llm","2026-07-28T05:36:08.213335",{"slug":2394,"name":2394,"fn":2395,"description":2396,"org":2397,"tags":2398,"stars":19,"repoUrl":20,"updatedAt":2405},"doc-coauthoring","co-author documentation and technical specs","Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2399,2402],{"name":2400,"slug":2401,"type":15},"Documentation","documentation",{"name":2403,"slug":2404,"type":15},"Technical Writing","technical-writing","2026-04-06T17:56:14.18897",{"slug":2407,"name":2407,"fn":2408,"description":2409,"org":2410,"tags":2411,"stars":19,"repoUrl":20,"updatedAt":2424},"docx","create and edit Word documents","Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files) or Word templates (.dotx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', '.dotx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2412,2413,2415,2418,2421],{"name":17,"slug":18,"type":15},{"name":2414,"slug":2407,"type":15},"DOCX",{"name":2416,"slug":2417,"type":15},"Office","office",{"name":2419,"slug":2420,"type":15},"Templates","templates",{"name":2422,"slug":2423,"type":15},"Word","word","2026-07-18T05:16:23.136271",{"slug":2426,"name":2426,"fn":2427,"description":2428,"org":2429,"tags":2430,"stars":19,"repoUrl":20,"updatedAt":2444},"frontend-design","design production-grade frontend interfaces","Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2431,2432,2435,2438,2441],{"name":2341,"slug":2342,"type":15},{"name":2433,"slug":2434,"type":15},"Frontend","frontend",{"name":2436,"slug":2437,"type":15},"React","react",{"name":2439,"slug":2440,"type":15},"Tailwind CSS","tailwind-css",{"name":2442,"slug":2443,"type":15},"UI Components","ui-components","2026-04-06T17:56:16.723469",{"slug":2446,"name":2446,"fn":2447,"description":2448,"org":2449,"tags":2450,"stars":19,"repoUrl":20,"updatedAt":2458},"internal-comms","write internal company communications","A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2451,2454,2455],{"name":2452,"slug":2453,"type":15},"Communications","communications",{"name":2419,"slug":2420,"type":15},{"name":2456,"slug":2457,"type":15},"Writing","writing","2026-04-06T17:56:20.695522",{"slug":2460,"name":2460,"fn":2461,"description":2462,"org":2463,"tags":2464,"stars":19,"repoUrl":20,"updatedAt":2473},"mcp-builder","build MCP servers","Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node\u002FTypeScript (MCP SDK).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2465,2466,2469,2470],{"name":2381,"slug":2382,"type":15},{"name":2467,"slug":2468,"type":15},"API Development","api-development",{"name":2390,"slug":2391,"type":15},{"name":2471,"slug":2472,"type":15},"MCP","mcp","2026-04-06T17:56:10.357665",{"slug":4,"name":4,"fn":5,"description":6,"org":2475,"tags":2476,"stars":19,"repoUrl":20,"updatedAt":21},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2477,2478],{"name":17,"slug":18,"type":15},{"name":14,"slug":4,"type":15},{"slug":2480,"name":2480,"fn":2481,"description":2482,"org":2483,"tags":2484,"stars":19,"repoUrl":20,"updatedAt":2491},"pptx","create and edit PowerPoint presentations","Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. If a .pptx or .potx file needs to be opened, created, or touched, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2485,2488],{"name":2486,"slug":2487,"type":15},"PowerPoint","powerpoint",{"name":2489,"slug":2490,"type":15},"Presentations","presentations","2026-07-18T05:16:24.1471",{"slug":2493,"name":2493,"fn":2494,"description":2495,"org":2496,"tags":2497,"stars":19,"repoUrl":20,"updatedAt":2507},"skill-creator","create and optimize agent skills","Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2498,2499,2500,2503,2506],{"name":2381,"slug":2382,"type":15},{"name":2400,"slug":2401,"type":15},{"name":2501,"slug":2502,"type":15},"Evals","evals",{"name":2504,"slug":2505,"type":15},"Performance","performance",{"name":2403,"slug":2404,"type":15},"2026-04-19T06:45:40.804",490,{"items":2510,"total":1016},[2511,2518,2524,2530,2538,2543,2551],{"slug":2332,"name":2332,"fn":2333,"description":2334,"org":2512,"tags":2513,"stars":19,"repoUrl":20,"updatedAt":2349},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2514,2515,2516,2517],{"name":2338,"slug":2339,"type":15},{"name":2341,"slug":2342,"type":15},{"name":2344,"slug":2345,"type":15},{"name":2347,"slug":2348,"type":15},{"slug":2351,"name":2351,"fn":2352,"description":2353,"org":2519,"tags":2520,"stars":19,"repoUrl":20,"updatedAt":2363},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2521,2522,2523],{"name":2357,"slug":2358,"type":15},{"name":2341,"slug":2342,"type":15},{"name":2361,"slug":2362,"type":15},{"slug":2365,"name":2365,"fn":2366,"description":2367,"org":2525,"tags":2526,"stars":19,"repoUrl":20,"updatedAt":2373},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2527,2528,2529],{"name":2338,"slug":2339,"type":15},{"name":2341,"slug":2342,"type":15},{"name":14,"slug":4,"type":15},{"slug":2375,"name":2375,"fn":2376,"description":2377,"org":2531,"tags":2532,"stars":19,"repoUrl":20,"updatedAt":2392},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2533,2534,2535,2536,2537],{"name":2381,"slug":2382,"type":15},{"name":9,"slug":8,"type":15},{"name":2385,"slug":2386,"type":15},{"name":2388,"slug":2375,"type":15},{"name":2390,"slug":2391,"type":15},{"slug":2394,"name":2394,"fn":2395,"description":2396,"org":2539,"tags":2540,"stars":19,"repoUrl":20,"updatedAt":2405},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2541,2542],{"name":2400,"slug":2401,"type":15},{"name":2403,"slug":2404,"type":15},{"slug":2407,"name":2407,"fn":2408,"description":2409,"org":2544,"tags":2545,"stars":19,"repoUrl":20,"updatedAt":2424},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2546,2547,2548,2549,2550],{"name":17,"slug":18,"type":15},{"name":2414,"slug":2407,"type":15},{"name":2416,"slug":2417,"type":15},{"name":2419,"slug":2420,"type":15},{"name":2422,"slug":2423,"type":15},{"slug":2426,"name":2426,"fn":2427,"description":2428,"org":2552,"tags":2553,"stars":19,"repoUrl":20,"updatedAt":2444},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2554,2555,2556,2557,2558],{"name":2341,"slug":2342,"type":15},{"name":2433,"slug":2434,"type":15},{"name":2436,"slug":2437,"type":15},{"name":2439,"slug":2440,"type":15},{"name":2442,"slug":2443,"type":15}]