@zapatas: Also mal beim suchen helfen: Installiert wird das ja per ``pip``. Und das holt sich die Pakete aus dem „Python Package Index“. Mal auf die Seite dort schauen:
https://pypi.org/project/PyPDF2/
Da steht dann gleich am Anfang der Projektbeschreibung schon mal das `PyPDF2` mit Version 3.0.x am Ende ist und die Entwicklung mit `pypdf` weitergeht.
NOTE: The PyPDF2 project is going back to its roots. PyPDF2==3.0.X will be the last version of PyPDF2. Development will continue with pypdf==3.1.0.
Dort gibt es auch an zwei Stellen Links zur Dokumentation die tatsächlich bei readthedocs.io auf eine 404-Seite führen. Wenn man den Pfad aus der URL entfernt, kommt man noch auf die alte Dokumentation. Könnte man natürlich auch als Wink mit dem Zaunpfahl sehen, dass man das 2022 ”gestorbene” PyPDF2 vielleicht doch durch den Nachfolger `pypdf` ersetzen könnte.
``R29 = 2**28`` bedeutet das die Konstante `R29` den Wert 2²⁸ = 268435456 oder Binär 0b10000000000000000000000000000 hat. Also Bit Nummer 29 gesetzt (wenn die Zählung bei 1 anfängt.) Die Flags sind ein 32-Bit-Wert wo `UserAccessPermissions` ein Flag für jedes Bit definiert, aber es haben nicht alle Bits eine Bedeutung. Die ohne Bedeutung haben halt den Namen R und die Bitnummer. Das sie keine Bedeutung haben, muss ja niemanden davon abhalten die trotzdem zu setzen, und dann muss man die irgendwie repräsentieren können.
Was ist denn bei Python hier undurchsichtig? Das 2 hoch n eine Zahl ergibt bei der das n-te Bit gesetzt ist, und das man Bitmasken mit einem bitweisen „oder“ verknüpft, ist keine Sache von Python, das sind sprachunabhängige Grundlagen von Rechnern die intern mit Binärzahlen arbeiten.
Warum denn jetzt 0b100000 statt dem lesbareren `UserAccessPermissions.ADD_OR_MODIFY`?
Anmerkungen sind Bit 6 und da ist auch Signieren und Formularfelder ausfüllen mit drin. Einzeln gibt es das offenbar nicht.