glib/poppler-document.cc | 2 - poppler/PDFDoc.cc | 49 ++++++++++++++++++----------------------------- poppler/PDFDoc.h | 1 3 files changed, 20 insertions(+), 32 deletions(-)
New commits: commit b8dab63b747b61de6678d6e8cd852daebd44c27e Author: Albert Astals Cid <[email protected]> Date: Mon Jan 24 00:50:30 2022 +0100 Improve PDFDoc::getSignatureFields diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc index 787d05d8..c64eb58c 100644 --- a/glib/poppler-document.cc +++ b/glib/poppler-document.cc @@ -1783,7 +1783,7 @@ gint poppler_document_get_n_signatures(const PopplerDocument *document) { g_return_val_if_fail(POPPLER_IS_DOCUMENT(document), 0); - return document->doc->getNumSignatureFields(); + return document->doc->getSignatureFields().size(); } /** diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index 2f526a5c..6acde17b 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -620,8 +620,11 @@ static void addSignatureFieldsToVector(FormField *ff, std::vector<FormFieldSigna std::vector<FormFieldSignature *> PDFDoc::getSignatureFields() { + // Unfortunately there's files with signatures in Forms but not in Annots + // and files with signatures in Annots but no in forms so we need to search both std::vector<FormFieldSignature *> res; + // First search const Form *f = catalog->getForm(); if (!f) return res; @@ -631,40 +634,26 @@ std::vector<FormFieldSignature *> PDFDoc::getSignatureFields() FormField *ff = f->getRootField(i); addSignatureFieldsToVector(ff, res); } - return res; -} - -static int sumSignatureFields(FormField *ff) -{ - int sum = 0; - if (ff->getNumChildren() == 0) { - if (ff->getType() == formSignature) { - sum = 1; - } - } else { - for (int i = 0; i < ff->getNumChildren(); ++i) { - FormField *children = ff->getChildren(i); - sum += sumSignatureFields(children); + // Second search + for (int page = 1; page <= getNumPages(); ++page) { + Page *p = getPage(page); + if (p) { + const std::unique_ptr<FormPageWidgets> pw = p->getFormWidgets(); + for (int i = 0; i < pw->getNumWidgets(); ++i) { + FormWidget *fw = pw->getWidget(i); + if (fw->getType() == formSignature) { + assert(fw->getField()->getType() == formSignature); + FormFieldSignature *ffs = static_cast<FormFieldSignature *>(fw->getField()); + if (std::find(res.begin(), res.end(), ffs) == res.end()) { + res.push_back(ffs); + } + } + } } } - return sum; -} - -int PDFDoc::getNumSignatureFields() -{ - const Form *f = catalog->getForm(); - - if (!f) - return 0; - const int nRootFields = f->getNumFields(); - int sum = 0; - for (int i = 0; i < nRootFields; ++i) { - FormField *ff = f->getRootField(i); - sum += sumSignatureFields(ff); - } - return sum; + return res; } void PDFDoc::displayPage(OutputDev *out, int page, double hDPI, double vDPI, int rotate, bool useMediaBox, bool crop, bool printing, bool (*abortCheckCbk)(void *data), void *abortCheckCbkData, diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h index 0c60ed15..61bd74a2 100644 --- a/poppler/PDFDoc.h +++ b/poppler/PDFDoc.h @@ -228,7 +228,6 @@ public: bool isEncrypted() { return xref->isEncrypted(); } std::vector<FormFieldSignature *> getSignatureFields(); - int getNumSignatureFields(); // Check various permissions. bool okToPrint(bool ignoreOwnerPW = false) { return xref->okToPrint(ignoreOwnerPW); }
