Skip to content

Signatures numériques PAdES

Pro — Commercial License Required
Les niveaux de signature PAdES B-T, B-LT et B-LTA nécessitent le package Pro.

TCPDF-Next Pro implémente le pipeline PAdES complet (ETSI EN 319 142) en utilisant CertificateInfo, DigitalSigner, ByteRangeCalculator et SignatureAppearance.

Niveaux de signature

NiveauValeur d'énumérationCe qu'il ajoute
B-BSignatureLevel::PAdES_B_BSignature CMS avec certificat de signature
B-TSignatureLevel::PAdES_B_THorodatage de signature RFC 3161
B-LTSignatureLevel::PAdES_B_LTDonnées de révocation (OCSP + CRL) via DSS
B-LTASignatureLevel::PAdES_B_LTAHorodatage de document pour validité indéfinie

CertificateInfo

Charge et analyse les certificats X.509 et clés privées depuis fichiers PEM ou PKCS#12.

php
use Yeeefang\TcpdfNext\Pro\Security\Signature\CertificateInfo;

// Depuis fichiers PEM
$cert = CertificateInfo::fromPem('/certs/signing.pem', '/certs/signing.key', 'pw');
$cert->chain(['/certs/intermediate.pem', '/certs/root.pem']);

// Depuis PKCS#12 (chaîne extraite automatiquement)
$cert = CertificateInfo::fromPkcs12('/certs/signing.p12', 'p12-password');

// Inspecter les détails du certificat
echo $cert->subjectCN();        // "John Doe"
echo $cert->issuerCN();         // "Acme Intermediate CA"
echo $cert->validFrom();        // DateTimeImmutable
echo $cert->ocspResponderUrl(); // "https://ocsp.acme.com"

DigitalSigner

Génère le conteneur de signature CMS/PKCS#7 et orchestre l'intégration d'horodatage et LTV.

php
use Yeeefang\TcpdfNext\Core\Document;
use Yeeefang\TcpdfNext\Pro\Security\Signature\DigitalSigner;
use Yeeefang\TcpdfNext\Pro\Security\Timestamp\TsaClient;
use Yeeefang\TcpdfNext\Contracts\Enums\SignatureLevel;

$pdf  = Document::create()->addPage()->text('Contract document.');
$cert = CertificateInfo::fromPkcs12('/certs/signer.p12', 'pw');
$tsa  = new TsaClient('https://tsa.example.com/timestamp');

$signer = new DigitalSigner($cert);
$signer->level(SignatureLevel::PAdES_B_LTA);
$signer->timestampAuthority($tsa);
$signer->reason('Document approval');
$signer->location('Taipei, Taiwan');

$signer->sign($pdf);
$pdf->save('/output/signed.pdf');

Aux niveaux B-LT et B-LTA, LtvManager est invoqué en interne pour récupérer les réponses OCSP et CRL et construire le dictionnaire DSS.

ByteRangeCalculator

Gère le placeholder de signature et calcule les plages d'octets. Géré en interne par DigitalSigner ; utilisation directe pour scénarios avancés.

SignatureAppearance

Contrôle la représentation visible de la signature sur la page. Les signatures sont invisibles par défaut.

php
use Yeeefang\TcpdfNext\Pro\Security\Signature\SignatureAppearance;

$appearance = SignatureAppearance::create()
    ->page(1)
    ->position(x: 20.0, y: 250.0, width: 80.0, height: 30.0)
    ->text("Digitally signed by John Doe\nDate: 2026-02-16")
    ->image('/images/handwritten-signature.png')
    ->imagePosition('left')  // 'left', 'right', 'top', 'bottom', 'background'
    ->fontSize(8);

$signer->appearance($appearance);
$signer->sign($pdf);

Exemple B-LTA complet

php
use Yeeefang\TcpdfNext\Core\Document;
use Yeeefang\TcpdfNext\Pro\Security\Signature\{DigitalSigner, CertificateInfo, SignatureAppearance};
use Yeeefang\TcpdfNext\Pro\Security\Timestamp\TsaClient;
use Yeeefang\TcpdfNext\Contracts\Enums\SignatureLevel;

$pdf = Document::create()
    ->addPage()
    ->font('Helvetica', size: 14, style: 'B')
    ->text('Purchase Agreement')
    ->font('Helvetica', size: 11)
    ->text('This agreement is entered into on February 16, 2026...');

$cert = CertificateInfo::fromPkcs12('/certs/legal.p12', 'passphrase');
$tsa  = new TsaClient('https://tsa.example.com/timestamp');

$signer = new DigitalSigner($cert);
$signer->level(SignatureLevel::PAdES_B_LTA);
$signer->timestampAuthority($tsa);
$signer->appearance(
    SignatureAppearance::create()
        ->page(1)
        ->position(x: 20.0, y: 250.0, width: 80.0, height: 25.0)
        ->text("Signed by Legal Dept.\n2026-02-16")
);
$signer->reason('Purchase agreement execution');
$signer->location('Taipei, Taiwan');

$signer->sign($pdf);
$pdf->save('/contracts/purchase-agreement-signed.pdf');

Prochaines étapes

Distribué sous licence LGPL-3.0-or-later.