SetaPDF Demos

Check for Digital Signatures

Check and extract the value of digital signatures (no validation).

In this demo no validation is done! A more detailed access to used certifiates including technical validation can be done with a demo of the the SetaPDF-Signer component.

PHP
<?php

// load and register the autoload function
require_once '../../../../../bootstrap.php';

// prepare some files
$files = [
    $assetsDirectory . '/pdfs/tektown/Laboratory-Report-signed-no-LTV.pdf',
    $assetsDirectory . '/pdfs/tektown/Laboratory-Report-signed.pdf',
    $assetsDirectory . '/pdfs/lenstown/Laboratory-Report-signed-PAdES.pdf',
    $assetsDirectory . '/pdfs/tektown/Order-Form.pdf',
    $assetsDirectory . '/pdfs/tektown/eBook-Invoice.pdf',
];

$path = displayFiles($files);

$document = SetaPDF_Core_Document::loadByFilename($path);
$terminalFields = $document->getCatalog()->getAcroForm()->getTerminalFieldsObjects();

$signatureFieldFound = false;

foreach ($terminalFields as $fieldData) {
    $fieldData = $fieldData->ensure();

    $ft = SetaPDF_Core_Type_Dictionary_Helper::resolveAttribute($fieldData, 'FT');
    if (!$ft || $ft->getValue() !== 'Sig') {
        continue;
    }

    $fieldName = SetaPDF_Core_Document_Catalog_AcroForm::resolveFieldName($fieldData);
    echo sprintf('Signature Field "%s" found! ', $fieldName);
    $signatureFieldFound = true;

    $v = SetaPDF_Core_Type_Dictionary_Helper::resolveAttribute($fieldData, 'V');
    if (!$v || !$v->ensure() instanceof SetaPDF_Core_Type_Dictionary) {
        echo ' But not digital signed.<br /><br />';
        continue;
    }

    echo ' Including a digital signature.<br />';

    // This is the signature value
    $signatureData = $v->ensure()->getValue('Contents')->ensure()->getValue();
    $signatureData = rtrim($signatureData, "\0");

    echo '<a href="https://lapo.it/asn1js/#' . SetaPDF_Core_Type_HexString::str2hex($signatureData) . '" ' .
        'target="_blank">asn1js</a> | ';
    echo '<a href="data:application/pkcs7-mime;base64,' . base64_encode($signatureData) . '" ' .
        'download="signature.pkcs7">download</a><br />';

    echo '<br />';

    $value = $v->ensure();
    $signatureProperties = [];
    foreach (['Name', 'Location', 'ContactInfo', 'Reason', 'M'] as $property) {
        if (!$value->offsetExists($property)) {
            continue;
        }

        $propertyValue = $value->getValue($property)->ensure()->getValue();
        if ($property === SetaPDF_Signer::PROP_TIME_OF_SIGNING) {
            $propertyValue = SetaPDF_Core_DataStructure_Date::stringToDateTime($propertyValue);
        } else {
            $propertyValue = SetaPDF_Core_Encoding::convertPdfString($propertyValue);
        }

        $signatureProperties[$property] = $propertyValue;
    }

    echo 'Signature Properties:<br/>';
    echo '<pre>';
    print_r($signatureProperties);
    echo '</pre><br /><br />';
}

if ($signatureFieldFound === false) {
    echo 'No signature field found.';
}