{"library":"pypdftk","title":"PyPDFtk","description":"PyPDFtk is a Python wrapper for the powerful command-line tool PDFtk (PDF Toolkit). It provides a Pythonic interface to manipulate PDF documents, enabling operations such as filling forms with data, concatenating multiple PDFs, splitting a single PDF into individual pages, extracting specific page ranges, replacing pages, generating XFDF data, stamping, and adding backgrounds. The library is currently at version 0.5, with its last release in April 2021, and primarily follows a maintenance release cadence.","language":"python","status":"active","last_verified":"Fri May 15","install":{"commands":["pip install pypdftk"],"cli":null},"imports":["import pypdftk"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import pypdftk\nimport os\nimport tempfile\n\n# NOTE: You must have the 'pdftk' binary installed on your system.\n# You may also need to set the PDFTK_PATH environment variable if pdftk is not in your system's PATH.\n# For example: os.environ['PDFTK_PATH'] = '/usr/local/bin/pdftk' on macOS or '/usr/bin/pdftk' on Linux.\n# For Windows, it might be 'C:/Program Files (x86)/PDFtk/bin/pdftk.exe'\n\n# Create a dummy PDF file for demonstration (in a real scenario, this would be an existing PDF form)\n# This example can't create a fillable PDF, so it will demonstrate other functions.\n# We'll use get_num_pages and concat for a runnable example.\n\n# Create a dummy PDF file (simplified for quickstart, typically this would be a pre-existing PDF)\n# In a real scenario, you'd use an actual PDF path.\ndummy_pdf_content = b'%PDF-1.4\\n1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj 3 0 obj<</Type/Page/Parent 2 0 R/MediaBox[0 0 612 792]/Contents 4 0 R>>endobj 4 0 obj<</Length 16>>stream\\nBT /F1 12 Tf 100 700 Td (Hello PyPDFtk!) Tj ET\\nendstream\\nendobj\\nxref\\n0 5\\n0000000000 65535 f\\n0000000009 00000 n\\n0000000055 00000 n\\n0000000107 00000 n\\n0000000194 00000 n\\ntrailer<</Size 5/Root 1 0 R>>startxref\\n240\\n%%EOF'\n\nwith tempfile.NamedTemporaryFile(suffix=\".pdf\", delete=False) as f1:\n    f1.write(dummy_pdf_content)\n    pdf_path1 = f1.name\n\nwith tempfile.NamedTemporaryFile(suffix=\".pdf\", delete=False) as f2:\n    f2.write(dummy_pdf_content)\n    pdf_path2 = f2.name\n\ntry:\n    # Get number of pages\n    num_pages = pypdftk.get_num_pages(pdf_path1)\n    print(f\"Number of pages in {pdf_path1}: {num_pages}\")\n\n    # Concatenate two dummy PDFs\n    output_concat_pdf = pypdftk.concat([pdf_path1, pdf_path2])\n    print(f\"Concatenated PDFs to: {output_concat_pdf}\")\n\n    # Example of filling a form (requires a real fillable PDF and pdftk to be correctly configured)\n    # To run this, replace 'path/to/model.pdf' with a path to an actual fillable PDF\n    # and ensure PDFTK_PATH is correctly set.\n    # datas = {'firstname': 'John', 'lastname': 'Doe'}\n    # try:\n    #     filled_pdf = pypdftk.fill_form('path/to/model.pdf', datas)\n    #     print(f\"Filled form saved to: {filled_pdf}\")\n    # except Exception as e:\n    #     print(f\"Could not fill form (requires a real fillable PDF and pdftk setup): {e}\")\n\nfinally:\n    # Clean up temporary files\n    os.remove(pdf_path1)\n    os.remove(pdf_path2)\n    if 'output_concat_pdf' in locals() and os.path.exists(output_concat_pdf):\n        os.remove(output_concat_pdf)\n    # if 'filled_pdf' in locals() and os.path.exists(filled_pdf):\n    #     os.remove(filled_pdf)\n","lang":"python","description":"This quickstart demonstrates basic operations like getting the number of pages and concatenating PDFs using `pypdftk`. It highlights the necessity of the `pdftk` binary and provides comments on how to set `PDFTK_PATH`. A form-filling example is commented out as it requires a specific fillable PDF and proper `pdftk` configuration.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-15","installed_version":"0.5","pypi_latest":"0.5","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.4,"avg_import_s":0.04,"wheel_type":"sdist"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":0.03,"mem_mb":1.6,"disk_size":"19.2M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":2.1,"import_time_s":0.02,"mem_mb":1.6,"disk_size":"20M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":0.06,"mem_mb":1.9,"disk_size":"21.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":2,"import_time_s":0.05,"mem_mb":1.9,"disk_size":"22M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":0.04,"mem_mb":1.9,"disk_size":"11.5M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":3,"import_time_s":0.05,"mem_mb":1.9,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":0.05,"mem_mb":2,"disk_size":"11.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":2.6,"import_time_s":0.04,"mem_mb":1.8,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":0.03,"mem_mb":1.5,"disk_size":"18.8M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pypdftk","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"noisy","install_time_s":2.3,"import_time_s":0.02,"mem_mb":1.6,"disk_size":"19M"}]}}