summaryrefslogtreecommitdiff
path: root/qt5
diff options
context:
space:
mode:
authorAlbert Astals Cid <aacid@kde.org>2020-04-10 00:31:40 +0200
committerAlbert Astals Cid <tsdgeos@yahoo.es>2020-04-23 20:40:01 +0000
commit12eeb475fbf3ee0bb43b96ea79d46a426ba809e7 (patch)
treea2a8521ade5ad9366dcfddd5400841a6a99c0cc7 /qt5
parentba311960d2486e07e66f59dd8d8a5f6e49a918d0 (diff)
qt5: Add Document::signatures
Returns all the signatures of a given document, this is better than iterating over all the pages getting the form fields that are of signature type since there's documents with signatures not associated to a given page Fixes part of #895
Diffstat (limited to 'qt5')
-rw-r--r--qt5/src/poppler-document.cc16
-rw-r--r--qt5/src/poppler-form.cc46
-rw-r--r--qt5/src/poppler-private.h2
-rw-r--r--qt5/src/poppler-qt5.h11
4 files changed, 52 insertions, 23 deletions
diff --git a/qt5/src/poppler-document.cc b/qt5/src/poppler-document.cc
index e1b8d05b..cba9da39 100644
--- a/qt5/src/poppler-document.cc
+++ b/qt5/src/poppler-document.cc
@@ -48,6 +48,7 @@
#include <QtCore/QFile>
#include <QtCore/QByteArray>
+#include "poppler-form.h"
#include "poppler-private.h"
#include "poppler-page-private.h"
#include "poppler-outline-private.h"
@@ -829,6 +830,21 @@ namespace Poppler {
return result;
}
+ QVector<FormFieldSignature*> Document::signatures() const
+ {
+ QVector<FormFieldSignature*> result;
+
+ const std::vector<::FormFieldSignature*> pSignatures = m_doc->doc->getSignatureFields();
+
+ for (::FormFieldSignature *pSignature : pSignatures) {
+ ::FormWidget *fw = pSignature->getWidget(0);
+ ::Page *p = m_doc->doc->getPage(fw->getWidgetAnnotation()->getPageNum());
+ result.append(new FormFieldSignature(m_doc, p, static_cast<FormWidgetSignature*>(fw)));
+ }
+
+ return result;
+ }
+
QDateTime convertDate( const char *dateString )
{
int year, mon, day, hour, min, sec, tzHours, tzMins;
diff --git a/qt5/src/poppler-form.cc b/qt5/src/poppler-form.cc
index 1ed419c8..19adbd7b 100644
--- a/qt5/src/poppler-form.cc
+++ b/qt5/src/poppler-form.cc
@@ -105,29 +105,31 @@ FormFieldIcon::~FormFieldIcon()
FormField::FormField(std::unique_ptr<FormFieldData> dd)
: m_formData(std::move(dd))
{
- const int rotation = m_formData->page->getRotate();
- // reading the coords
- double left, top, right, bottom;
- m_formData->fm->getRect(&left, &bottom, &right, &top);
- // build a normalized transform matrix for this page at 100% scale
- GfxState gfxState( 72.0, 72.0, m_formData->page->getCropBox(), rotation, true );
- const double * gfxCTM = gfxState.getCTM();
- double MTX[6];
- double pageWidth = m_formData->page->getCropWidth();
- double pageHeight = m_formData->page->getCropHeight();
- // landscape and seascape page rotation: be sure to use the correct (== rotated) page size
- if (((rotation / 90) % 2) == 1)
- qSwap(pageWidth, pageHeight);
- for ( int i = 0; i < 6; i+=2 )
- {
- MTX[i] = gfxCTM[i] / pageWidth;
- MTX[i+1] = gfxCTM[i+1] / pageHeight;
+ if (m_formData->page) {
+ const int rotation = m_formData->page->getRotate();
+ // reading the coords
+ double left, top, right, bottom;
+ m_formData->fm->getRect(&left, &bottom, &right, &top);
+ // build a normalized transform matrix for this page at 100% scale
+ GfxState gfxState( 72.0, 72.0, m_formData->page->getCropBox(), rotation, true );
+ const double * gfxCTM = gfxState.getCTM();
+ double MTX[6];
+ double pageWidth = m_formData->page->getCropWidth();
+ double pageHeight = m_formData->page->getCropHeight();
+ // landscape and seascape page rotation: be sure to use the correct (== rotated) page size
+ if (((rotation / 90) % 2) == 1)
+ qSwap(pageWidth, pageHeight);
+ for ( int i = 0; i < 6; i+=2 )
+ {
+ MTX[i] = gfxCTM[i] / pageWidth;
+ MTX[i+1] = gfxCTM[i+1] / pageHeight;
+ }
+ QPointF topLeft;
+ XPDFReader::transform( MTX, qMin( left, right ), qMax( top, bottom ), topLeft );
+ QPointF bottomRight;
+ XPDFReader::transform( MTX, qMax( left, right ), qMin( top, bottom ), bottomRight );
+ m_formData->box = QRectF(topLeft, QSizeF(bottomRight.x() - topLeft.x(), bottomRight.y() - topLeft.y()));
}
- QPointF topLeft;
- XPDFReader::transform( MTX, qMin( left, right ), qMax( top, bottom ), topLeft );
- QPointF bottomRight;
- XPDFReader::transform( MTX, qMax( left, right ), qMin( top, bottom ), bottomRight );
- m_formData->box = QRectF(topLeft, QSizeF(bottomRight.x() - topLeft.x(), bottomRight.y() - topLeft.y()));
}
FormField::~FormField() = default;
diff --git a/qt5/src/poppler-private.h b/qt5/src/poppler-private.h
index 03312daa..7e612ba1 100644
--- a/qt5/src/poppler-private.h
+++ b/qt5/src/poppler-private.h
@@ -256,7 +256,7 @@ namespace Poppler {
}
DocumentData *doc;
- ::Page *page;
+ ::Page *page; // Note for some signatures it can be null since there's signatures that don't belong to a given page
::FormWidget *fm;
QRectF box;
static POPPLER_QT5_EXPORT ::FormWidget *getFormWidget( const FormField *f );
diff --git a/qt5/src/poppler-qt5.h b/qt5/src/poppler-qt5.h
index d32ffa3b..fc2fcc3b 100644
--- a/qt5/src/poppler-qt5.h
+++ b/qt5/src/poppler-qt5.h
@@ -66,6 +66,7 @@ namespace Poppler {
class PageData;
class FormField;
+ class FormFieldSignature;
class TextBoxData;
@@ -1847,6 +1848,16 @@ QString subject = m_doc->info("Subject");
QVector<int> formCalculateOrder() const;
/**
+ Returns the signatures of this document.
+
+ Prefer to use this over getting the signatures for all the pages of the document
+ since there are documents with signatures that don't belong to a given page
+
+ \since 0.88
+ */
+ QVector<FormFieldSignature*> signatures() const;
+
+ /**
Destructor.
*/
~Document();