توقيع مستندات PDF من بطاقة ذكية في Java

المستودع الحالي لجافا لا يتضمن مثالًا مخصصًا لتوقيع بطاقة ذكية مدعوم بالمصدر تحت facades/pdffilesignature، ولكن سير العمل التالي يُظهر نمط API النموذجي لتوقيع ملف PDF باستخدام شهادة مختارة من مخزن الشهادات المحلي.

توقيع مستند PDF باستخدام بطاقة ذكية

  1. افتح PDF المصدر Document.
  2. أنشئ كائنًا من الفئة PdfFileSignature facade وربط مستند PDF المصدر.
  3. استرجع الشهادة المحلية وأنشئ المطلوب ExternalSignature.
  4. هيّئ مظهر التوقيع البصري والهدف Rectangle.
  5. طبّق التوقيع على مستند PDF عبر PdfFileSignature.
  6. احفظ مستند PDF المحدث.
  7. اربط المستند المحمَّل بـ واجهة PdfFileSignature مع bindPdf(...).
  8. استرجع الشهادة المحلية التي تمثل اعتماد البطاقة الذكية عن طريق الاستدعاء getLocalCertificate().
  9. تحقّق مما إذا تم العثور على شهادة. إذا لم يتم العثور عليها، احفظ ملف الإخراج غير المعدل وأوقف سير العمل.
  10. أنشئ كائنًا من الفئة ExternalSignature من الشهادة المحددة.
  11. عيّن صورة مظهر التوقيع البصري باستخدام setSignatureAppearance(...).
  12. استدعِ sign(...) مع الصفحة المستهدفة، السبب، جهة الاتصال، الموقع، علامة الرؤية، التوقيع Rectangle، وكائن التوقيع الخارجي.
  13. احفظ ملف PDF الموقع إلى مسار الإخراج.
public static void signWithSmartCard(Path inputFile, Path outputFile, Path pngFile) {
    try (Document document = new Document(inputFile.toString());
            PdfFileSignature pdfSignature = new PdfFileSignature()) {
        pdfSignature.bindPdf(document);
        X509Certificate2 selectedCertificate = getLocalCertificate();
        if (selectedCertificate == null) {
            System.out.println("Local certificate was not found.");
            document.save(outputFile.toString());
            return;
        }

        ExternalSignature externalSignature = new ExternalSignature(selectedCertificate, null);
        pdfSignature.setSignatureAppearance(pngFile.toString());
        pdfSignature.sign(1, "Reason", "Contact", "Location", true,
                new java.awt.Rectangle(100, 100, 200, 200), externalSignature);
        pdfSignature.save(outputFile.toString());
    }
}