Pendahuluan
Ketika departemen hukum menerima banyak PDF kontrak, setiap reviewer biasanya menambahkan kata sandi mereka sendiri untuk melindungi klausul rahasia. Mengkonsolidasikan file‑file ini menjadi satu binder menjadi mimpi buruk karena kata sandi berbeda‑beda dan file tidak dapat digabungkan secara langsung. Dekripsi manual memakan waktu dan rawan kesalahan, terutama ketika harus menangani puluhan PDF.
Password‑merge adalah alur kerja GroupDocs.Merger untuk Java yang membuka kunci PDF heterogen dan melindungi kembali hasil gabungan dengan satu kredensial. Tutorial ini menjelaskan cara mendeteksi PDF yang dilindungi, membuka kuncinya, menggabungkan kontennya, dan secara opsional memutar ulang kata sandi terpadu.
Anda akan belajar cara mengonfigurasi API Merger, memproses aliran byte, dan menghasilkan PDF gabungan yang aman dalam kurang dari 30 baris kode Java.
Kapan saya harus menggabungkan PDF yang dilindungi kata sandi?
Menggabungkan PDF yang dilindungi kata sandi masuk akal setiap kali Anda membutuhkan arsip tunggal yang dapat dicari, yang menghormati kebijakan keamanan sambil menghilangkan beban menangani banyak kata sandi. Skenario tipikal meliputi bundel laporan keuangan kuartalan, binder kontrak untuk audit, dan berkas kasus hukum di mana setiap kontributor menerapkan kata sandi yang berbeda. Dengan membuka setiap file secara programatis dan menerapkan kata sandi terpadu, Anda menjaga keamanan arsip dan menyederhanakan proses peninjauan selanjutnya. Seluruh operasi dapat diotomatisasi dalam pipeline CI, menghemat jam kerja manual.
Prasyarat
- Java 11 atau lebih baru
- GroupDocs.Merger untuk Java 24.6+ (temporary license)
- Sekumpulan file PDF, masing‑masing opsional dipasangkan dengan kata sandinya
Pasang pustaka melalui Maven:
mvn dependency:copy -Dartifact=com.groupdocs:groupdocs-merger:24.6
Langkah 1 – Deteksi apakah PDF dilindungi kata sandi
Sebelum mencoba membuka kunci file, periksa apakah file tersebut memang memiliki kata sandi. Ini menghindari pemrosesan yang tidak perlu dan memungkinkan Anda mencatat file mana yang memerlukan kredensial.
// 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();
}
}
Poin penting:
LoadOptionsmembawa kata sandi yang diketahui; jika tidak ada, file dibuka secara normal.isPasswordSet()mengembalikan true untuk kata sandi pemilik maupun pengguna.- Selalu dispose instance
Mergeruntuk membebaskan sumber daya native.
Langkah 2 – Buka kunci setiap PDF dan kumpulkan byte mentah
Iterasi melalui peta di mana kunci adalah jalur file dan nilai adalah kata sandinya (null jika tidak ada). Metode ini mengembalikan daftar array byte yang mewakili PDF yang telah dibuka kuncinya.
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;
}
Poin penting:
removePassword()menghapus perlindungan yang ada.- Konten yang telah didekripsi ditulis ke
ByteArrayOutputStreamuntuk penanganan dalam memori. - File tanpa kata sandi dibaca langsung untuk menjaga alur tetap sederhana.
Langkah 3 – Gabungkan PDF yang telah dibuka kuncinya dan terapkan kata sandi terpadu
Buat Merger dari aliran PDF pertama, lalu gabungkan aliran-aliran sisanya. Akhirnya, lindungi dokumen gabungan dengan 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);
}
Poin penting:
addPasswordmengenkripsi PDF akhir dengan kredensial yang diberikan.- Semua operasi terjadi dalam memori; hanya file akhir yang ditulis ke disk.
- Dispose
Mergeruntuk melepaskan handle native.
Langkah 4 – Putar ulang kata sandi pada PDF yang sudah dilindungi (opsional)
Jika organisasi Anda menerapkan rotasi kata sandi secara berkala, Anda dapat memperbarui kredensial tanpa menggabungkan ulang file sumber.
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);
}
Poin penting:
- Muat PDF yang dilindungi dengan kata sandi saat ini.
updatePasswordmenggantinya dengan kredensial baru.- Operasi ini cepat karena tidak memproses ulang konten PDF.
Aplikasi Dunia Nyata
Saya mengalami hal ini saat mengkonsolidasikan lima kontrak investor yang masing‑masing memiliki kata sandi reviewer berbeda. Dengan mengikuti langkah‑langkah di atas, saya membuka semua file, menggabungkannya menjadi satu binder, dan menerapkan satu kata sandi yang sesuai dengan kebijakan perusahaan kami. Seluruh proses selesai dalam kurang dari dua menit pada laptop standar.
Praktik Terbaik
- Validasi kata sandi lebih awal: Gunakan
isDocumentProtecteduntuk menandai file yang mungkin memerlukan perhatian manual. - Batasi penggunaan memori: Untuk PDF besar, alirkan ke disk alih‑alih menyimpan semua array byte di memori.
- Dispose objek segera: Kelas Merger menyimpan sumber daya native; selalu panggil
dispose()dalam blokfinally. - Gunakan lisensi sementara hanya untuk pengembangan; dapatkan lisensi produksi sebelum rilis.
Kesimpulan
GroupDocs.Merger untuk Java menyediakan API yang bersih untuk membuka kunci, menggabungkan, dan mengamankan kembali koleksi PDF. Dengan mengikuti empat langkah—mendeteksi perlindungan, membuka kunci, menggabungkan dengan kata sandi terpadu, dan secara opsional memutar ulang kata sandi—Anda dapat mengotomatisasi pembuatan binder PDF yang aman tanpa intervensi manual.
Langkah selanjutnya:
- Jelajahi opsi tambahan seperti mengatur metadata PDF setelah penggabungan (documentation).
- Pelajari cara menggabungkan PDF sambil mempertahankan bookmark (API reference).
- Lihat proyek contoh lengkap di GitHub untuk implementasi siap‑jalankan.