glib: Make PrintPageRange preference available in API

Add poppler_document_get_print_page_ranges() so that applications which
use poppler's glib frontend can access this preference.

https://gitlab.freedesktop.org/poppler/poppler/issues/290
diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
index 5c9e6a2..acd8157 100644
--- a/glib/poppler-document.cc
+++ b/glib/poppler-document.cc
@@ -1776,6 +1776,50 @@
 }
 
 /**
+ * poppler_document_get_print_page_ranges:
+ * @document: A #PopplerDocument
+ * @n_ranges: (out): return location for number of ranges
+ *
+ * Returns the suggested page ranges to print in the form of array
+ * of #PopplerPageRanges and number of ranges.
+ *
+ * Returns: (array length=n_ranges) (transfer full): an array
+ *          of #PopplerPageRanges or NULL. Free the array when
+ *          it is no longer needed.
+ *
+ * Since: 0.78
+ **/
+PopplerPageRange *
+poppler_document_get_print_page_ranges (PopplerDocument *document,
+                                        int             *n_ranges)
+{
+  Catalog *catalog;
+  ViewerPreferences *preferences;
+  std::vector<std::pair<int, int>> ranges;
+  PopplerPageRange *result = nullptr;
+
+  *n_ranges = 0;
+  g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
+
+  catalog = document->doc->getCatalog ();
+  if (catalog && catalog->isOk ()) {
+    preferences = catalog->getViewerPreferences ();
+    if (preferences) {
+      ranges = preferences->getPrintPageRange ();
+
+      *n_ranges = ranges.size ();
+      result = g_new (PopplerPageRange, ranges.size ());
+      for (guint i = 0; i < ranges.size (); ++i) {
+        result[i].start_page = ranges[i].first;
+        result[i].end_page = ranges[i].second;
+      }
+    }
+  }
+
+  return result;
+}
+
+/**
  * poppler_document_get_permissions:
  * @document: A #PopplerDocument
  *
diff --git a/glib/poppler-document.h b/glib/poppler-document.h
index 98ceb75..499991c 100644
--- a/glib/poppler-document.h
+++ b/glib/poppler-document.h
@@ -398,6 +398,9 @@
 PopplerPrintDuplex poppler_document_get_print_duplex       (PopplerDocument *document);
 POPPLER_PUBLIC
 gint               poppler_document_get_print_n_copies     (PopplerDocument *document);
+POPPLER_PUBLIC
+PopplerPageRange  *poppler_document_get_print_page_ranges  (PopplerDocument *document,
+                                                            int             *n_ranges);
 
 /* Attachments */
 POPPLER_PUBLIC
diff --git a/glib/reference/poppler-sections.txt b/glib/reference/poppler-sections.txt
index aff742d..d94abf2 100644
--- a/glib/reference/poppler-sections.txt
+++ b/glib/reference/poppler-sections.txt
@@ -177,6 +177,7 @@
 poppler_document_get_permissions
 poppler_document_get_print_duplex
 poppler_document_get_print_n_copies
+poppler_document_get_print_page_ranges
 poppler_document_get_print_scaling
 poppler_document_get_producer
 poppler_document_get_subject