PyPDF2 3.0.1 Bitmuster? o0

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Sirius3
User
Beiträge: 17792
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum nimmst Du jetzt schon wieder diese kryptischen 10000 statt ADD_OR_MODIFY?
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 :-) Und wenn das PDF Formulare hätte, wäre das ja auch doof, wenn man gleichzeitig verbietet, die auszufüllen.
Benutzeravatar
__blackjack__
User
Beiträge: 13189
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

Vielen Dank Euch, jetzt hab ich es etwas besser verstanden. Einzeln gibt es die offenbar nicht, genau. Das ist aber vermutlöich gar netmal schlimm. UserAccessPermissions.ADD_OR_MODIFY war nur wegen meinem rumexperimentieren da entstanden, als ich nach irgend einem Weg suchte, eben nur und ausschließlich (nebst dem hochauflösenden Druck) die "kann nur kommentieren"_Funktion zu implementieren. Aber auch im PDF-X Change geöffneten Dokument kann ich das so eben nicht auswählen. Naja, dann vermutlich, weil es einfach so ist. Danke jedenfalls :D Heute Abend um etwa 10 uhr hat ein weiters Noobprogramm das Licht der Welt erblickt :mrgreen:
Benutzeravatar
DeaD_EyE
User
Beiträge: 1030
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Bezüglich der Konstanten: https://pypdf.readthedocs.io/en/stable/ ... tationFlag

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}")
Besser erst die Standardbiliothek kennen lernen, da auch Bibliotheken die Python-Standardbibliothek exessiv nutzen, was ja auch Sinvoll ist. Da z.B. AnnotationFlag von enum.IntFlag vererbt ist, weiß man automatisch, was man damit machen kann, wenn man IntFlag kennt. Da ich früher oft im Transit warten musste, habe ich aus purer Langeweile die komplette Python-Doku durchgelesen. Mehr als einmal. Immer wieder entdeckt man neue alte Sachen, die man vergessen hat.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13189
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zapatas: Wenn man mehr als nur die Seiten übernehmen will, beispielsweise auch die Metadaten, kann man bei `pypdf` übrigens den Reader beim erstellen des Writers als Argument übergeben:

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()
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten