{"library":"pdfrw2","title":"pdfrw2 - PDF Reader/Writer Library","description":"pdfrw2 is a maintenance fork of the unmaintained pdfrw library, providing a Pythonic way to read, write, and manipulate PDF files. It allows for tasks like merging, splitting, watermarking, and adding annotations to PDFs. The current version is 0.5.0, and it follows an as-needed release cadence for bug fixes and compatibility updates.","language":"python","status":"active","last_verified":"Mon May 18","install":{"commands":["pip install pdfrw2"],"cli":null},"imports":["from pdfrw import PdfReader","from pdfrw import PdfWriter","from pdfrw import PageMerge"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nfrom pdfrw import PdfReader, PdfWriter\n\n# Create dummy PDF files for demonstration if they don't exist\n# In a real scenario, you would have existing PDF files.\n# This example just copies a (potentially empty) file to simulate input.\n# For a true example, you'd need a PDF generator or existing files.\n\ndef create_dummy_pdf(filename):\n    # This is a highly simplified 'creation' for demonstration purposes.\n    # In a real app, you'd use a library like reportlab or have actual PDFs.\n    with open(filename, 'w') as f:\n        f.write('%PDF-1.4\\n1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj\\n2 0 obj <</Type/Pages/Count 0>> endobj\\nxref\\n0 3\\n0000000000 65535 f\\n0000000009 00000 n\\n0000000052 00000 n\\ntrailer<</Size 3/Root 1 0 R>>startxref\\n106\\n%%EOF')\n\ninput_pdf_path = 'input.pdf'\noutput_pdf_path = 'output.pdf'\n\nif not os.path.exists(input_pdf_path):\n    print(f\"Creating dummy {input_pdf_path} for quickstart...\")\n    create_dummy_pdf(input_pdf_path)\n\ntry:\n    # Read an existing PDF\n    trailer = PdfReader(input_pdf_path)\n\n    # Create a new PDF writer\n    writer = PdfWriter()\n\n    # Add all pages from the input PDF to the writer\n    writer.addpages(trailer.pages)\n\n    # Write the combined PDF to a new file\n    writer.write(output_pdf_path)\n\n    print(f\"Successfully copied '{input_pdf_path}' to '{output_pdf_path}'\")\n\nexcept Exception as e:\n    print(f\"An error occurred: {e}\")\nfinally:\n    # Clean up dummy files\n    # os.remove(input_pdf_path) # Uncomment to remove after running\n    # os.remove(output_pdf_path) # Uncomment to remove after running\n    pass","lang":"python","description":"This quickstart demonstrates how to read an existing PDF file and write its contents to a new PDF file using pdfrw2. It shows the basic usage of `PdfReader` and `PdfWriter` to copy a PDF. For a more robust example with actual PDF content, you would typically start with a real PDF file.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-18","installed_version":"0.5.0","pypi_latest":"0.5.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.6,"avg_import_s":0.04,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.03,"mem_mb":1.3,"disk_size":"18.2M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.02,"mem_mb":1.3,"disk_size":"19M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.05,"mem_mb":1.5,"disk_size":"20.1M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.05,"mem_mb":1.5,"disk_size":"21M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.04,"mem_mb":1.3,"disk_size":"11.9M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.05,"mem_mb":1.3,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.04,"mem_mb":1.6,"disk_size":"11.6M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.05,"mem_mb":1.4,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.03,"mem_mb":1.2,"disk_size":"17.7M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pdfrw2","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.03,"mem_mb":1.2,"disk_size":"18M"}]}}