{"id":"6db6bb5a-6b53-4892-b21c-76adc8b6f80a","shortId":"FKPtWd","kind":"skill","title":"pdf-processing-anthropic","tagline":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/","description":"# 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/superscript 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 <sub> tag\nchemical = Paragraph(\"H<sub>2</sub>O\", styles['Normal'])\n\n# Superscripts: use <super> tag\nsquared = Paragraph(\"x<super>2</super> + y<super>2</super>\", styles['Normal'])\n```\n\nFor canvas-drawn text (not Paragraph objects), manually adjust font the size and position rather than using Unicode subscripts/superscripts.\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/Code |\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","tags":["pdf","processing","anthropic","awesome","legal","skills","lawvable","agent-skills","automation","law","legal-work","workflows"],"capabilities":["skill","source-lawvable","skill-pdf-processing-anthropic","topic-agent-skills","topic-automation","topic-law","topic-legal-work","topic-workflows"],"categories":["awesome-legal-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/lawvable/awesome-legal-skills/pdf-processing-anthropic","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add lawvable/awesome-legal-skills","source_repo":"https://github.com/lawvable/awesome-legal-skills","install_from":"skills.sh"}},"qualityScore":"0.605","qualityRationale":"deterministic score 0.60 from registry signals: · indexed on github topic:agent-skills · 310 github stars · SKILL.md body (7,511 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T18:53:55.877Z","embedding":null,"createdAt":"2026-04-18T22:04:33.975Z","updatedAt":"2026-05-02T18:53:55.877Z","lastSeenAt":"2026-05-02T18:53:55.877Z","tsv":"'+1':183,295,299,740 '+90':658 '-10':650 '-5':627,644 '0':224,346,769 '1':343,463,620,626,643,659,662 '100':394,396,400,414 '12':464 '120':402 '140':416,419 '1east':693 '2':482,486,494,558,568,570 '20':474 '400':417 '5':622 '6':649 '90':226,228,664 'ad':38 'add':391,410,451,752,838 'adjust':582 'advanc':67,306,916 'all_tables.append':347 'anthrop':4 'anyth':14 'apart':35 'appli':770 'author':204 'avail':676 'bash':601,629,677,799 'basic':123,371 'best':854 'black':529 'bodi':465,470,478 'box':530 'build':497 'built':515 'built-in':514 'burst':688 'c':383 'c.drawstring':393,399 'c.line':413 'c.save':421 'canva':382,575,883 'canvas-drawn':574 'canvas.canvas':384 'cat':682 'caus':523 'charact':509 'check':334 'chemic':555 'clockwis':230 'column':344 'combin':26,349,355 'combined_df.to':363 'command':63,594,886 'command-lin':62,593 'command/code':856 'common':696 'content':452,491 'convert':714,717,722,897 'cover':53 'creat':40,369,407,422,760,880 'creation':373 'creator':212 'decrypt':671 'decrypted.pdf':673 'degre':229,665 'detail':72 'df':340,348,356 'doc':443 'doc.build':499 'doc1.pdf':139 'doc2.pdf':140 'doc3.pdf':141 'document.pdf':104,195,256,273,316,776 'drawn':576 'empti':339,633,891 'encrypt':46 'encrypted.pdf':672,845 'enumer':171,280,289,734 'essenti':54 'etc':817 'exampl':73 'excel':364 'exist':764 'extract':22,110,190,246,247,268,308,602,607,615,698,797,811,870,875 'extracted_tables.xlsx':365 'f':106,180,199,203,207,211,292,619,737 'fals':367 'featur':68 'file':17,137,145,869 'file1.pdf':635,680 'file2.pdf':636,681 'fill':43,80,901,933 'first':900 'follow':88,938 'font':517,583 'form':45,84,903,937 'forms.md':86,910,912,942 'getsamplestylesheet':442,449,549,551 'glyph':522 'guid':49,52,945 'h':557 'heading1':488 'height':389,395,401,415,418 'hello':397 'hello.pdf':385 'ignor':360 'imag':720,721,732,735,746,798,813,899 'import':96,130,252,310,377,381,430,434,441,504,544,548,709,713,757,823 'includ':19,520 'index':361,366 'input.pdf':166,219,605,613,623,641,647,655,687,691,807,828 'instal':706 'instead':531 'instruct':90,940 'j':286,294,806 'javascript':69,922 'l':621 'layout':250,610,612 'len':108 'letter':378,387,390,431,447 'lib':906,926 'librari':60,70,121,923 'line':64,412,595,887 'load':763 'manual':581 'markup':536 'merg':28,125,630,678,857,888 'merged.pdf':155,637,684 'meta':196 'meta.author':205 'meta.creator':213 'meta.subject':209 'meta.title':201 'metadata':191 'multipl':29,425 'mypassword':670 'n':741,748,749 'need':78,931 'never':505 'new':41 'next':913 'normal':476,496,561,572 'o':559 'object':540,580 'ocr':726,893 'one':32,866 'open':154,179,235,790,844 'oper':57,124 'output':158,160,187,189,239,241,683,694,794,796,808,848,850 'output.pdf':656 'output.txt':606,614,624 'output_prefix-000.jpg':815 'output_prefix-001.jpg':816 'overview':50 'ownerpassword':842 'page':37,107,114,147,151,152,169,176,177,181,215,222,232,233,260,278,297,322,426,481,485,493,617,625,634,639,642,648,653,661,728,738,768,773,780,784,787,788,832,836,837,861,862,867,892 'page.extract':118,264,283,326,873,878 'page.merge':783 'page.rotate':225 'pagebreak':438,480 'pages':386,446 'pages1-5.pdf':645 'pages6-10.pdf':651 'panda':311 'paragraph':436,454,466,484,490,539,545,556,566,579 'password':667,669,818,839 'path':716,724 'pd':313 'pd.concat':357 'pd.dataframe':341 'pdf':2,16,44,47,55,83,101,136,144,162,184,258,275,318,372,406,423,498,718,902,905,925,936 'pdf-lib':904,924 'pdf-processing-anthrop':1 'pdf.pages':262,281,324 'pdf2image':708,712 'pdfimag':801,805 'pdfplumber':242,253,872,877 'pdfplumber.open':255,272,315 'pdfreader':97,103,132,143,165,194,218,758,766,775,824,827 'pdfs':25,30,34,42,126,370,512,631,702,858,864,881,895 'pdftk':674,679,686,690 'pdftotext':597,604,611,618 'pdfwriter':98,131,134,174,221,759,778,825,830 'per':868 'pip':705 'platypus':885 'poppler':599,803 'poppler-util':598,802 'posit':587 'prefix':809 'preserv':609 'print':105,198,202,206,210,266,291,304,750 'process':3,48,56 'protect':819 'pypdf':95,122,129,756,822,859,865,908 'pypdfium2':917 'pytesseract':707,710,896 'pytesseract.image':743 'python':59,93,120,127,163,192,216,251,270,309,374,427,541,703,754,820 'qpdf':628,632,640,646,654,668,889,890 'quick':91,851 'rather':588 'read':20,85,99 'reader':102,142,164,193,217,774,826 'reader.metadata':197 'reader.pages':109,116,149,172,223,782,834 'refer':852 'reference.md':75,920,928,947 'remov':666 'render':526 'report':455,473 'report.pdf':445 'reportlab':368,409,511,533,882 'reportlab.lib.pagesizes':376,429 'reportlab.lib.styles':440,547 'reportlab.pdfgen':380 'reportlab.platypus':433,543 'requir':704 'rotat':36,214,227,652,657,660,689,692 'rotated.pdf':236,695 'row':301,305 'save':420 'scan':701,894 'scanned.pdf':725 'see':74,909,911,919,927,946 'simpledoctempl':435,444 'size':585 'skill':7 'skill-pdf-processing-anthropic' 'solid':528 'source-lawvable' 'spacer':437,462 'specif':616 'split':33,161,638,685,863 'squar':565 'start':92 'step':914 'stori':450,500 'story.append':459,461,477,479,483,489 'string':745 'style':448,457,475,487,495,550,560,571 'subject':208 'subscript':501,552 'subscript/superscript':508 'subscripts/superscripts':592 'superscript':503,562 'tabl':245,269,282,284,287,290,293,303,307,320,325,327,329,331,333,336,342,345,351,354,359,876,879 'tag':537,554,564 'task':697,853 'text':111,112,117,119,243,248,263,265,267,392,577,603,608,699,729,736,742,747,751,871,874 'text/tables':23 'titl':200,453,456,458,460 'tool':65,596,855 'topic-agent-skills' 'topic-automation' 'topic-law' 'topic-legal-work' 'topic-workflows' 'troubleshoot':944 'true':362 'unicod':507,591 'usag':918 'use':5,58,506,532,553,563,590,800 'user':10 'userpassword':841 'util':600,804 'want':11 'watermark':39,753,761,765,785 'watermark.pdf':767 'watermarked.pdf':791 'wb':156,185,237,792,846 'whenev':8 'width':388 'world':398 'writer':133,173,220,777,829 'writer.add':150,175,231,786,835,860 'writer.encrypt':840 'writer.write':159,188,240,795,849 'x':567 'xml':535 'y':569","prices":[{"id":"7f277481-57ea-4a00-ad95-b2d4e889f175","listingId":"6db6bb5a-6b53-4892-b21c-76adc8b6f80a","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"lawvable","category":"awesome-legal-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:04:33.975Z"}],"sources":[{"listingId":"6db6bb5a-6b53-4892-b21c-76adc8b6f80a","source":"github","sourceId":"lawvable/awesome-legal-skills/pdf-processing-anthropic","sourceUrl":"https://github.com/lawvable/awesome-legal-skills/tree/main/skills/pdf-processing-anthropic","isPrimary":false,"firstSeenAt":"2026-04-18T22:04:33.975Z","lastSeenAt":"2026-05-02T18:53:55.877Z"}],"details":{"listingId":"6db6bb5a-6b53-4892-b21c-76adc8b6f80a","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"lawvable","slug":"pdf-processing-anthropic","github":{"repo":"lawvable/awesome-legal-skills","stars":310,"topics":["agent-skills","automation","law","legal-work","workflows"],"license":"other","html_url":"https://github.com/lawvable/awesome-legal-skills","pushed_at":"2026-03-03T11:25:06Z","description":"A curated list of awesome Agent Skills for automating legal work","skill_md_sha":"79c09bf7889167b37887d7b653a5552e52791a5c","skill_md_path":"skills/pdf-processing-anthropic/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/lawvable/awesome-legal-skills/tree/main/skills/pdf-processing-anthropic"},"layout":"multi","source":"github","category":"awesome-legal-skills","frontmatter":{"name":"pdf-processing-anthropic","description":"Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting 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."},"skills_sh_url":"https://skills.sh/lawvable/awesome-legal-skills/pdf-processing-anthropic"},"updatedAt":"2026-05-02T18:53:55.877Z"}}