Wprowadzenie
Kiedy dział prawny otrzymuje wiele umów w formacie PDF, każdy recenzent często dodaje własne hasło, aby chronić poufne klauzule. Scalanie tych plików w jedną teczkę staje się koszmarem, ponieważ hasła się różnią i pliki nie mogą być łączone bezpośrednio. Ręczne odszyfrowywanie jest czasochłonne i podatne na błędy, szczególnie przy dziesiątkach dokumentów PDF.
Password‑merge to przepływ pracy GroupDocs.Merger dla Java, który odblokowuje różnorodne pliki PDF i ponownie zabezpiecza wynik scalania jednym wspólnym hasłem. Ten samouczek przeprowadza przez wykrywanie zabezpieczonych PDF‑ów, ich odblokowywanie, scalanie zawartości oraz opcjonalną rotację jednolitego hasła.
Nauczysz się, jak skonfigurować API Merger, przetwarzać strumienie bajtów i generować bezpieczny, połączony PDF w mniej niż 30 linijkach kodu Java.
Kiedy powinienem scalać pliki PDF zabezpieczone hasłem?
Scalanie plików PDF zabezpieczonych hasłem ma sens zawsze wtedy, gdy potrzebny jest jeden, przeszukiwalny archiwum, które respektuje polityki bezpieczeństwa, jednocześnie eliminując konieczność obsługi wielu haseł. Typowe scenariusze obejmują kwartalne zestawy raportów finansowych, teczki umów do audytów oraz akta spraw prawnych, w których każdy współtwórca zastosował inne hasło. Odblokowując każdy plik programowo i stosując jednolite hasło, utrzymujesz archiwum w bezpiecznym stanie i upraszczaś procesy przeglądu. Całą operację można zautomatyzować w potoku CI, oszczędzając godziny ręcznej pracy.
Wymagania wstępne
- Java 11 lub nowsza
- GroupDocs.Merger for Java 24.6+ (temporary license)
- Zestaw plików PDF, z których każdy opcjonalnie ma przypisane hasło
Zainstaluj bibliotekę za pomocą Maven:
mvn dependency:copy -Dartifact=com.groupdocs:groupdocs-merger:24.6
Krok 1 – Wykryj, czy plik PDF jest zabezpieczony hasłem
Zanim spróbujesz odblokować plik, sprawdź, czy rzeczywiście posiada on hasło. Dzięki temu unikniesz niepotrzebnego przetwarzania i będziesz mógł zalogować, które pliki wymagają poświadczeń.
// 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();
}
}
Kluczowe informacje:
LoadOptionsprzenosi znane hasło; jeśli nie zostanie podane, plik otwierany jest normalnie.isPasswordSet()zwracatruezarówno dla haseł właściciela, jak i użytkownika.- Zawsze zwalniaj instancję
Merger, aby uwolnić zasoby natywne.
Krok 2 – Odblokuj każdy PDF i zbierz surowe bajty
Iteruj po mapie, w której kluczem jest ścieżka do pliku, a wartością jego hasło (null, jeśli brak). Metoda zwraca listę tablic bajtów reprezentujących odblokowane PDF‑y.
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;
}
Kluczowe informacje:
removePassword()usuwa istniejącą ochronę.- Zdeszyfrowana zawartość jest zapisywana do
ByteArrayOutputStreamw celu obsługi w pamięci. - Pliki bez hasła są odczytywane bezpośrednio, aby uprościć przepływ.
Krok 3 – Scal odblokowane PDF‑y i zastosuj jednolite hasło
Utwórz Merger z pierwszego strumienia PDF, a następnie dołącz pozostałe strumienie. Na koniec zabezpiecz połączony dokument przy pomocy 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);
}
Kluczowe informacje:
addPasswordszyfruje finalny PDF przy użyciu podanego hasła.- Wszystkie operacje odbywają się w pamięci; na dysk zapisywany jest jedynie ostateczny plik.
- Zwalniaj
Merger, aby zwolnić uchwyty natywne.
Krok 4 – Zmień hasło w już zabezpieczonym PDF (opcjonalnie)
Jeśli Twoja organizacja wymaga okresowej rotacji haseł, możesz zaktualizować poświadczenie bez ponownego scalania plików źródłowych.
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);
}
Kluczowe informacje:
- Załaduj chroniony PDF przy użyciu bieżącego hasła.
updatePasswordzastępuje je nowym poświadczeniem.- Operacja jest szybka, ponieważ nie wymaga ponownego przetwarzania zawartości PDF‑a.
Przykładowe zastosowanie w praktyce
Spotkałem się z tym problemem, konsolidując pięć umów inwestorskich, z których każda miała inne hasło recenzenta. Korzystając z powyższych kroków, odblokowałem wszystkie pliki, scaliłem je w jedną teczkę i zastosowałem jedno hasło zgodne z naszą polityką korporacyjną. Cały proces zakończył się w mniej niż dwie minuty na standardowym laptopie.
Najlepsze praktyki
- Waliduj hasła wcześnie: użyj
isDocumentProtected, aby oznaczyć pliki wymagające ręcznej interwencji. - Ogranicz zużycie pamięci: w przypadku dużych PDF‑ów strumieniuj je na dysk zamiast trzymać wszystkie tablice bajtów w pamięci.
- Zwalniaj obiekty niezwłocznie: klasa
Mergerutrzymuje zasoby natywne; zawsze wywołujdispose()w blokufinally. - Używaj licencji tymczasowej wyłącznie w fazie rozwoju; przed wydaniem uzyskaj licencję produkcyjną.
Zakończenie
GroupDocs.Merger for Java oferuje przejrzyste API do odblokowywania, scalania i ponownego zabezpieczania kolekcji PDF‑ów. Postępując zgodnie z czterema krokami — wykrywanie ochrony, odblokowywanie, scalanie z jednolitym hasłem oraz opcjonalna rotacja tego hasła — możesz zautomatyzować tworzenie bezpiecznych teczek PDF bez ręcznej interwencji.
Kolejne kroki:
- Poznaj dodatkowe opcje, takie jak ustawianie metadanych PDF po scaleniu (documentation).
- Dowiedz się, jak scalać PDF‑y zachowując zakładki (API reference).
- Zapoznaj się z pełnym przykładem projektu na GitHubie, gotowym do uruchomienia.