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.
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

Hallo Forenmitmenschen,

ich versuche gerade die Berechtigungen zu folgenden anzupassen:

1) Drucken hohe Auflösung erlaubt
2) Kommentieren erlaubt
3) alles andere nicht erlaubt

Die KI sagt Bit(1) (von rechts nach links zu lesen) wäre Drucken z.B, d.h. pdf_permissions_flag_bin = '0b0000000001' sollte mir das liefern oder? Tut es aber nicht. Ich bin etwas am verzweifeln. Weiß wer was der Fehler sein könnte?

Meine pdf zeigt mir mit pdf xchange 10 Berechtigungseinstellungen.

Was sagt die KI ?

"In der Regel repräsentieren die Bitmuster die verschiedenen Berechtigungseinstellungen für ein PDF-Dokument. Die Länge des Bitmusters hängt von der Anzahl der Berechtigungen ab, die von der PDF-Bibliothek oder dem Programm unterstützt werden. Wenn das Programm sagt, dass es 10 Berechtigungseinstellungen gibt, erwartest du in der Tat ein Bitmuster mit 10 Stellen, nachdem '0b' präfixiert wurde.

Hier sind einige weitere mögliche Bitmuster mit einer Länge von 10 Stellen:

'0b0000000000': Keine Berechtigung (alle Berechtigungen deaktiviert).
'0b1111111111': Vollständige Berechtigung (alle Berechtigungen aktiviert).
'0b0000000010': Drucken erlaubt.
'0b0000000100': Kopieren von Inhalten erlaubt.
'0b0000001000': Bearbeiten erlaubt.
'0b0000010000': Kommentieren und Anmerkungen hinzufügen erlaubt.
'0b0000100000': Ausfüllen von Formularen erlaubt.
'0b0001000000': Textextraktion erlaubt.
'0b0010000000': Drucken in hoher Qualität erlaubt.
'0b0100000000': Assemblieren von Dokumenten erlaubt."

'0b0000000010': Drucken erlaubt. geht z.B. so nicht, hingegen liefert '0b0000010000' Kopieren erlaubt und '0b0000100000' gleich mehrere Dinge gleichzeitig: Formulare ausfüllen, Signieren und Kommentieren :shock:

VieleN Dank im Voraus !

P.S. Ich bin Noob. :roll:

Code: Alles auswählen

import PyPDF2


with open("test.pdf", 'rb') as pdf_file:
    pdf_reader = PyPDF2.PdfReader(pdf_file)
    pdf_writer = PyPDF2.PdfWriter()


    for page_num in range(len(pdf_reader.pages)):
        pdf_writer.add_page(pdf_reader.pages[page_num])

    #Inhalt kopieren erlaubt pdf_permissions_flag_bin = '0b0000010000'
    # Formularfelder ausfüllen, Signieren und Kommentieren erlaubt pdf_permissions_flag_bin = '0b0000100000'
    pdf_permissions_flag_bin = '0b0000000001'  
    pdf_permissions_flag_int = int(pdf_permissions_flag_bin, 2)

    
    pdf_writer.encrypt(user_pwd='', owner_pwd='owner_pwd', use_128bit=True, permissions_flag=pdf_permissions_flag_int)


    with open("output_file.pdf", 'wb') as pdf_output:
        pdf_writer.write(pdf_output)
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

Ich habe keine Ahnung von Permissions bei PDF-Dateien, aber was sofort auffällt:

Code: Alles auswählen

>>> '0b0000000001' == 0b0000000001
False
>>> type('0b0000000001')
<class 'str'>
>>> type(0b0000000001)
<class 'int'>
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

Hm für einige Fälle scheint es aber "richtig" interpretiert zu werden. '0b0000010000' liefert ja "kopieren erlaubt) , wennauch nicht nach o.g. bitmusterschlüssel. Die Binärzahl wird in eine Integer umgewandelt und dann angewendet. Fasse ich die Binärzahl in den pdf_writer.encrypt ein, gehts net, weil der ne Integer will -.-. Hmmm.. Harte Nuss für mich.
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

Aus dem Beitrag werde ich nicht schlau.
Wann wird was wie interpretiert?
Irgendwo muss es doch eine Dokumentation geben. Und zwar bitte keine, die dir ein LLM her haluziniert hat. Wie ist es denn da beschrieben?
Benutzeravatar
__blackjack__
User
Beiträge: 13187
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zapatas: KIs ist nicht zu glauben. Bit 3 ist Drucken. Also ist drucken 0b100. Und das muss man auch nicht als Zeichenkette schreiben die man dann mit `int()` in eine Zahl umwandelt. Allerdings würde ich die Bits da eh nicht von Hand raussuchen und ein magisches Bitmuster in den Code schreiben. PyPDF2 hat da Konstanten für. Beispielsweise `UserAccessPermissions.PRINT` für das drucken. Ist irgendwie lesbarer als 0b100.

Sowohl `PdfReader` als auch `PdfWriter` kann man einen Dateinamen/-pfad als Argument übergeben und sich so das extra öffnen von Dateien sparen.

Das mit dem ``range(len(pdf_reader.pages))`` ist unnötig umständlich. `pages` ist iterierbar.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.constants import UserAccessPermissions


def main():
    pdf_reader = PdfReader("test.pdf")
    with PdfWriter("output_file.pdf") as pdf_writer:
        for page in pdf_reader.pages:
            pdf_writer.add_page(page)

        pdf_writer.encrypt(
            user_pwd="",
            owner_pwd="owner_pwd",
            use_128bit=True,
            permissions_flag=(
                UserAccessPermissions.PRINT
                | 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
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

Vielen Dank soweit. Ja mit KI ist schon echt schwierig und die liegt meist falsch. Hm Print liefert mir leider nur den Niedrigdruck und Add_OR_Modify setzt einige Dinge aktiv, mit MODIFY_ANNOTATIONS (für Kommentieren) und HIGH_QUALITY_PRINT komme ich leider nicht sehr weit :(. Wisst ihr was ich da tun kann? Soweit vielen Dank. Mein Problem ist leider das ich nur ab und zu mal irgendwie was mit Python zu tun habe -.-
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

Wo hast du denn diese Konstanten her?
Ich hatte das ja vorher schon erwähnt aber werde brav ignoriert: Was steht denn in der Dokumentation?
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

Ich hatte einen Verweis auf 1.7 Tabelle 3.20 gefunden, was mir aber nur die Bits da hergibt.
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

Aber __blackjack__ hat doch gesagt, dass pypdf Konstanten dafür hat. Was steht denn in deren Dokumentation? Oder im Quelltext?
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

404 Not Found

You are browsing the documentation of pypdf2. The documentation page you are looking for was not found.

Ka vermutlich mach ich irgendwas falsch o0
Benutzeravatar
__blackjack__
User
Beiträge: 13187
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also ich habe einfach in der Dokumentation von PyPDF2 nachgeschaut. Bei der `PdfWriter.encrypt()`-Methode sieht man ja, dass es diese Konstante(n) gibt, und auch welche es gibt, denn da wird ja explizit alles erlaubt in dem Defaultwert. Bei PyPDF2 muss man im Quelltext nachschauen wenn man die Definition(en) von den Konstanten sehen möchte:

Code: Alles auswählen

class UserAccessPermissions(IntFlag):
    """TABLE 3.20 User access permissions"""

    R1 = 1
    R2 = 2
    PRINT = 4
    MODIFY = 8
    EXTRACT = 16
    ADD_OR_MODIFY = 32
    R7 = 64
    R8 = 128
    FILL_FORM_FIELDS = 256
    EXTRACT_TEXT_AND_GRAPHICS = 512
    ASSEMBLE_DOC = 1024
    PRINT_TO_REPRESENTATION = 2048
    R13 = 2**12
    R14 = 2**13
    R15 = 2**14
    R16 = 2**15
    R17 = 2**16
    R18 = 2**17
    R19 = 2**18
    R20 = 2**19
    R21 = 2**20
    R22 = 2**21
    R23 = 2**22
    R24 = 2**23
    R25 = 2**24
    R26 = 2**25
    R27 = 2**26
    R28 = 2**27
    R29 = 2**28
    R30 = 2**29
    R31 = 2**30
    R32 = 2**31
Das alleine wäre vielleicht ein Grund vom veralteten `PyPDF2` auf `pypdf` umzusteigen. Da ist das `constants`-Modul auch in der Dokumentation.
“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

ICh glaub das Problem liegt u.a. darin, mal abgesehen davon das ich n Noob bin, dass ich netmal weiß wie ich die Doku vom PyPDF2 öffne, also ichn Noob bin :D. Anscheinend lande ich auf irgend ner Website, wo da halt nix mehr zu geht o0. Ähm. Die Noobs sind mit der Rhetorik einfach etwas oder etwas mehr überfordert nehme ich an. Ich wüsst netmal das PyPDF2 jetzt der alte Shit ist und papdf das neue. Ich weiß auch leider nicht was jetzt R29 = 2**28 etc. bedeuten soll. Und leider auch nicht, ob nun ich überhaupt noch PyPDF2 nutzen kann oder net. Ich will einfach nur hochauflösenden Druck und Kommentierfunktion zulassen und brauch den ganzen Tag dafür. Puh Noob sein is hart. Dazu kommt diese Undurchsichtigkeit irgendwie von python. ICh sollt mir vllt. mal nen Kurs suchen oder so, also der die Basics zu Doku, Anwendung von Funktionen etc. erklärt. Ki ist irgendwie scheiße. Damit kann man Glück haben, muss aber net.
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

Achso: Danke euch :)
Sirius3
User
Beiträge: 17792
Registriert: Sonntag 21. Oktober 2012, 17:20

Hochauflösender Druck heißt halt als Konstante PRINT_TO_REPRESENTATION.
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

Huhu Sirius. Das hab ich versucht. Macht der leider nicht. Dann bekomme ich unter Drucken: nicht erlaubt. Und mir scheint das Kommentieren gar nicht dfabei ist oder es ist vielleicht eine dieser "R"

Code: Alles auswählen

#!/usr/bin/env python3
from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.constants import UserAccessPermissions


def main():
    pdf_reader = PdfReader("test.pdf")
    with PdfWriter("output_file.pdf") as pdf_writer:
        for page in pdf_reader.pages:
            pdf_writer.add_page(page)

        pdf_writer.encrypt(
            user_pwd="",
            owner_pwd="owner_pwd",
            use_128bit=True,
            permissions_flag=(
                UserAccessPermissions.PRINT_TO_REPRESENTATION
            ),
        )


if __name__ == "__main__":
    main()
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

@zapatas: Mein Google ist so gut wie dein Google. Also schauen wir mal.
"pdf reference" -> Findet die Referenz von Adobe.
STRG+F -> Suchen "User permissions". Man findet Kapitel 3.15. Und darin die ausführliche Beschreibung der Bits.

Und ja, es reicht nicht das Bit für "High Quality Printing" zu setzen, wenn man das Bit für "Drucken erlaubt" nicht setzt.
Sirius3
User
Beiträge: 17792
Registriert: Sonntag 21. Oktober 2012, 17:20

Drucken ohne PRINT-Flag geht offensichtlich nicht.
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

sparrow hat geschrieben: Mittwoch 8. Mai 2024, 16:51 @zapatas: Mein Google ist so gut wie dein Google. Also schauen wir mal.
"pdf reference" -> Findet die Referenz von Adobe.
STRG+F -> Suchen "User permissions". Man findet Kapitel 3.15. Und darin die ausführliche Beschreibung der Bits.

Und ja, es reicht nicht das Bit für "High Quality Printing" zu setzen, wenn man das Bit für "Drucken erlaubt" nicht setzt.
HEy danke dir. Hm ich muss ich anscheinend echt anstellen wie son Otto. Also ich find da nur eine 3.15 Tabelle namens User access permission, aber ein Kapitel 3.15 gibts wohl nicht hm. Strg+f bringt mir bei User permissions übrigens gar nix. Wie auch immer. Es hieß ja "nutz lieber die á la UserAccessPermissions.PRINT_TO_REPRESENTATION. Hm.

Ich hab eben bissl rumgeschaut mit pypdf (nicht pypdf2). Auch hier finde ich in der Doku https://pypdf.readthedocs.io/en/latest/ ... tants.html folgende Einträge; leider keine Option für "nur Kommentieren zulassen":


R1 = 1

R2 = 2

PRINT = 4

MODIFY = 8

EXTRACT = 16

ADD_OR_MODIFY = 32

R7 = 64

R8 = 128

FILL_FORM_FIELDS = 256

EXTRACT_TEXT_AND_GRAPHICS = 512

ASSEMBLE_DOC = 1024

PRINT_TO_REPRESENTATION = 2048

R13 = 4096

R14 = 8192

R15 = 16384

R16 = 32768

R17 = 65536

R18 = 131072

R19 = 262144

R20 = 524288

R21 = 1048576

R22 = 2097152

R23 = 4194304

R24 = 8388608

R25 = 16777216

R26 = 33554432

R27 = 67108864

R28 = 134217728

R29 = 268435456

R30 = 536870912

R31 = 1073741824

R32 = 2147483648

für die Variante mit pypdf2 habe ich aber mal das angewendet was Du meintest und hab hier jetzt die hochauflösende Option enabled. Das erklärt auch wieso ich bei den Bitcodes auch mit einer Kombi 1xxxxxx1 genau das gleiche erreicht habe ^^. Leider scheiterts ind er Gesamtheit an meinen Gehirnzellen :D

Code: Alles auswählen

#!/usr/bin/env python3
from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.constants import UserAccessPermissions


def main():
    pdf_reader = PdfReader("test.pdf")
    with PdfWriter("output_file.pdf") as pdf_writer:
        for page in pdf_reader.pages:
            pdf_writer.add_page(page)

        pdf_writer.encrypt(
            user_pwd="",
            owner_pwd="owner_pwd",
            use_128bit=True,
            permissions_flag=(
                UserAccessPermissions.PRINT_TO_REPRESENTATION
                | UserAccessPermissions.PRINT # Anmerkungen bearbeiten
            ),
        )


if __name__ == "__main__":
    main()
Soweit Danke ich euch! Und für die Geduld natürlich :lol: :?
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

Hm ich habe nun folgenden code:

Code: Alles auswählen

#!/usr/bin/env python3
from PyPDF2 import PdfReader, PdfWriter
from PyPDF2.constants import UserAccessPermissions


def main():
    pdf_reader = PdfReader("test.pdf")
    with PdfWriter("output_file.pdf") as pdf_writer:
        for page in pdf_reader.pages:
            pdf_writer.add_page(page)

        pdf_writer.encrypt(
            user_pwd="",
            owner_pwd="owner_pwd",
            use_128bit=True,
            permissions_flag=(
                UserAccessPermissions.PRINT_TO_REPRESENTATION
                | UserAccessPermissions.PRINT # Anmerkungen bearbeiten
                | 0b100000
                
            ),
        )


if __name__ == "__main__":
    main()
Und das bringt mich doch recht nahe dran. Allerdings steht noch unter Signieren. erlaubt, Formularfelder ausfüllen: Erlaubt , Kommentieren und Drucken erlaubt ist ja bereits korrekt. :shock:
zapatas
User
Beiträge: 38
Registriert: Dienstag 1. Februar 2022, 19:25

Kann es sein das die Kommentierfunktion nur zusammen mit Signieren und Kommentarfelder ausfüllen geht?
Antworten