💡 Tam çalışan örnek GitHub’da mevcuttur:
şifreli-pdf-ve-word-belgelerini-karsilastir-dotnet
Eski Yöntem Acı Vericiydi
İki revizyonlu bir tedarik sözleşmesi gelen kutunuza düşer. İkisi de şifre korumalıdır, her biri farklı bir şifreye sahiptir ve birinin değişiklikleri gösteren işaretli bir kopyaya ihtiyacı vardır. Sahip olduğunuz karşılaştırma kütüphanesi düz metin girdi beklediği için işlem hattına bir adım eklenir: iki dosyayı geçici bir klasöre şifre çöz, düz metin kopyalarını karşılaştır, ardından onları sil. Bu geçici klasör, belgelerin hassas olduğu için var olan iş akışının en zayıf halkası haline gelir.
Aynı sorunun daha az fark edilen bir ikinci versiyonu da vardır. Bazı ekipler geçici klasörü atlayıp şifre çözmeyi bellekte yapar; bu temizlik sorununun çözülmesini sağlar ancak format sorunu çözülmez: şifre çözme API’si formata göre değişir, bu yüzden şifreli PDF’lerin ardından şifreli elektronik tabloları desteklemek ikinci bir entegrasyon, ikinci bir kod satırı demektir.
Maliyet esas olarak şifre çözme çağrısında değil, onun etrafındaki her şeyde olur. Düz metin kopyalarının bir yere yazılması, her çıkış yolunda (başarısızlık yolları dahil) temizlenmesi ve yedeklemeler ile çökme dökümlerinden uzak tutulması gerekir. Bu şekilde üretilen fark da varsayılan olarak korumasızdır, böylece iki şifreli girdinin çıktısı zincirdeki tek dosya hâlâ herkesin açabileceği bir dosya olur.
Şifre çözme sapmasının gerçek maliyeti: bir sebeple şifrelenmiş belgelerin düz metin kopyalarını tutan geçici bir dizin, her hata yolunda doğru temizlik yapılması gerekir.
Daha İyi Bir Yol Var
Şifre korumalı karşılaştırma, .NET için bir GroupDocs.Comparison özelliğidir; şifreli PDF, DOCX, XLSX ve PPTX dosyalarını yerinde açar ve karşılaştırma sonucunu hangi şifrenin koruyacağını belirler. Şifre çözme adımı, düz metin ara dosyalar yok: şifre, belgeyle birlikte karşılaştırmaya bir LoadOptions özelliği olarak taşınır.
Başlamadan önce şunlara ihtiyacınız olacak:
- .NET 8.0 SDK veya daha yeni
- GroupDocs.Comparison 26.9.0 (geçici lisans)
- Aynı formatta iki şifreli belge ve şifreleri
Tek bir komutla kurun:
dotnet add package GroupDocs.Comparison
Yeni Yöntem: Şifreli Belgeler Doğrudan Karşılaştırıcıya
Aşağıdaki örnek iki şifreli PDF’i karşılaştırır – kaynak 1234 şifresiyle, hedef 4321 şifresiyle – ve değişiklikleri satır içi birleştirerek tek bir sonuç dosyası yazar. Şifrelerin kasıtlı olarak farklı olması, ilk hatanın burada gizlenmesinden kaynaklanır.
Adım 1 - Her belgeye kendi LoadOptions’ını ver
Bir Comparer bir kaynak ve istediği sayıda hedef tutar; her belge kendi korumasını taşır. Kaynağın şifresi yapıcıya, her hedefin şifresi ise kendi Add çağrısına verilir.
// One LoadOptions per document - the constructor's options unlock the
// source only, and never reach the targets.
using var comparer = new Comparer("source.pdf",
new LoadOptions { Password = "1234" });
comparer.Add("target.pdf", new LoadOptions { Password = "4321" });
Bu, insanları şaşırtan detaydır. Tek bir LoadOptions nesnesini yapıcıya geçirip hedefleri de kapsamasını beklemek en yaygın hatadır; başarısızlık zamanlaması nedeniyle nerede bakmanız gerektiğini size söylemez.
Adım 2 - Sonucu neyin koruyacağını belirle
CompareOptions.PasswordSaveOption çıktının korumasını seçer: None, Source, Target veya User. Varsayılan None iki şifreli girdiyi sessizce korumasız bir sonuca dönüştürür.
// Inline markup, and the result reuses the source document's password.
var options = new PdfCompareOptions
{
DisplayMode = PdfCompareOptions.ComparisonDisplayMode.Inline,
PasswordSaveOption = PasswordSaveOption.Source
};
comparer.Compare("Result/1-pdf-inline.pdf", options);
Ana noktalar:
- PasswordSaveOption:
Sourceçıktıda kaynak şifresini yeniden kullanır. Yeni bir şifre vermek içinUserveSaveOptions.Passwordseçin. - ComparisonDisplayMode:
PdfCompareOptionsiçinde iç içe bulunur ve ayrıcaSideBySideveInterleavedseçeneklerini sunar.WordCompareOptionsaynı isimde farklı değerlerle kendi enum’ını tanımlar, bu yüzden ismi tek başına kullanmak derleme hatası verir - tam adını kullanın.
Adım 3 - Çıktıyı kendi şifresiyle koru
Farkı, orijinal şifrelerden hiçbirini tutmaması gereken inceleyenlere gönderdiğinizde, PasswordSaveOption.User SaveOptions.Password değerini kullanır.
var compareOptions = new PdfCompareOptions
{
DisplayMode = PdfCompareOptions.ComparisonDisplayMode.Inline,
PasswordSaveOption = PasswordSaveOption.User
};
var saveOptions = new SaveOptions { Password = "5678" };
comparer.Compare("Result/4-own-password.pdf", saveOptions, compareOptions);
Her iki nesne de üç parametreli Compare aşırı yüklemesine gider. Tek başına SaveOptions.Password ayarlamak bir şey değiştirmez – enum değeri, kaydetme tarafı şifresini etkinleştirir. Bu çağrının sonucu 5678 ile açılır ve 1234 reddedilir.
Neden Comparer etrafındaki try/catch hatalı bir şifreyi yakalamıyor?
Çünkü yapıcı belgeyi hiç açmaz. Yolu kaydeder, Add da aynı şeyi yapar. Belgeler Compare çalıştırıldığında okunur ve o anda PasswordProtectedFileException ile mesajı Password is missing fırlatılır. Yanlış bir şifre aynı şekilde davranır: yapıcıda sessizce kabul edilir, ardından Compare sırasında reddedilir.
Dolayısıyla, karşılaştırma çağrısını koruyun, yapıcıyı değil. Bunu yavaş yoldan buldum; yapıcıyı bir try içine alıp şifreli bir dosyanın üç satır sonra başarısız olana kadar sorunsuz geçişini izledim. Depo her aşamayı yazdırıyor, bu da ilk bakışta sıralamayı netleştiriyor:
using var comparer = new Comparer("source.pdf"); // succeeds
comparer.Add("target.pdf"); // succeeds
comparer.Compare("Result/unreachable.pdf"); // throws here
Yan Yana: Önce vs. Sonra
| Önce (ilk önce şifre çöz) | Sonra (GroupDocs.Comparison) | |
|---|---|---|
| İşlem Adımları | İkisini de şifre çöz, karşılaştır, geçici kopyaları sil | Karşılaştır |
| Diskte Düz Metin | İki kopya, her hata yolunda temizlik | Yok |
| Sonuç Koruması | Ayrı bir yeniden şifreleme adımı | Tek PasswordSaveOption değeri |
| Format Kapsamı | Format başına şifre çözme aracı | PDF, DOCX, XLSX, PPTX için tek LoadOptions.Password |
| Gerekli Kod | Şifre çözme yardımcı programı ve karşılaştırma | 4 satır |
Şifreli girdiyle karşılaştırma özellikleri değişmez. Görüntüleme modları, özet sayfaları ve stil algılaması, düz dosyalar gibi aynı şekilde çalışır; koruma tamamen yükleme katmanında halledilir.
Bu katmanlama, format kapsamını ucuz tutar. LoadOptions.Password basit bir string özelliğidir ve aynı özellik PDF, DOCX, XLSX ve PPTX’i açar – Word örneğindeki yükleme kodu, PDF örneklerindekiyle karakter karakter aynıdır. Sadece seçenek sınıfı değişir, çünkü her format farklı render seçenekleri sunar. Şifreli PDF’leri zaten karşılaştıran bir koda şifreli elektronik tablo desteği eklemek, yükleme yolunda hiçbir ek maliyet getirmez.
Gerçek Dünya Örneği: Hukuk Firmaları Arasında Sözleşme Redline’ı
Bir hukuk ekibi, her revizyonu şifreli alır; şifre her değişimde döner, böylece sızan bir şifre tüm geçmişi açmaz. İnceleyen ortak, her tur için işaretli bir belgeye ihtiyaç duyar ve saklama kuralları gereği işaretli kopya korumasız bir dosya paylaşımında bulunamaz.
İki ayar bu ihtiyacı karşılar. Her belge kendi LoadOptions ile açılır, böylece şifre döndürme özel bir işleme gerek kalmaz; PasswordSaveOption.User dağıtılan her fark dosyasına kendi şifresini verir – karşılaştırmayı açan ama başka bir şeyi açmayan bir şifre.
// Word revisions, so the reviewing partner can accept or reject each edit.
var options = new WordCompareOptions
{
DisplayMode = WordCompareOptions.ComparisonDisplayMode.Revisions,
PasswordSaveOption = PasswordSaveOption.Source
};
using var comparer = new Comparer("round3.docx",
new LoadOptions { Password = "1234" });
comparer.Add("round4.docx", new LoadOptions { Password = "4321" });
comparer.Compare("Result/redline.docx", options);
GroupDocs.Comparison ile Başka Ne Yapabilirsiniz?
- İki’den fazla korumalı belgeyi karşılaştırın: Word ve sunum formatları için bir karşılaştırmaya birden fazla şifreli hedef ekleyin.
- Yerel Word revizyonları üretin:
WordCompareOptions.ComparisonDisplayMode.Revisionsdeğişiklikleri Word içinde bir inceleyen kişinin kabul edip etmeyeceğini yazar. - Harici kaynak yüklemeyi kontrol edin: bir belgenin taşıdığı uzak referansları engelleyin veya beyaz listeye alın, başka bir
LoadOptionskoruması. - Özet sayfa oluşturun:
GenerateSummaryPagesonuç belgesine bir değişiklik özeti ekler.
Sonuç
Şifre çözme sapması asla karşılaştırma ile ilgili değildi – sahip olduğunuz şeyi okuyamayan bir kütüphane ile ilgiliydi. Her belge için LoadOptions.Password ayarlamak geçici klasörü, temizlik yollarını ve zincirin sonunda ortaya çıkan korumasız farkı ortadan kaldırır. Kalan sadece üç karar: belge başına bir şifre, None varsayılanı yerine açık bir PasswordSaveOption ve hatanın gerçekten ortaya çıktığı Compare etrafında hata yönetimi.
Belge iş akışınızı otomatikleştirmeye hazır mısınız?
- Ücretsiz API denemesini deneyin
- Şifre korumalı belgeleri yüklemeyi keşfedin
- Korunan belgeler için tam karşılaştırma kılavuzunu okuyun
- GitHub’daki örnek projeyi inceleyin