[poppler] qt5/src

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 23 20:44:42 UTC 2020


 qt5/src/poppler-document.cc |   16 +++++++++++++++
 qt5/src/poppler-form.cc     |   46 ++++++++++++++++++++++----------------------
 qt5/src/poppler-private.h   |    2 -
 qt5/src/poppler-qt5.h       |   11 ++++++++++
 4 files changed, 52 insertions(+), 23 deletions(-)

New commits:
commit 12eeb475fbf3ee0bb43b96ea79d46a426ba809e7
Author: Albert Astals Cid <aacid at kde.org>
Date:   Fri Apr 10 00:31:40 2020 +0200

    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

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;
 
@@ -1846,6 +1847,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.
 	*/


More information about the poppler mailing list