Und ja, das eine Bit erlaubt halt alles, und es gibt keine Möglichkeit, das einzeln einzuschränken. Aber wenn Dein PDF keine Formulare hat, dann kann man die auch nicht editieren

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.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.
Code: Alles auswählen
from pypdf.constants import AnnotationFlag
# AnnotationFlag ist von enum.IntFlag vererbt
# int
# 1023 / 10 bit
flags_from_pdf = sum(AnnotationFlag)
# AnnotationFlag
flags_from_pdf = AnnotationFlag(flags_from_pdf)
# Drucken verbieten / xor
# Falls Drucken vorher nicht erlaubt war, dann wäre es jetzt
flags_from_pdf ^= AnnotationFlag.PRINT
# Repräsentation des Objektes ausgeben
# Sonst wird nur eine Zahl angezeigt
print(f"Flags von PDF: {flags_from_pdf!r}")
# AnnotationFlag ist iterierbar
# Falls flags_from_pdf ein int ist, gibt es einen TypeError
# int ist nicht iterierbar
if AnnotationFlag.PRINT in flags_from_pdf:
print("Drucken ist erlaubt")
# flags nicht verändern
else:
print("Drucken ist nicht erlaubt")
flags_from_pdf ^= AnnotationFlag.PRINT
print(f"\nNeue flags: {flags_from_pdf!r}")
Code: Alles auswählen
#!/usr/bin/env python3
from pypdf import PdfReader, PdfWriter
from pypdf.constants import UserAccessPermissions
def main():
with PdfWriter("output_file.pdf", PdfReader("test.pdf")) as pdf_writer:
pdf_writer.encrypt(
user_password="",
owner_password="owner_pwd",
permissions_flag=(
UserAccessPermissions.PRINT
| UserAccessPermissions.PRINT_TO_REPRESENTATION
| UserAccessPermissions.ADD_OR_MODIFY
),
)
if __name__ == "__main__":
main()