{"id":13473334,"url":"https://github.com/py-pdf/pypdf","last_synced_at":"2026-01-15T22:19:54.038Z","repository":{"id":2172819,"uuid":"3119517","full_name":"py-pdf/pypdf","owner":"py-pdf","description":"A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files","archived":false,"fork":false,"pushed_at":"2026-01-12T07:23:13.000Z","size":26039,"stargazers_count":9729,"open_issues_count":121,"forks_count":1534,"subscribers_count":143,"default_branch":"main","last_synced_at":"2026-01-13T03:35:51.089Z","etag":null,"topics":["help-wanted","pdf","pdf-documents","pdf-manipulation","pdf-parser","pdf-parsing","pypdf2","python"],"latest_commit_sha":null,"homepage":"https://pypdf.readthedocs.io/en/latest/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/py-pdf.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2012-01-06T17:13:38.000Z","updated_at":"2026-01-12T19:36:32.000Z","dependencies_parsed_at":"2023-09-26T22:27:18.098Z","dependency_job_id":"17ccac5d-066a-4105-9fc2-eed98d31ef0d","html_url":"https://github.com/py-pdf/pypdf","commit_stats":{"total_commits":1638,"total_committers":246,"mean_commits":6.658536585365853,"dds":0.5628815628815629,"last_synced_commit":"9f647e696b64f34262a637b77f9a7e89d75a22f4"},"previous_names":["py-pdf/pypdf2","mstamy2/pypdf2"],"tags_count":135,"template":false,"template_full_name":null,"purl":"pkg:github/py-pdf/pypdf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/py-pdf%2Fpypdf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/py-pdf%2Fpypdf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/py-pdf%2Fpypdf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/py-pdf%2Fpypdf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/py-pdf","download_url":"https://codeload.github.com/py-pdf/pypdf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/py-pdf%2Fpypdf/sbom","scorecard":{"id":502103,"data":{"date":"2025-08-11","repo":{"name":"github.com/py-pdf/pypdf","commit":"38e4a8cff287e466fc37d4cf350fff240f3a2cac"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":6.8,"checks":[{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: .github/SECURITY.md:1","Info: Found linked content: .github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: .github/SECURITY.md:1","Info: Found text in security policy: .github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 27 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":5,"reason":"Found 14/28 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: topLevel 'contents' permission set to 'write': .github/workflows/benchmark.yaml:8","Warn: topLevel 'deployments' permission set to 'write': .github/workflows/benchmark.yaml:9","Warn: topLevel 'contents' permission set to 'write': .github/workflows/create-github-release.yaml:10","Warn: no topLevel permission defined: .github/workflows/github-ci.yaml:1","Warn: no topLevel permission defined: .github/workflows/publish-to-pypi.yaml:1","Warn: topLevel 'contents' permission set to 'write': .github/workflows/release.yaml:13","Warn: no topLevel permission defined: .github/workflows/title-check.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/benchmark.yaml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/benchmark.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/benchmark.yaml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/benchmark.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/benchmark.yaml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/benchmark.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/create-github-release.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/create-github-release.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/create-github-release.yaml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/create-github-release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:225: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:226: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:233: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:253: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:75: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:80: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:85: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:92: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:146: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:158: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:162: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:197: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/github-ci.yaml:198: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/github-ci.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yaml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/publish-to-pypi.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yaml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/publish-to-pypi.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yaml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/publish-to-pypi.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yaml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/publish-to-pypi.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-to-pypi.yaml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/publish-to-pypi.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yaml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/release.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/title-check.yaml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/py-pdf/pypdf/title-check.yaml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/benchmark.yaml:29","Warn: pipCommand not pinned by hash: .github/workflows/benchmark.yaml:32","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:101","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:104","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:108","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:115","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:119","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:123","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:169","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:172","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:175","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:185","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:189","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:203","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:214","Warn: pipCommand not pinned by hash: .github/workflows/github-ci.yaml:232","Warn: pipCommand not pinned by hash: .github/workflows/publish-to-pypi.yaml:22","Info:   0 out of  23 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of  17 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: OSSFuzz integration found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":6,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: required approving review count is 1 on branch 'main'","Warn: codeowners review is not required on branch 'main'","Warn: no status checks found to merge onto branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish-to-pypi.yaml:34"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 27 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T22:11:48.223Z","repository_id":2172819,"created_at":"2025-08-19T22:11:48.223Z","updated_at":"2025-08-19T22:11:48.223Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28472626,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T22:13:38.078Z","status":"ssl_error","status_checked_at":"2026-01-15T22:12:11.737Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["help-wanted","pdf","pdf-documents","pdf-manipulation","pdf-parser","pdf-parsing","pypdf2","python"],"created_at":"2024-07-31T16:01:02.762Z","updated_at":"2026-01-15T22:19:54.018Z","avatar_url":"https://github.com/py-pdf.png","language":"Python","readme":"[![PyPI version](https://badge.fury.io/py/pypdf.svg)](https://badge.fury.io/py/pypdf)\n[![Python Support](https://img.shields.io/pypi/pyversions/pypdf.svg)](https://pypi.org/project/pypdf/)\n[![](https://img.shields.io/badge/-documentation-green)](https://pypdf.readthedocs.io/en/stable/)\n[![GitHub last commit](https://img.shields.io/github/last-commit/py-pdf/pypdf)](https://github.com/py-pdf/pypdf)\n[![codecov](https://codecov.io/gh/py-pdf/pypdf/branch/main/graph/badge.svg?token=id42cGNZ5Z)](https://codecov.io/gh/py-pdf/pypdf)\n\n# pypdf\n\npypdf is a free and open-source pure-python PDF library capable of splitting,\n[merging](https://pypdf.readthedocs.io/en/stable/user/merging-pdfs.html),\n[cropping, and transforming](https://pypdf.readthedocs.io/en/stable/user/cropping-and-transforming.html)\nthe pages of PDF files. It can also add\ncustom data, viewing options, and\n[passwords](https://pypdf.readthedocs.io/en/stable/user/encryption-decryption.html)\nto PDF files. pypdf can\n[retrieve text](https://pypdf.readthedocs.io/en/stable/user/extract-text.html)\nand\n[metadata](https://pypdf.readthedocs.io/en/stable/user/metadata.html)\nfrom PDFs as well.\n\nSee [pdfly](https://github.com/py-pdf/pdfly) for a CLI application that uses pypdf to interact with PDFs.\n\n## Installation\n\nInstall pypdf using pip:\n\n```\npip install pypdf\n```\n\nFor using pypdf with AES encryption or decryption, install extra dependencies:\n\n```\npip install pypdf[crypto]\n```\n\n\u003e **NOTE**: `pypdf` 3.1.0 and above include significant improvements compared to\n\u003e previous versions. Please refer to [the migration\n\u003e guide](https://pypdf.readthedocs.io/en/latest/user/migration-1-to-2.html) for\n\u003e more information.\n\n## Usage\n\n```python\nfrom pypdf import PdfReader\n\nreader = PdfReader(\"example.pdf\")\nnumber_of_pages = len(reader.pages)\npage = reader.pages[0]\ntext = page.extract_text()\n```\n\npypdf can do a lot more, e.g. splitting, merging, reading and creating annotations, decrypting and encrypting. Check out the\n[documentation](https://pypdf.readthedocs.io/en/stable/) for additional usage\nexamples!\n\nFor questions and answers, visit\n[StackOverflow](https://stackoverflow.com/questions/tagged/pypdf)\n(tagged with [pypdf](https://stackoverflow.com/questions/tagged/pypdf)).\n\n## Contributions\n\nMaintaining pypdf is a collaborative effort. You can support the project by\nwriting documentation, helping to narrow down issues, and submitting code.\nSee the [CONTRIBUTING.md](https://github.com/py-pdf/pypdf/blob/main/CONTRIBUTING.md) file for more information.\n\n### Q\u0026A\n\nThe experience pypdf users have covers the whole range from beginner to expert. You can contribute to the pypdf community by answering questions\non [StackOverflow](https://stackoverflow.com/questions/tagged/pypdf),\nhelping in [discussions](https://github.com/py-pdf/pypdf/discussions),\nand asking users who report issues for [MCVE](https://stackoverflow.com/help/minimal-reproducible-example)'s (Code + example PDF!).\n\n\n### Issues\n\nA good bug ticket includes a MCVE - a minimal complete verifiable example.\nFor pypdf, this means that you must upload a PDF that causes the bug to occur\nas well as the code you're executing with all of the output. Use\n`print(pypdf.__version__)` to tell us which version you're using.\n\n### Code\n\nAll code contributions are welcome, but smaller ones have a better chance to\nget included in a timely manner. Adding unit tests for new features or test\ncases for bugs you've fixed help us to ensure that the Pull Request (PR) is fine.\n\npypdf includes a test suite which can be executed with `pytest`:\n\n```bash\n$ pytest\n===================== test session starts =====================\nplatform linux -- Python 3.6.15, pytest-7.0.1, pluggy-1.0.0\nrootdir: /home/moose/GitHub/Martin/pypdf\nplugins: cov-3.0.0\ncollected 233 items\n\ntests/test_basic_features.py ..                         [  0%]\ntests/test_constants.py .                               [  1%]\ntests/test_filters.py .................x.....           [ 11%]\ntests/test_generic.py ................................. [ 25%]\n.............                                           [ 30%]\ntests/test_javascript.py ..                             [ 31%]\ntests/test_merger.py .                                  [ 32%]\ntests/test_page.py .........................            [ 42%]\ntests/test_pagerange.py ................                [ 49%]\ntests/test_papersizes.py ..................             [ 57%]\ntests/test_reader.py .................................. [ 72%]\n...............                                         [ 78%]\ntests/test_utils.py ....................                [ 87%]\ntests/test_workflows.py ..........                      [ 91%]\ntests/test_writer.py .................                  [ 98%]\ntests/test_xmp.py ...                                   [100%]\n\n========== 232 passed, 1 xfailed, 1 warning in 4.52s ==========\n```\n","funding_links":[],"categories":["Python","python","File Format Processing"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpy-pdf%2Fpypdf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpy-pdf%2Fpypdf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpy-pdf%2Fpypdf/lists"}