Подписание PDF с помощью PDFBox с помощью Lock - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу подписать PDF с помощью блокировки.Я использую PDFBox 2.0.9

Поток, которого я хочу достичь:

  • Я создам документ с полем формы
  • Я хочу подписатьдокумент, но исключить это поле формы
  • После подписания этого документа я хочу изменить значение этого поля
  • Я подпишу снова без исключения

Так что если кто-тоСнова отредактируйте это поле, Adobe Reader должен сказать, что этот документ изменился.

«Блокировка» словаря в поле подписи является причиной разрыва подписи после подписи

IВот пример кода и я написал его:

PDSignatureField signatureField = getSignatureField(pdDocument, pdSignature);
if (signatureField != null) {
    COSDictionary lockDict = new COSDictionary();
    lockDict.setItem(COSName.TYPE, COS_NAME_SIG_FIELD_LOCK);
    lockDict.setItem(COS_NAME_ACTION, COS_NAME_EXCLUDE);

    COSArray lockFields = new COSArray();
    lockFields.add(new COSString("textbox1"));

    lockDict.setItem(COS_NAME_FIELDS, lockFields);

    signatureField.getCOSObject().setItem(COS_NAME_LOCK, lockDict);

    COSDictionary transformParams = new COSDictionary(lockDict);
    transformParams.setItem(COSName.TYPE, COSName.getPDFName("TransformParams"));
    transformParams.setItem(COSName.V, COSName.getPDFName("1.2"));
    transformParams.setDirect(true);
    COSDictionary sigRef = new COSDictionary();
    sigRef.setItem(COSName.TYPE, COSName.getPDFName("SigRef"));
    sigRef.setItem(COSName.getPDFName("TransformParams"), transformParams);
    sigRef.setItem(COSName.getPDFName("TransformMethod"), COSName.getPDFName("FieldMDP"));
    //sigRef.setItem(COSName.getPDFName("Data"), pdDocument.getDocumentCatalog());
    sigRef.setDirect(true);
    COSArray referenceArray = new COSArray();
    referenceArray.add(sigRef);
    pdSignature.getCOSObject().setItem(COSName.getPDFName("Reference"), referenceArray);

}

Я могу подписать, изменить значение поля и снова подписать, и подписи в порядке.Проблема в том, что когда я изменяю значение поля после второй подписи, подписи остаются в силе.Я ожидаю, что после последнего изменения вторая подпись должна быть недействительной.

1 Ответ

0 голосов
/ 10 февраля 2019

Проблема была в моем коде, потому что этот код добавляет исключая каждый раз.Когда я кодировал, как показано ниже (мое первое имя подписи - Signature 1), все стало нормально, как и ожидалось.

    public static final COSName COS_NAME_LOCK = COSName.getPDFName("Lock");
    public static final COSName COS_NAME_ACTION = COSName.getPDFName("Action");
    public static final COSName COS_NAME_ALL = COSName.getPDFName("All");
    public static final COSName COS_NAME_INCLUDE = COSName.getPDFName("Include");
    public static final COSName COS_NAME_EXCLUDE = COSName.getPDFName("Exclude");
    public static final COSName COS_NAME_FIELDS = COSName.getPDFName("Fields");
    public static final COSName COS_NAME_SIG_FIELD_LOCK = COSName.getPDFName("SigFieldLock");


        PDSignatureField signatureField = getSignatureField(pdDocument, pdSignature);
        if (signatureField != null) {
            COSDictionary lockDict = new COSDictionary();
            lockDict.setItem(COSName.TYPE, COS_NAME_SIG_FIELD_LOCK);
            lockDict.setItem(COS_NAME_ACTION, COS_NAME_EXCLUDE);

            COSArray lockFields = new COSArray();
            if (pdSignature.getName().equals("Signature1")) {
                lockFields.add(new COSString("textbox1"));
            }

            lockDict.setItem(COS_NAME_FIELDS, lockFields);

            signatureField.getCOSObject().setItem(COS_NAME_LOCK, lockDict);

            COSDictionary transformParams = new COSDictionary(lockDict);
            transformParams.setItem(COSName.TYPE, COSName.getPDFName("TransformParams"));
            transformParams.setItem(COSName.V, COSName.getPDFName("1.2"));
            transformParams.setDirect(true);
            COSDictionary sigRef = new COSDictionary();
            sigRef.setItem(COSName.TYPE, COSName.getPDFName("SigRef"));
            sigRef.setItem(COSName.getPDFName("TransformParams"), transformParams);
            sigRef.setItem(COSName.getPDFName("TransformMethod"), COSName.getPDFName("FieldMDP"));
            sigRef.setDirect(true);
            COSArray referenceArray = new COSArray();
            referenceArray.add(sigRef);
            pdSignature.getCOSObject().setItem(COSName.getPDFName("Reference"), referenceArray);

        }
...