[{"data":1,"prerenderedAt":174},["ShallowReactive",2],{"skill-body-pdf-a91f3c0e":3},{"id":4,"hash":5,"lines":6,"body":7,"data":173},"pdf","a91f3c0e",50,{"type":8,"children":9},"root",[10,19,26,32,38,52,58,65,74,83,89,110,116,154,160],{"type":11,"tag":12,"props":13,"children":15},"element","h1",{"id":14},"pdf-processing-guide",[16],{"type":17,"value":18},"text","PDF Processing Guide",{"type":11,"tag":20,"props":21,"children":23},"h2",{"id":22},"overview",[24],{"type":17,"value":25},"Overview",{"type":11,"tag":27,"props":28,"children":29},"p",{},[30],{"type":17,"value":31},"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":11,"tag":20,"props":33,"children":35},{"id":34},"quick-start",[36],{"type":17,"value":37},"Quick Start",{"type":11,"tag":39,"props":40,"children":46},"pre",{"className":41,"code":43,"language":44,"meta":45},[42],"language-python","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","",[47],{"type":11,"tag":48,"props":49,"children":50},"code",{"__ignoreMap":45},[51],{"type":17,"value":43},{"type":11,"tag":20,"props":53,"children":55},{"id":54},"python-libraries",[56],{"type":17,"value":57},"Python Libraries",{"type":11,"tag":59,"props":60,"children":62},"h3",{"id":61},"pypdf-basic-operations",[63],{"type":17,"value":64},"pypdf - Basic Operations",{"type":11,"tag":27,"props":66,"children":67},{},[68],{"type":11,"tag":69,"props":70,"children":71},"strong",{},[72],{"type":17,"value":73},"Merge PDFs",{"type":11,"tag":39,"props":75,"children":78},{"className":76,"code":77,"language":44,"meta":45},[42],"writer = PdfWriter()\nfor pdf_file in [\"doc1.pdf\", \"doc2.pdf\"]:\n    reader = PdfReader(pdf_file)\n    for page in reader.pages:\n        writer.add_page(page)\nwith open(\"merged.pdf\", \"wb\") as output:\n    writer.write(output)\n",[79],{"type":11,"tag":48,"props":80,"children":81},{"__ignoreMap":45},[82],{"type":17,"value":77},{"type":11,"tag":59,"props":84,"children":86},{"id":85},"pdfplumber-text-and-table-extraction",[87],{"type":17,"value":88},"pdfplumber - Text and Table Extraction",{"type":11,"tag":27,"props":90,"children":91},{},[92,94,100,102,108],{"type":17,"value":93},"Use ",{"type":11,"tag":48,"props":95,"children":97},{"className":96},[],[98],{"type":17,"value":99},"scripts\u002Fextract_form_structure.py",{"type":17,"value":101}," to dump the field tree before filling a form, and ",{"type":11,"tag":48,"props":103,"children":105},{"className":104},[],[106],{"type":17,"value":107},"scripts\u002Fcheck_bounding_boxes.py",{"type":17,"value":109}," to validate placement afterwards.",{"type":11,"tag":20,"props":111,"children":113},{"id":112},"command-line-tools",[114],{"type":17,"value":115},"Command-Line Tools",{"type":11,"tag":117,"props":118,"children":119},"ul",{},[120,132,143],{"type":11,"tag":121,"props":122,"children":123},"li",{},[124,130],{"type":11,"tag":48,"props":125,"children":127},{"className":126},[],[128],{"type":17,"value":129},"pdftotext -layout in.pdf out.txt",{"type":17,"value":131}," keeps column layout",{"type":11,"tag":121,"props":133,"children":134},{},[135,141],{"type":11,"tag":48,"props":136,"children":138},{"className":137},[],[139],{"type":17,"value":140},"qpdf --decrypt --password=… in.pdf out.pdf",{"type":17,"value":142}," strips owner encryption",{"type":11,"tag":121,"props":144,"children":145},{},[146,152],{"type":11,"tag":48,"props":147,"children":149},{"className":148},[],[150],{"type":17,"value":151},"gs -sDEVICE=pdfwrite -dPDFSETTINGS=\u002Febook",{"type":17,"value":153}," compresses for email",{"type":11,"tag":20,"props":155,"children":157},{"id":156},"scanned-pdfs",[158],{"type":17,"value":159},"Scanned PDFs",{"type":11,"tag":27,"props":161,"children":162},{},[163,165,171],{"type":17,"value":164},"Run OCR (",{"type":11,"tag":48,"props":166,"children":168},{"className":167},[],[169],{"type":17,"value":170},"ocrmypdf --skip-text",{"type":17,"value":172},") first; the extraction recipes above only see the text layer.",{"title":18,"description":45},1794599281773]