poppler/Catalog.cc |   11 ++++++++++-
 poppler/Catalog.h  |    8 +++++++-
 poppler/PDFDoc.cc  |    8 ++++----
 poppler/PDFDoc.h   |   27 ++++++++++++++++++++-------
 4 files changed, 41 insertions(+), 13 deletions(-)

New commits:
commit ef8c8ca8500ce9de91a5903b8561e3e02a81888e
Author: Albert Astals Cid <aa...@kde.org>
Date:   Thu Jul 22 17:54:47 2021 +0200

    Support reading the Version from the Catalog
    
    Fixes #1097

diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc
index 53fdfb5a..616f43d7 100644
--- a/poppler/Catalog.cc
+++ b/poppler/Catalog.cc
@@ -14,7 +14,7 @@
 // under GPL version 2 or later
 //
 // Copyright (C) 2005 Kristian Høgsberg <k...@redhat.com>
-// Copyright (C) 2005-2013, 2015, 2017-2020 Albert Astals Cid <aa...@kde.org>
+// Copyright (C) 2005-2013, 2015, 2017-2021 Albert Astals Cid <aa...@kde.org>
 // Copyright (C) 2005 Jeff Muizelaar <jrmui...@nit.ca>
 // Copyright (C) 2005 Jonathan Blandford <j...@redhat.com>
 // Copyright (C) 2005 Marco Pesenti Gritti <m...@redhat.com>
@@ -130,6 +130,15 @@ Catalog::Catalog(PDFDoc *docA)
 
     // get the ViewerPreferences dictionary
     viewerPreferences = catDict.dictLookup("ViewerPreferences");
+
+    const Object version = catDict.dictLookup("Version");
+    if (version.isName()) {
+        const int res = sscanf(version.getName(), "%d.%d", 
&catalogPdfMajorVersion, &catalogPdfMinorVersion);
+        if (res != 2) {
+            catalogPdfMajorVersion = -1;
+            catalogPdfMinorVersion = -1;
+        }
+    }
 }
 
 Catalog::~Catalog()
diff --git a/poppler/Catalog.h b/poppler/Catalog.h
index 6d568b75..fc561e29 100644
--- a/poppler/Catalog.h
+++ b/poppler/Catalog.h
@@ -14,7 +14,7 @@
 // under GPL version 2 or later
 //
 // Copyright (C) 2005 Kristian Høgsberg <k...@redhat.com>
-// Copyright (C) 2005, 2007, 2009-2011, 2013, 2017-2020 Albert Astals Cid 
<aa...@kde.org>
+// Copyright (C) 2005, 2007, 2009-2011, 2013, 2017-2021 Albert Astals Cid 
<aa...@kde.org>
 // Copyright (C) 2005 Jonathan Blandford <j...@redhat.com>
 // Copyright (C) 2005, 2006, 2008 Brad Hards <br...@frogmouth.net>
 // Copyright (C) 2007 Julien Rebetez <juli...@svn.gnome.org>
@@ -214,6 +214,9 @@ public:
 
     OCGs *getOptContentConfig() { return optContent; }
 
+    int getPDFMajorVersion() const { return catalogPdfMajorVersion; }
+    int getPDFMinorVersion() const { return catalogPdfMinorVersion; }
+
     enum FormType
     {
         NoForm,
@@ -305,6 +308,9 @@ private:
     NameTree *getJSNameTree();
     std::unique_ptr<LinkDest> createLinkDest(Object *obj);
 
+    int catalogPdfMajorVersion = -1;
+    int catalogPdfMinorVersion = -1;
+
     mutable std::recursive_mutex mutex;
 };
 
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index 7646fb89..bd4dcde8 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -14,7 +14,7 @@
 // under GPL version 2 or later
 //
 // Copyright (C) 2005, 2006, 2008 Brad Hards <br...@frogmouth.net>
-// Copyright (C) 2005, 2007-2009, 2011-2020 Albert Astals Cid <aa...@kde.org>
+// Copyright (C) 2005, 2007-2009, 2011-2021 Albert Astals Cid <aa...@kde.org>
 // Copyright (C) 2008 Julien Rebetez <juli...@svn.gnome.org>
 // Copyright (C) 2008, 2010 Pino Toscano <p...@kde.org>
 // Copyright (C) 2008, 2010, 2011 Carlos Garcia Campos <carlo...@gnome.org>
@@ -411,8 +411,8 @@ void PDFDoc::checkHeader()
     int i;
     int bytesRead;
 
-    pdfMajorVersion = 0;
-    pdfMinorVersion = 0;
+    headerPdfMajorVersion = 0;
+    headerPdfMinorVersion = 0;
 
     // read up to headerSearchSize bytes from the beginning of the document
     for (i = 0; i < headerSearchSize; ++i) {
@@ -441,7 +441,7 @@ void PDFDoc::checkHeader()
         error(errSyntaxWarning, -1, "May not be a PDF file (continuing 
anyway)");
         return;
     }
-    sscanf(p, "%d.%d", &pdfMajorVersion, &pdfMinorVersion);
+    sscanf(p, "%d.%d", &headerPdfMajorVersion, &headerPdfMinorVersion);
     // We don't do the version check. Don't add it back in.
 }
 
diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h
index a2d0098b..63ec25b4 100644
--- a/poppler/PDFDoc.h
+++ b/poppler/PDFDoc.h
@@ -14,7 +14,7 @@
 // under GPL version 2 or later
 //
 // Copyright (C) 2005, 2006, 2008 Brad Hards <br...@frogmouth.net>
-// Copyright (C) 2005, 2009, 2014, 2015, 2017-2020 Albert Astals Cid 
<aa...@kde.org>
+// Copyright (C) 2005, 2009, 2014, 2015, 2017-2021 Albert Astals Cid 
<aa...@kde.org>
 // Copyright (C) 2008 Julien Rebetez <juli...@svn.gnome.org>
 // Copyright (C) 2008 Pino Toscano <p...@kde.org>
 // Copyright (C) 2008 Carlos Garcia Campos <carlo...@gnome.org>
@@ -44,11 +44,14 @@
 #ifndef PDFDOC_H
 #define PDFDOC_H
 
+#include <algorithm>
+#include <cstdio>
 #include <mutex>
 
 #include "poppler-config.h"
+
 #include "poppler_private_export.h"
-#include <cstdio>
+
 #include "XRef.h"
 #include "Catalog.h"
 #include "Page.h"
@@ -278,9 +281,19 @@ public:
     PDFSubtypePart getPDFSubtypePart() const { return pdfPart; }
     PDFSubtypeConformance getPDFSubtypeConformance() const { return 
pdfConformance; }
 
-    // Return the PDF version specified by the file.
-    int getPDFMajorVersion() const { return pdfMajorVersion; }
-    int getPDFMinorVersion() const { return pdfMinorVersion; }
+    // Return the PDF version specified by the file (either header or catalog).
+    int getPDFMajorVersion() const { return std::max(headerPdfMajorVersion, 
catalog->getPDFMajorVersion()); }
+    int getPDFMinorVersion() const
+    {
+        const int catalogMajorVersion = catalog->getPDFMajorVersion();
+        if (catalogMajorVersion > headerPdfMajorVersion) {
+            return catalog->getPDFMinorVersion();
+        } else if (headerPdfMajorVersion > catalogMajorVersion) {
+            return headerPdfMinorVersion;
+        } else {
+            return std::max(headerPdfMinorVersion, 
catalog->getPDFMinorVersion());
+        }
+    }
 
     // Return the PDF ID in the trailer dictionary (if any).
     bool getID(GooString *permanent_id, GooString *update_id) const;
@@ -365,8 +378,8 @@ private:
     GooFile *file;
     BaseStream *str;
     void *guiData;
-    int pdfMajorVersion;
-    int pdfMinorVersion;
+    int headerPdfMajorVersion;
+    int headerPdfMinorVersion;
     PDFSubtype pdfSubtype;
     PDFSubtypePart pdfPart;
     PDFSubtypeConformance pdfConformance;
_______________________________________________
poppler mailing list
poppler@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to