Geçersiz imza Java veren PDFBox çoklu imzası
Bazı pdf çoklu imzalama iş akışı gereksinimim vardı. Bu pdf, belgede değişiklik yapılmadan birden çok kez imzalanacak, 2 veya daha fazla kişinin aynı belgeyi imzalayabileceğini söylüyor. İmzaları iki kez pdf olarak eklemeye çalışıyorum ancak pdf'yi ikinci kez imzaladıktan sonra ilk imza geçersiz oluyor. Pdf imza oluşturmak için PDFBox Java api kullandım.
PDF Oluşturma adımları:
- Boş imza alanları adları eklenerek pdf oluşturuldu: [email protected] ve [email protected] orijinal hello.pdf kullanılarak çıktı dosya adı hello_tag.pdf çalıştır programı> TagPDFSignatureFields.java
- Hello_tag.pdf dosyasından [email protected] imza alanını alarak ilk kez imzalama, dosya adı hello_signed.pdf programı çalıştır> SignAndIdentifySignatureFields.java
- İmza alanı [email protected]'u hello_signed.pdf dosyasından alarak ikinci kez imzalama, dosya adı hello_singed2.pdf programı çalıştır> Sign2.java
2. adımda pdf doğru şekilde imzalanır ancak 3. adımdan sonra 2. adım imzalı sürüm geçersiz hale gelir ve 3. adım imzası acrobat okuyucuda olur.
Referans için lütfen Java kaynak kodunu ve pdf örneğini bulun. Google sürücü bağlantısı pdf_multi_signs_pdfbox_java
Herhangi bir yardım memnuniyetle karşılanacaktır.
Yanıtlar
Kısacası kodunuzda bir takım sorunlar var. Adobe Reader'ın ikinci bir imza ekledikten sonra ilk imzanızı geçersiz olarak işaretlemesine neden olan sorun aslında zaten TagPDFSignatureFieldsgeçersiz bir yinelenen sayfa ağacı girişi oluşturduğunuz hazırlık adımınızdadır . Adobe Reader şu anda şikayetçi olmasa da diğer sorunlar da düzeltilmelidir.
Ayrıntılı konular ...
Yinelenen Sayfa Girişi
In TagPDFSignatureFieldssenin yöntemin addEmptySignFieldşöyle başlar:
private void addEmptySignField(String[] args) throws Exception, IOException {
// Create a new document with an empty page.
try (PDDocument document = PDDocument.load(new File(args[0]));)
{
PDPage page = document.getPage(0);
document.addPage(page);
Burada öğesinin ilk sayfasını alırsınız documentve o sayfayı hemen documenttekrar eklersiniz . Bu, dosyanızdaki sayfaların kök ağaç düğümünün hello_tag.pdfşöyle görünmesine neden olur :
2 0 obj
<<
/Type /Pages
/Count 2
/Kids [6 0 R 6 0 R]
>>
endobj
Yani sayfa ağacı, Adobe Reader'ın kabul etmediği ancak kaputun altında tamir ettiği aynı sayfa nesnesini iki kez içerir. İmzalanan belgeler için Adobe Reader, bu konuda belirsiz bir şekilde uyarır:
Ve mevcut sürümlerde (örn. 2020.013.20066) Adobe Reader iki kez imzalanmış dosyadaki ilk imzayı bile bozuk olarak işaretler. Önceki sürümlerde (ör. 2019.012.20040) bunu yapmıyordu. Muhtemelen bu, Gölge Saldırıları yayınlandıktan sonra doğrulama kodunun sertleşmesinin bir etkisidir.
Bir kenara: İmzalanmış bir belgeyi değiştirmenin (form doldurma, yeniden imzalama, ...) eski imzaları bozduğu bir durum varsa, her zaman orijinal belgede sorun olup olmadığını da kontrol edin. İmzalı bir belgeye uygulanan değişikliklere izin verilip verilmediğinin kontrolü, aksi takdirde başlık altında sabitlenen ve dolayısıyla görünmeyen hatalara karşı oldukça hassastır.
Geçersiz Kısmi Alan Adları
E-posta adreslerini alan adları olarak kullanırsınız [email protected]ve [email protected]örneğinizde:
signatureField.setPartialName("[email protected]");
...
signatureField1.setPartialName("[email protected]");
( TagPDFSignatureFieldsyöntem addEmptySignField)
Bu kısmi alan adları geçersizdir, kısmi alan adları nokta karakterleri (".") İçermemelidir.
PDFBox gelecekteki sürümlerde bunu önlemeye çalışacaktır, bkz. PDFBOX-5028 .
İmzalamadan Sonra Varsayılan Kaynakları ve Varsayılan Görünümleri Ayarlama
İmzalama sırasında, varsayılan kaynakları ve AcroForm sözlüğünün varsayılan görünümünü ayarlarsınız :
acroForm.setDefaultResources(resources);
...
acroForm.setDefaultAppearance(defaultAppearanceString);
( SignAndIdentifySignatureFieldsve Sign2yöntem addEmptySignField)
Kendi başına bu kötü bir şey değildir, ancak dikkatli olun, bunu zaten bu tür girişlere sahip önceden imzalanmış bir dosyaya yaparsanız ve bunları öncekinden farklı değerlere ayarlarsanız, bu önceki imzayı geçersiz kılabilir, burada yanıtlanan soruna bakın .
Gereksiz PDF Sürümünü Ayarlama
Belgenin talep edilen PDF sürümünü değiştirmeye çalışıyorsunuz:
document.setVersion(1.0f);
( SignAndIdentifySignatureFieldsyöntem addEmptySignField)
document.setVersion(2.0f);
( Sign2yöntem addEmptySignField)
Dokümanın kendisi zaten en az 1.5 versiyonunu gerektirdiğinden ilk talimat yok sayılır, ancak ikinci talimat gerçekten de dokümanın PDF versiyonunu 2.0 olarak ayarlar ve bu da daha eski izleyicilerde sorunlara neden olabilir.
...
Büyük olasılıkla daha fazla sorun vardır. İlk imzayı, Yinelenen Sayfa Girişini halihazırda düzeltmenin ilk imzayı iyileştirmeye yettiğini fark etmeden önce bu sorunları yalnızca ilk olarak tespit ettim ...