Einführung
Wenn eine Rechtsabteilung mehrere Vertrags‑PDFs erhält, fügt jeder Prüfer häufig sein eigenes Passwort hinzu, um vertrauliche Klauseln zu schützen. Das Zusammenführen dieser Dateien zu einem einzigen Ordner wird zum Albtraum, weil die Passwörter unterschiedlich sind und die Dateien nicht direkt zusammengeführt werden können. Das manuelle Entschlüsseln ist zeitaufwändig und fehleranfällig, besonders wenn es um Dutzende von PDFs geht.
Password‑Merge ist ein GroupDocs.Merger‑Workflow für Java, der heterogene PDFs entsperrt und das zusammengeführte Ergebnis mit einem einzigen Kennwort erneut schützt. Dieses Tutorial führt durch das Erkennen geschützter PDFs, das Entsperren, das Zusammenführen des Inhalts und optional das Rotieren des einheitlichen Passworts.
Sie lernen, wie Sie die Merger‑API konfigurieren, Byte‑Streams verarbeiten und ein sicheres kombiniertes PDF in weniger als 30 Zeilen Java‑Code erzeugen.
Wann sollte ich passwortgeschützte PDFs zusammenführen?
Das Zusammenführen passwortgeschützter PDFs ist sinnvoll, sobald Sie ein einziges, durchsuchbares Archiv benötigen, das Sicherheitsrichtlinien einhält und gleichzeitig den Aufwand für die Handhabung mehrerer Passwörter eliminiert. Typische Szenarien sind Quartals‑Finanzbericht‑Bündel, Vertragsordner für Audits und juristische Fallakten, bei denen jeder Beitragende ein anderes Passwort verwendet hat. Durch das programmgesteuerte Entsperren jeder Datei und das Anwenden eines einheitlichen Passworts bleibt das Archiv sicher und die nachfolgenden Prüfprozesse werden vereinfacht. Der gesamte Vorgang kann in einer CI‑Pipeline automatisiert werden und spart Stunden manueller Arbeit.
Voraussetzungen
- Java 11 oder höher
- GroupDocs.Merger für Java 24.6+ (temporäre Lizenz)
- Ein Satz PDF‑Dateien, jeweils optional mit zugehörigem Passwort
Installation der Bibliothek via Maven:
mvn dependency:copy -Dartifact=com.groupdocs:groupdocs-merger:24.6
Schritt 1 – Erkennen, ob ein PDF passwortgeschützt ist
Bevor Sie versuchen, eine Datei zu entsperren, prüfen Sie, ob sie tatsächlich ein Passwort enthält. Das verhindert unnötige Verarbeitung und ermöglicht das Protokollieren, welche Dateien Anmeldedaten benötigen.
// Returns true if the PDF at `path` has an owner or user password
public boolean isDocumentProtected(String path, String password) {
Merger merger;
if (password == null || password.isEmpty()) {
merger = new Merger(path);
} else {
merger = new Merger(path, new LoadOptions(password));
}
try {
return merger.isPasswordSet();
} finally {
merger.dispose();
}
}
Wichtige Punkte:
LoadOptionsenthält ein bekanntes Passwort; wird keines übergeben, wird die Datei normal geöffnet.isPasswordSet()liefert true sowohl für Besitzer‑ als auch für Benutzerpasswörter.- Das
Merger‑Objekt immer mitdispose()freigeben, um native Ressourcen zu löschen.
Schritt 2 – Jede PDF entsperren und Roh‑Bytes sammeln
Iterieren Sie über eine Map, bei der der Schlüssel der Dateipfad und der Wert das zugehörige Passwort ist (null, wenn keines vorhanden). Die Methode liefert eine Liste von Byte‑Arrays, die die entsperrten PDFs repräsentieren.
public List<byte[]> unlockAll(Map<String, String> sources) throws IOException {
List<byte[]> unlocked = new ArrayList<>();
for (Map.Entry<String, String> e : sources.entrySet()) {
String path = e.getKey();
String password = e.getValue();
System.out.println("Unlocking (credentials=" +
(password != null ? "yes" : "no") + "): " + path);
if (password == null || password.isEmpty()) {
unlocked.add(Files.readAllBytes(Paths.get(path)));
} else {
LoadOptions opts = new LoadOptions(password);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
Merger m = new Merger(path, opts);
try {
m.removePassword();
m.save(buf);
} finally {
m.dispose();
}
unlocked.add(buf.toByteArray());
}
}
return unlocked;
}
Wichtige Punkte:
removePassword()entfernt den bestehenden Schutz.- Der entschlüsselte Inhalt wird in einen
ByteArrayOutputStreamgeschrieben, um ihn im Speicher zu halten. - Dateien ohne Passwort werden direkt gelesen, um den Ablauf einfach zu halten.
Schritt 3 – Die entsperrten PDFs zusammenführen und ein einheitliches Passwort anwenden
Erzeugen Sie ein Merger‑Objekt aus dem ersten PDF‑Stream und fügen Sie anschließend die übrigen Streams hinzu. Abschließend schützen Sie das kombinierte Dokument mit AddPasswordOptions.
public void mergeAndProtect(List<byte[]> unlockedPdfs,
String unifiedPassword,
String outputPath) {
InputStream first = new ByteArrayInputStream(unlockedPdfs.get(0));
Merger merger = new Merger(first);
try {
for (int i = 1; i < unlockedPdfs.size(); i++) {
merger.join(new ByteArrayInputStream(unlockedPdfs.get(i)));
}
merger.addPassword(new AddPasswordOptions(unifiedPassword));
merger.save(outputPath);
} finally {
merger.dispose();
}
System.out.println("Merged output: " + new File(outputPath).getAbsolutePath());
System.out.println("Unified password: " + unifiedPassword);
}
Wichtige Punkte:
addPasswordverschlüsselt das finale PDF mit dem angegebenen Kennwort.- Alle Vorgänge laufen im Speicher; nur die Ergebnisdatei wird auf die Festplatte geschrieben.
- Das
Merger‑Objekt nach Gebrauch freigeben.
Schritt 4 – Das Passwort eines bereits geschützten PDFs rotieren (optional)
Falls Ihre Organisation regelmäßige Passwortwechsel vorschreibt, können Sie das Kennwort aktualisieren, ohne die Quelldateien erneut zusammenzuführen.
public void rotateUnifiedPassword(String path,
String oldPassword,
String newPassword,
String outputPath) {
Merger merger = new Merger(path, new LoadOptions(oldPassword));
try {
merger.updatePassword(new UpdatePasswordOptions(newPassword));
merger.save(outputPath);
} finally {
merger.dispose();
}
System.out.println("Rotated output: " + new File(outputPath).getAbsolutePath());
System.out.println("New password: " + newPassword);
}
Wichtige Punkte:
- Laden Sie das geschützte PDF mit dem aktuellen Passwort.
updatePasswordersetzt es durch das neue Kennwort.- Dieser Vorgang ist schnell, weil der PDF‑Inhalt nicht erneut verarbeitet wird.
Praxisbeispiel
Ich stand vor dem Problem, fünf Investorenverträge zu konsolidieren, von denen jeder ein anderes Prüfer‑Passwort hatte. Mit den oben beschriebenen Schritten habe ich alle Dateien entsperrt, zu einem einzigen Ordner zusammengeführt und ein einheitliches Passwort gesetzt, das unserer Unternehmensrichtlinie entspricht. Der gesamte Vorgang dauerte auf einem normalen Laptop weniger als zwei Minuten.
Best Practices
- Passwörter frühzeitig prüfen: Nutzen Sie
isDocumentProtected, um Dateien zu markieren, die manuelle Aufmerksamkeit erfordern. - Speichernutzung begrenzen: Bei großen PDFs lieber auf die Festplatte streamen, anstatt alle Byte‑Arrays im Speicher zu halten.
- Objekte sofort freigeben: Die
Merger‑Klasse hält native Ressourcen; immerdispose()in einemfinally‑Block aufrufen. - Nur eine temporäre Lizenz für die Entwicklung verwenden; vor dem Release eine Produktionslizenz erwerben.
Fazit
GroupDocs.Merger für Java bietet eine klare API zum Entsperren, Zusammenführen und erneuten Sichern von PDF‑Sammlungen. Durch die vier Schritte – Schutz erkennen, entsperren, mit einheitlichem Passwort zusammenführen und optional das Passwort rotieren – können Sie sichere PDF‑Ordner automatisiert erstellen, ohne manuelle Eingriffe.
Nächste Schritte:
- Weitere Optionen erkunden, z. B. das Setzen von PDF‑Metadaten nach dem Merge (Dokumentation).
- Erfahren, wie man PDFs zusammenführt und dabei Lesezeichen beibehält (API‑Referenz).
- Das vollständige Beispielprojekt auf GitHub ansehen für eine sofort lauffähige Implementierung.