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.
PyPDF2 3.0.1 Bitmuster? o0
- __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.
``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.
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.
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.
``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
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 Heute Abend um etwa 10 uhr hat ein weiters Noobprogramm das Licht der Welt erblickt
- 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
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.
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}")
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
- __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