summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2023-12-23 14:30:37 +0100
committerJay Berkenbilt <ejb@ql.org>2023-12-23 14:44:47 +0100
commit3d33a3a1e3eed4e09a625f81aaa8fcdc67d642e9 (patch)
treeda9fcca510e8c3bea22bf7d38d892c29893d383c
parent2c14be264b0f2327248a7a0b2e47eb4d12574426 (diff)
downloadqpdf-3d33a3a1e3eed4e09a625f81aaa8fcdc67d642e9.tar.zst
Add QPDFAcroFormDocumentHelper::disableDigitalSignatures
-rw-r--r--include/qpdf/QPDFAcroFormDocumentHelper.hh5
-rw-r--r--libqpdf/QPDFAcroFormDocumentHelper.cc22
2 files changed, 27 insertions, 0 deletions
diff --git a/include/qpdf/QPDFAcroFormDocumentHelper.hh b/include/qpdf/QPDFAcroFormDocumentHelper.hh
index 8be4d069..f9ad0091 100644
--- a/include/qpdf/QPDFAcroFormDocumentHelper.hh
+++ b/include/qpdf/QPDFAcroFormDocumentHelper.hh
@@ -163,6 +163,11 @@ class QPDFAcroFormDocumentHelper: public QPDFDocumentHelper
QPDF_DLL
void generateAppearancesIfNeeded();
+ // Disable Digital Signature Fields. Remove all digital signature fields from the document,
+ // leaving any annotation showing the content of the field intact.
+ QPDF_DLL
+ void disableDigitalSignatures();
+
// Note: this method works on all annotations, not just ones with associated fields. For each
// annotation in old_annots, apply the given transformation matrix to create a new annotation.
// New annotations are appended to new_annots. If the annotation is associated with a form
diff --git a/libqpdf/QPDFAcroFormDocumentHelper.cc b/libqpdf/QPDFAcroFormDocumentHelper.cc
index f2daa0c7..5fdd20ba 100644
--- a/libqpdf/QPDFAcroFormDocumentHelper.cc
+++ b/libqpdf/QPDFAcroFormDocumentHelper.cc
@@ -416,6 +416,28 @@ QPDFAcroFormDocumentHelper::generateAppearancesIfNeeded()
}
void
+QPDFAcroFormDocumentHelper::disableDigitalSignatures()
+{
+ std::set<QPDFObjGen> to_remove;
+ auto fields = getFormFields();
+ for (auto& f: fields) {
+ auto ft = f.getFieldType();
+ if (ft == "/Sig") {
+ auto oh = f.getObjectHandle();
+ to_remove.insert(oh.getObjGen());
+ // Make this no longer a form field. If it's also an annotation, the annotation will
+ // survive. If it's only a field and is no longer referenced, it will disappear.
+ oh.removeKey("/FT");
+ // Remove fields that are specific to signature fields.
+ oh.removeKey("/V");
+ oh.removeKey("/SV");
+ oh.removeKey("/Lock");
+ }
+ }
+ removeFormFields(to_remove);
+}
+
+void
QPDFAcroFormDocumentHelper::adjustInheritedFields(
QPDFObjectHandle obj,
bool override_da,