|
THotPDF.SignPDFWithPFX
|
Προηγούμενο Μέθοδοι AddPubKeyRecipient |
|
Υπογράφει ένα υπάρχον placeholder PDF με αρχείο PFX / PKCS#12, δημιουργεί κοντέινερ CMS SignedData και γράφει το υπογεγραμμένο PDF με μία κλήση
Σύνταξη Delphi (υπερφόρτωση αρχείου): class function SignPDFWithPFX( const InputPDFPath: string; const OutputPDFPath: string; const PFXFilePath: string; const Password: AnsiString): boolean; overload; static;
Σύνταξη Delphi (υπερφόρτωση ροής): class function SignPDFWithPFX( InputStream: TStream; OutputStream: TStream; const PFXFilePath: string; const Password: AnsiString): boolean; overload; static;
Περιγραφή Το SignPDFWithPFX είναι το σημείο εισόδου υπογραφής PFX από άκρο σε άκρο που προστέθηκε στο v2.119.27. Το PDF εισόδου πρέπει ήδη να περιέχει placeholder υπογραφής που εκδίδεται από το THPDFPage.AddSignedSignatureField (ή το PAdES wrapper του) με subFilter
1. Αντιγράφει την είσοδο μέσω περιορισμένου buffer 256 KB ή επαναχρησιμοποιεί την ίδια αναζητήσιμη αναγνώσιμη/εγγράψιμη ροή, εντοπίζει τα placeholders /ByteRange + /Contents και ενημερώνει με αναζήτηση το πεδίο σταθερού πλάτους /ByteRange με τις πραγματικές μετατοπίσεις byte 2. Φορτώνει το αρχείο PFX και το αποκρυπτογραφεί με τον παρεχόμενο κωδικό. Υποστηρίζεται PBES2 με PBKDF2-HMAC-SHA-256 + AES-256-CBC, η προεπιλογή για αρχεία PFX που εξάγονται από OpenSSL 3.0+, Windows 11+ certutil και macOS Keychain Access, ενώ υποστηρίζονται και αρχεία PBE-SHA1-3DES παλαιού τύπου για παλαιότερες εξαγωγές πιστοποιητικών. Άλλα προφίλ κρυπτογράφησης εγείρουν διαγνωστικό με το προβληματικό OID 3. Υπολογίζει SHA-256 πάνω στα document bytes που καλύπτει το /ByteRange και δημιουργεί CMS SignedData (RFC 5652) DER blob που περιέχει το X.509 certificate, τα signed attributes (contentType + messageDigest + signingTime) και μια RSA + SHA-256 signature πάνω στα SET-tagged signed attributes 4. Κάνει hex-encode το CMS DER, επαληθεύει ότι χωρά στο /Contents budget που κρατήθηκε από το AddSignedSignatureField (η προεπιλογή 8 KB καλύπτει 1024 / 2048-bit RSA) και το εισάγει στο placeholder 5. Γράφει τα patched bytes στο output path ή stream
Επιστρέφει True σε επιτυχία. Εγείρει
Τυπική ροή εργασίας
Doc := THotPDF.Create(nil); Doc.FileName := 'unsigned.pdf'; Doc.BeginDoc; Doc.CurrentPage.AddSignedSignatureField( 'Sig1', Rect(60, 60, 260, 90), 8192, 'adbe.pkcs7.detached', 'Approved', 'Brussels', '', []); Doc.EndDoc; Doc.Free; THotPDF.SignPDFWithPFX('unsigned.pdf', 'signed.pdf', 'mykey.pfx', 'mypassword');
Σημειώσεις Ο signature algorithm είναι RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Το signer identifier είναι IssuerAndSerialNumber που εξάγεται από το X.509 certificate. Το encapContentInfo είναι detached (το eContent παραλείπεται). Τα signed attributes ταξινομούνται κατά αύξουσα DER byte string σύμφωνα με RFC 5652 §5.4 πριν γίνουν hashed
Για PAdES B-T / B-LT / B-LTA workflows που χρειάζονται RFC 3161 timestamps, DSS dictionaries ή document timestamp signatures, εξακολουθούν να ισχύουν οι producer-side helpers (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature)· το ίδιο το SignPDFWithPFX εκπέμπει βασική CMS-only signature (ισοδύναμη με PAdES-B-B) Η υπερφόρτωση ροής δεν διατηρεί ποτέ στη μνήμη ένα πλήρες δεύτερο PDF. Κατακερματίζει την έξοδο που ενημερώθηκε σε περιορισμένα εύρη και ενημερώνει με αναζήτηση την δεκαεξαδική τιμή CMS χωρίς να αλλάζει το μήκος αρχείου. Μετατοπίσεις δεκαδικών σταθερού πλάτους υποστηρίζουν προετοιμασμένα PDF μικρότερα από 10.000.000.000 byte
Δείτε επίσης: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField |