Introduction
Bir hukuk departmanı birden fazla sözleşme PDF’si aldığında, her inceleyen genellikle gizli maddeleri korumak için kendi şifresini ekler. Bu dosyaları tek bir klasörde birleştirmek, şifrelerin farklı olması ve dosyaların doğrudan birleştirilememesi nedeniyle bir kabusa dönüşür. Şifreleri manuel olarak çözmek zaman alıcı ve hata yapmaya açıktır; özellikle onlarca PDF ile çalışırken bu sorun daha da belirginleşir.
Password‑merge, Java için bir GroupDocs.Merger iş akışıdır; farklı şifreli PDF’leri açar ve birleştirilmiş sonuca tek bir kimlik bilgisiyle yeniden koruma ekler. Bu öğreticide, korumalı PDF’lerin nasıl tespit edileceği, nasıl açılacağı, içeriğin nasıl birleştirileceği ve isteğe bağlı olarak birleşik şifrenin nasıl döndürüleceği adım adım gösterilmektedir.
Bu rehberde, Merger API’sinin nasıl yapılandırılacağını, bayt akışlarının nasıl işleneceğini ve 30 satırdan az Java kodu ile güvenli birleştirilmiş PDF’nin nasıl üretileceğini öğreneceksiniz.
When should I merge password‑protected PDFs?
Şifre korumalı PDF’leri birleştirmek, birden fazla şifreyi yönetme yükünü ortadan kaldırırken güvenlik politikalarına uygun, tek bir aranabilir arşiv oluşturmanız gerektiğinde mantıklı bir çözümdür. Tipik senaryolar arasında çeyrek dönem finansal rapor paketleri, denetimler için sözleşme klasörleri ve her katılımcının farklı bir şifre uyguladığı hukuk dosyaları bulunur. Her dosyayı programlı olarak açıp tek bir şifreyle koruyarak arşivi güvenli tutar ve sonraki inceleme süreçlerini basitleştirirsiniz. Bu işlem bir CI boru hattında otomatikleştirilebilir ve saatler süren manuel çalışmayı tasarruf ettirir.
Prerequisites
- Java 11 veya üzeri
- GroupDocs.Merger for Java 24.6+ (temporary license)
- Her biri isteğe bağlı olarak şifreyle eşleşen bir PDF dosyası seti
Kütüphaneyi Maven üzerinden kurun:
mvn dependency:copy -Dartifact=com.groupdocs:groupdocs-merger:24.6
Step 1 – Detect if a PDF is password‑protected
Bir dosyayı açmaya çalışmadan önce, gerçekten şifreli olup olmadığını kontrol edin. Bu, gereksiz işleme yol açmaz ve hangi dosyaların kimlik bilgisi gerektirdiğini kaydetmenizi sağlar.
// 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();
}
}
Key points:
LoadOptionsbilinen bir şifre taşır; şifre sağlanmazsa dosya normal şekilde açılır.isPasswordSet()hem sahip (owner) hem de kullanıcı (user) şifreleri için true döner.- Yerel kaynakları serbest bırakmak için
Mergerörneğini her zamandispose()ile kapatın.
Step 2 – Unlock each PDF and collect raw bytes
Anahtarının dosya yolu, değerinin ise şifresi (yoksa null) olduğu bir harita üzerinde döngü yapın. Metot, şifresi kaldırılmış PDF’leri temsil eden bayt dizileri listesini döndürür.
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;
}
Key points:
removePassword()mevcut korumayı kaldırır.- Şifresi çözülmüş içerik, bellek içinde işlemek için bir
ByteArrayOutputStreame yazılır. - Şifresi olmayan dosyalar, akışı basitleştirmek amacıyla doğrudan okunur.
Step 3 – Merge the unlocked PDFs and apply a unified password
İlk PDF akışından bir Merger oluşturun, ardından kalan akışları ekleyin. Son olarak, birleşik belgeyi AddPasswordOptions ile koruyun.
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);
}
Key points:
addPasswordson PDF’yi verilen kimlik bilgisiyle şifreler.- Tüm işlemler bellek içinde gerçekleşir; yalnızca nihai dosya diske yazılır.
- Yerel tutucuları serbest bırakmak için
Mergernesnesinidispose()ile kapatın.
Step 4 – Rotate the password on an already‑protected PDF (optional)
Kuruluşunuz periyodik şifre değişimini zorunlu kılıyorsa, kaynak dosyaları yeniden birleştirmeden kimlik bilgisini güncelleyebilirsiniz.
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);
}
Key points:
- Korunan PDF’yi mevcut şifreyle yükleyin.
updatePasswordyeni kimlik bilgisiyle değiştirir.- İçerik yeniden işlenmediği için bu işlem çok hızlıdır.
Real‑World Application
Beş yatırımcı sözleşmesini birleştirirken her birinin farklı bir inceleyen şifresi olduğunu gördüm. Yukarıdaki adımları izleyerek tüm dosyaları açtım, tek bir klasörde birleştirdim ve şirket politikamıza uygun tek bir şifre uyguladım. Tüm süreç, standart bir dizüstü bilgisayarda iki dakikadan kısa bir sürede tamamlandı.
Best Practices
- Şifreleri erken doğrulayın:
isDocumentProtectedkullanarak manuel müdahale gerektirebilecek dosyaları işaretleyin. - Bellek kullanımını sınırlayın: Büyük PDF’ler için tüm bayt dizilerini bellekte tutmak yerine akışları diske yönlendirin.
- Nesneleri zamanında serbest bırakın: Merger sınıfı yerel kaynaklar tutar; her zaman
finallybloğundadispose()çağırın. - Geçici lisansı yalnızca geliştirme için kullanın; üretim ortamına geçmeden önce bir üretim lisansı edinin.
Conclusion
GroupDocs.Merger for Java, PDF koleksiyonlarını açma, birleştirme ve yeniden güvence altına alma konusunda temiz bir API sunar. Koruma tespiti, şifre kaldırma, birleşik şifreyle birleştirme ve isteğe bağlı şifre döndürme adımlarını izleyerek, manuel müdahale olmadan güvenli PDF klasörleri oluşturabilirsiniz.
Next steps:
- Birleştirme sonrası PDF meta verilerini ayarlama gibi ek seçenekleri keşfedin (documentation).
- Yer imlerini koruyarak PDF birleştirmeyi öğrenin (API reference).
- Hazır‑çalıştır örnek uygulama için GitHub üzerindeki tam örnek projeyi inceleyin.