2014-03-04 18 views
6

Ich verwende iText, um PDF-Dateien zu erzeugen. Ich möchte die Bearbeitung der PDF-Datei verbieten, aber dem Leser erlauben, Seiten zu extrahieren. Hier ist mein Code zu setzen Verschlüsselung:Bearbeitung nicht zulassen, aber Seitenextraktion in Java erlauben iText/PDF

writer.setEncryption(null, null, 0xffffffff, PdfWriter.STANDARD_ENCRYPTION_128);

Der dritte Parameter gibt Berechtigungen. Ich benutze 0xffffffff anstelle der einzelnen iText Flags ALLOW_PRINTING usw. Dies wird iText fragen, um alles zu aktivieren. Aber das ist, was ich in der PDF-Datei erhalten:

enter image description here

Ich denke, ich sollte erlaubt sein sollte, Extraktion, aber deaktivieren Bearbeitung zu aktivieren, aber ich bin nicht sicher. Hier sind die Berechtigungen Bits pro Adobe: enter image description here enter image description here

(Von here, aber seien Sie gewarnt, es ist 30 meg)

So schalten Sie die Bits 6 und 11, sondern verlassen sich auf die anderen (vor allem die Bits 5 und 10) , und das würde die Bearbeitung ausschalten, aber die Extraktion erlauben. In jedem Fall würde ich durch die Angabe von 0xffffffff meinen, dass alles erlaubt wäre; aber stattdessen ist alles außer Extraktion erlaubt.

Ich habe den iText-Quellcode zum Festlegen von Berechtigungen überflogen und sehe nichts, was dies verursachen würde. Hier ist der relevante Code aus PdfEncryption.setupAllKeys:

permissions |= (revision == STANDARD_ENCRYPTION_128 || revision == AES_128 || revision == AES_256) ? 0xfffff0c0 
     : 0xffffffc0; 
permissions &= 0xfffffffc; 

Die erste Zeile ist eine ODER tun, und so würde keine Berechtigungen entfernen; In der zweiten Zeile werden die beiden rechts liegenden Bites gemäß der PDF-Spezifikation auf 0 gesetzt.

Ich frage mich, ob es eine iText-Sache ist, eine PDF-Sache oder ob ich etwas anderes falsch mache.

Dank

Antwort

1

Ein ähnliches Problem bereits here angehoben.

Die Verwendung von Verschlüsselung ist eigentlich kontraproduktiv, da sie nur dazu verwendet werden kann, Berechtigungen zu entfernen, nicht um sie hinzuzufügen.

Nach diesem, könnte es hilfreich sein, um vollständig die PDF zu entsperren zuerst:

PdfReader reader = new PdfReader(file.toURI().toURL()); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
    file.getAbsolutePath().replace(".pdf", "_UNLOCKED.pdf"))); 
stamper.close(); 
reader.close(); 

Danach können Sie die Ausgabe greifen und von Grund auf neu (mess around mit den Berechtigungs-Bits) beginnen. Hoffe das hilft.

BEARBEITEN: Wenn Sie keinen Zugriff auf das Passwort haben, kann die iText sources geändert werden. Einfach if (!reader.isOpenedWithFullPermissions()) throw ... (Zeile 121 und 122 in Version 5.5.0) in com.itextpdf.text.pdf.PdfStamperImp auskommentieren.

+1

* Einfach auskommen Zeile 121 und 122 * - Ich nehme an, Sie meinen die Zeilen 'if (! Reader.isOpenedWithFullPermissions()) werfen ...'. Diese Änderung ist ** nicht ** notwendig, vgl. [diese Antwort] (http://stackoverflow.com/questions/17666577/opening-password-protected-pdf-file-with-itextsharp/17694943#17694943), setze einfach 'PdfReader.unethicalreading = true', nachdem du dich vergewissert hast sind in der Tat berechtigt, die mit dem Passwortschutz verbundenen Einschränkungen zu ignorieren. – mkl

+0

Danke für den Hinweis @mkl. Leider erlaubt dies ** nicht ** "Ändern des Dokuments", "Dokument Assembly", "Content Copying" und "Page Extraction" (was ändert die Quellen). Zumindest habe ich das erlebt. – beatngu13

+0

Das würde überraschen, da beide im Wesentlichen dasselbe tun, beide verhindern die Ausnahme. – mkl

Verwandte Themen