Seite 1 von 2
PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 14:45
von zapatas
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
VieleN Dank im Voraus !
P.S. Ich bin Noob.
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)
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 14:56
von sparrow
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'>
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 15:06
von zapatas
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.
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 15:22
von sparrow
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?
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 15:32
von __blackjack__
@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()
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 15:42
von zapatas
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 -.-
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 15:45
von sparrow
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?
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 15:48
von zapatas
Ich hatte einen Verweis auf 1.7 Tabelle 3.20 gefunden, was mir aber nur die Bits da hergibt.
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 15:53
von sparrow
Aber __blackjack__ hat doch gesagt, dass pypdf Konstanten dafür hat. Was steht denn in deren Dokumentation? Oder im Quelltext?
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 15:56
von zapatas
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
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 16:01
von __blackjack__
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.
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 16:07
von zapatas
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

. 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.
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 16:14
von zapatas
Achso: Danke euch

Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 16:15
von Sirius3
Hochauflösender Druck heißt halt als Konstante PRINT_TO_REPRESENTATION.
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 16:19
von zapatas
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()
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 16:51
von sparrow
@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.
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 16:53
von Sirius3
Drucken ohne PRINT-Flag geht offensichtlich nicht.
Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 17:12
von zapatas
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
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

Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 17:25
von zapatas
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.

Re: PyPDF2 3.0.1 Bitmuster? o0
Verfasst: Mittwoch 8. Mai 2024, 17:28
von zapatas
Kann es sein das die Kommentierfunktion nur zusammen mit Signieren und Kommentarfelder ausfüllen geht?