354 lines
14 KiB
Diff
354 lines
14 KiB
Diff
From 69e07012533b8393edd8b9ec4da6d239d204858a Mon Sep 17 00:00:00 2001
|
|
From: Even Rouault <even.rouault@spatialys.com>
|
|
Date: Fri, 12 Oct 2018 19:02:40 +0200
|
|
Subject: [PATCH] Add support for Poppler 0.69 (fixes #1004)
|
|
|
|
---
|
|
gdal/GDALmake.opt.in | 1 +
|
|
gdal/configure | 61 ++++++++++++++++++++++++++---------
|
|
gdal/configure.ac | 56 +++++++++++++++++++++++---------
|
|
gdal/frmts/pdf/GNUmakefile | 4 +++
|
|
gdal/frmts/pdf/makefile.vc | 6 +++-
|
|
gdal/frmts/pdf/pdfdataset.cpp | 12 +++++++
|
|
gdal/nmake.opt | 2 ++
|
|
7 files changed, 111 insertions(+), 31 deletions(-)
|
|
|
|
diff --git a/gdal/GDALmake.opt.in b/gdal/GDALmake.opt.in
|
|
index c3b5b34f92b..eaf005e5a14 100644
|
|
--- GDALmake.opt.in
|
|
+++ GDALmake.opt.in
|
|
@@ -473,6 +473,7 @@ POPPLER_BASE_STREAM_HAS_TWO_ARGS = @POPPLER_BASE_STREAM_HAS_TWO_ARGS@
|
|
POPPLER_0_20_OR_LATER = @POPPLER_0_20_OR_LATER@
|
|
POPPLER_0_23_OR_LATER = @POPPLER_0_23_OR_LATER@
|
|
POPPLER_0_58_OR_LATER = @POPPLER_0_58_OR_LATER@
|
|
+POPPLER_0_69_OR_LATER = @POPPLER_0_69_OR_LATER@
|
|
POPPLER_INC = @POPPLER_INC@
|
|
POPPLER_PLUGIN_LIB = @POPPLER_PLUGIN_LIB@
|
|
|
|
diff --git a/gdal/configure b/gdal/configure
|
|
index 1cc161303e4..fac9096939f 100755
|
|
--- configure
|
|
+++ configure
|
|
@@ -664,6 +664,7 @@ PODOFO_INC
|
|
HAVE_PODOFO
|
|
POPPLER_PLUGIN_LIB
|
|
POPPLER_INC
|
|
+POPPLER_0_69_OR_LATER
|
|
POPPLER_0_58_OR_LATER
|
|
POPPLER_0_23_OR_LATER
|
|
POPPLER_0_20_OR_LATER
|
|
@@ -34386,6 +34387,7 @@ POPPLER_BASE_STREAM_HAS_TWO_ARGS=no
|
|
POPPLER_0_20_OR_LATER=no
|
|
POPPLER_0_23_OR_LATER=no
|
|
POPPLER_0_58_OR_LATER=no
|
|
+POPPLER_0_69_OR_LATER=no
|
|
|
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for poppler" >&5
|
|
$as_echo_n "checking for poppler... " >&6; }
|
|
@@ -34428,24 +34430,51 @@ $as_echo "yes" >&6; }
|
|
|
|
CHECK_OTHER_POPPLER_VERSION=yes
|
|
|
|
- # And now we check if we have Poppler >= 0.58.0
|
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Object does have new API (>= 0.58.0)" >&5
|
|
+ if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if OptionalContent has API >= 0.69.0" >&5
|
|
+$as_echo_n "checking if OptionalContent has API >= 0.69.0... " >&6; }
|
|
+ rm -f testpoppler.*
|
|
+ echo '#include <poppler/OptionalContent.h>' > testpoppler.cpp
|
|
+ echo 'int main(int argc, char** argv) {' >> testpoppler.cpp
|
|
+ echo 'OCGs ocg(nullptr, nullptr);' >> testpoppler.cpp
|
|
+ echo 'ocg.getOCGs().size();' >> testpoppler.cpp
|
|
+ echo 'return 0; }' >> testpoppler.cpp
|
|
+ if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
|
|
+ POPPLER_0_69_OR_LATER=yes
|
|
+ POPPLER_0_58_OR_LATER=yes
|
|
+ POPPLER_0_23_OR_LATER=yes
|
|
+ POPPLER_0_20_OR_LATER=yes
|
|
+ POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
|
|
+ POPPLER_HAS_OPTCONTENT=yes
|
|
+ CHECK_OTHER_POPPLER_VERSION=no
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
|
+$as_echo "yes" >&6; }
|
|
+ else
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
+$as_echo "no" >&6; }
|
|
+ fi
|
|
+ fi
|
|
+
|
|
+ if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
|
|
+ # And now we check if we have Poppler >= 0.58.0
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Object does have new API (>= 0.58.0)" >&5
|
|
$as_echo_n "checking if Object does have new API (>= 0.58.0)... " >&6; }
|
|
- rm -f testpoppler.*
|
|
- echo '#include <poppler/Object.h>' > testpoppler.cpp
|
|
- echo 'int main(int argc, char** argv) { Object o(objNull); return 0; }' >> testpoppler.cpp
|
|
- if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
|
|
- POPPLER_0_58_OR_LATER=yes
|
|
- POPPLER_0_23_OR_LATER=yes
|
|
- POPPLER_0_20_OR_LATER=yes
|
|
- POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
|
|
- POPPLER_HAS_OPTCONTENT=yes
|
|
- CHECK_OTHER_POPPLER_VERSION=no
|
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
|
+ rm -f testpoppler.*
|
|
+ echo '#include <poppler/Object.h>' > testpoppler.cpp
|
|
+ echo 'int main(int argc, char** argv) { Object o(objNull); return 0; }' >> testpoppler.cpp
|
|
+ if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
|
|
+ POPPLER_0_58_OR_LATER=yes
|
|
+ POPPLER_0_23_OR_LATER=yes
|
|
+ POPPLER_0_20_OR_LATER=yes
|
|
+ POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
|
|
+ POPPLER_HAS_OPTCONTENT=yes
|
|
+ CHECK_OTHER_POPPLER_VERSION=no
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
|
$as_echo "yes" >&6; }
|
|
- else
|
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
+ else
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
$as_echo "no" >&6; }
|
|
+ fi
|
|
fi
|
|
|
|
if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
|
|
@@ -34550,6 +34579,8 @@ POPPLER_0_23_OR_LATER=$POPPLER_0_23_OR_LATER
|
|
|
|
POPPLER_0_58_OR_LATER=$POPPLER_0_58_OR_LATER
|
|
|
|
+POPPLER_0_69_OR_LATER=$POPPLER_0_69_OR_LATER
|
|
+
|
|
POPPLER_INC=$POPPLER_INC
|
|
|
|
POPPLER_PLUGIN_LIB=$POPPLER_PLUGIN_LIB
|
|
diff --git a/gdal/configure.ac b/gdal/configure.ac
|
|
index 857f7fdb445..b6e59020c5b 100644
|
|
--- configure.ac
|
|
+++ configure.ac
|
|
@@ -4446,6 +4446,7 @@ POPPLER_BASE_STREAM_HAS_TWO_ARGS=no
|
|
POPPLER_0_20_OR_LATER=no
|
|
POPPLER_0_23_OR_LATER=no
|
|
POPPLER_0_58_OR_LATER=no
|
|
+POPPLER_0_69_OR_LATER=no
|
|
|
|
AC_MSG_CHECKING([for poppler])
|
|
|
|
@@ -4486,21 +4487,45 @@ if test "$with_poppler" != "no" -a "$with_poppler" != ""; then
|
|
|
|
CHECK_OTHER_POPPLER_VERSION=yes
|
|
|
|
- # And now we check if we have Poppler >= 0.58.0
|
|
- AC_MSG_CHECKING([if Object does have new API (>= 0.58.0)])
|
|
- rm -f testpoppler.*
|
|
- echo '#include <poppler/Object.h>' > testpoppler.cpp
|
|
- echo 'int main(int argc, char** argv) { Object o(objNull); return 0; }' >> testpoppler.cpp
|
|
- if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
|
|
- POPPLER_0_58_OR_LATER=yes
|
|
- POPPLER_0_23_OR_LATER=yes
|
|
- POPPLER_0_20_OR_LATER=yes
|
|
- POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
|
|
- POPPLER_HAS_OPTCONTENT=yes
|
|
- CHECK_OTHER_POPPLER_VERSION=no
|
|
- AC_MSG_RESULT([yes])
|
|
- else
|
|
- AC_MSG_RESULT([no])
|
|
+ if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
|
|
+ AC_MSG_CHECKING([if OptionalContent has API >= 0.69.0])
|
|
+ rm -f testpoppler.*
|
|
+ echo '#include <poppler/OptionalContent.h>' > testpoppler.cpp
|
|
+ echo 'int main(int argc, char** argv) {' >> testpoppler.cpp
|
|
+ echo 'OCGs ocg(nullptr, nullptr);' >> testpoppler.cpp
|
|
+ echo 'ocg.getOCGs().size();' >> testpoppler.cpp
|
|
+ echo 'return 0; }' >> testpoppler.cpp
|
|
+ if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
|
|
+ POPPLER_0_69_OR_LATER=yes
|
|
+ POPPLER_0_58_OR_LATER=yes
|
|
+ POPPLER_0_23_OR_LATER=yes
|
|
+ POPPLER_0_20_OR_LATER=yes
|
|
+ POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
|
|
+ POPPLER_HAS_OPTCONTENT=yes
|
|
+ CHECK_OTHER_POPPLER_VERSION=no
|
|
+ AC_MSG_RESULT([yes])
|
|
+ else
|
|
+ AC_MSG_RESULT([no])
|
|
+ fi
|
|
+ fi
|
|
+
|
|
+ if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
|
|
+ # And now we check if we have Poppler >= 0.58.0
|
|
+ AC_MSG_CHECKING([if Object does have new API (>= 0.58.0)])
|
|
+ rm -f testpoppler.*
|
|
+ echo '#include <poppler/Object.h>' > testpoppler.cpp
|
|
+ echo 'int main(int argc, char** argv) { Object o(objNull); return 0; }' >> testpoppler.cpp
|
|
+ if test -z "`${CXX} ${CXXFLAGS} ${CPPFLAGS} testpoppler.cpp -c ${POPPLER_INC} 2>&1`" ; then
|
|
+ POPPLER_0_58_OR_LATER=yes
|
|
+ POPPLER_0_23_OR_LATER=yes
|
|
+ POPPLER_0_20_OR_LATER=yes
|
|
+ POPPLER_BASE_STREAM_HAS_TWO_ARGS=yes
|
|
+ POPPLER_HAS_OPTCONTENT=yes
|
|
+ CHECK_OTHER_POPPLER_VERSION=no
|
|
+ AC_MSG_RESULT([yes])
|
|
+ else
|
|
+ AC_MSG_RESULT([no])
|
|
+ fi
|
|
fi
|
|
|
|
if test "$CHECK_OTHER_POPPLER_VERSION" = "yes"; then
|
|
@@ -4585,6 +4610,7 @@ AC_SUBST(POPPLER_BASE_STREAM_HAS_TWO_ARGS, $POPPLER_BASE_STREAM_HAS_TWO_ARGS)
|
|
AC_SUBST(POPPLER_0_20_OR_LATER, $POPPLER_0_20_OR_LATER)
|
|
AC_SUBST(POPPLER_0_23_OR_LATER, $POPPLER_0_23_OR_LATER)
|
|
AC_SUBST(POPPLER_0_58_OR_LATER, $POPPLER_0_58_OR_LATER)
|
|
+AC_SUBST(POPPLER_0_69_OR_LATER, $POPPLER_0_69_OR_LATER)
|
|
AC_SUBST(POPPLER_INC, $POPPLER_INC)
|
|
AC_SUBST(POPPLER_PLUGIN_LIB, $POPPLER_PLUGIN_LIB)
|
|
|
|
diff --git a/gdal/frmts/pdf/GNUmakefile b/gdal/frmts/pdf/GNUmakefile
|
|
index 2014070eac7..618072f05d3 100644
|
|
--- frmts/pdf/GNUmakefile
|
|
+++ frmts/pdf/GNUmakefile
|
|
@@ -35,6 +35,10 @@ ifeq ($(POPPLER_0_58_OR_LATER),yes)
|
|
CPPFLAGS += -DPOPPLER_0_58_OR_LATER
|
|
endif
|
|
|
|
+ifeq ($(POPPLER_0_69_OR_LATER),yes)
|
|
+CPPFLAGS += -DPOPPLER_0_69_OR_LATER
|
|
+endif
|
|
+
|
|
ifeq ($(HAVE_PODOFO),yes)
|
|
CPPFLAGS += -DHAVE_PODOFO
|
|
endif
|
|
diff --git a/gdal/frmts/pdf/makefile.vc b/gdal/frmts/pdf/makefile.vc
|
|
index b4fa14d0a18..ad76d3de70c 100644
|
|
--- frmts/pdf/makefile.vc
|
|
+++ frmts/pdf/makefile.vc
|
|
@@ -14,7 +14,7 @@ OBJ = $(OBJ) ..\..\ogr\ogrsf_frmts\mem\ogrmemdatasource.obj ..\..\ogr\ogrsf_frmt
|
|
EXTRAFLAGS = -I..\vrt -I..\mem -I..\..\ogr\ogrsf_frmts\mem $(POPPLER_EXTRAFLAGS) $(PODOFO_EXTRAFLAGS) $(PDFIUM_EXTRAFLAGS)
|
|
|
|
!IFDEF POPPLER_ENABLED
|
|
-POPPLER_EXTRAFLAGS = $(POPPLER_CFLAGS) $(POPPLER_HAS_OPTCONTENT_FLAGS) $(POPPLER_BASE_STREAM_HAS_TWO_ARGS_FLAGS) $(POPPLER_0_20_OR_LATER_FLAGS) $(POPPLER_0_23_OR_LATER_FLAGS) $(POPPLER_0_58_OR_LATER_FLAGS) -DHAVE_POPPLER
|
|
+POPPLER_EXTRAFLAGS = $(POPPLER_CFLAGS) $(POPPLER_HAS_OPTCONTENT_FLAGS) $(POPPLER_BASE_STREAM_HAS_TWO_ARGS_FLAGS) $(POPPLER_0_20_OR_LATER_FLAGS) $(POPPLER_0_23_OR_LATER_FLAGS) $(POPPLER_0_58_OR_LATER_FLAGS) $(POPPLER_0_69_OR_LATER_FLAGS) -DHAVE_POPPLER
|
|
|
|
!IFDEF POPPLER_HAS_OPTCONTENT
|
|
POPPLER_HAS_OPTCONTENT_FLAGS = -DPOPPLER_HAS_OPTCONTENT
|
|
@@ -36,6 +36,10 @@ POPPLER_0_23_OR_LATER_FLAGS = -DPOPPLER_0_23_OR_LATER
|
|
POPPLER_0_58_OR_LATER_FLAGS = -DPOPPLER_0_58_OR_LATER
|
|
!ENDIF
|
|
|
|
+!IFDEF POPPLER_0_69_OR_LATER
|
|
+POPPLER_0_69_OR_LATER_FLAGS = -DPOPPLER_0_69_OR_LATER
|
|
+!ENDIF
|
|
+
|
|
!ENDIF
|
|
|
|
!IFDEF PODOFO_ENABLED
|
|
diff --git a/gdal/frmts/pdf/pdfdataset.cpp b/gdal/frmts/pdf/pdfdataset.cpp
|
|
index ee89fd07564..1a56f57ee06 100644
|
|
--- frmts/pdf/pdfdataset.cpp
|
|
+++ frmts/pdf/pdfdataset.cpp
|
|
@@ -3440,10 +3440,16 @@ void PDFDataset::FindLayersPoppler()
|
|
}
|
|
else
|
|
{
|
|
+#ifdef POPPLER_0_69_OR_LATER
|
|
+ for( const auto& refOCGPair: optContentConfig->getOCGs() )
|
|
+ {
|
|
+ auto ocg = refOCGPair.second.get();
|
|
+#else
|
|
GooList* ocgList = optContentConfig->getOCGs();
|
|
for(int i=0;i<ocgList->getLength();i++)
|
|
{
|
|
OptionalContentGroup* ocg = (OptionalContentGroup*) ocgList->get(i);
|
|
+#endif
|
|
if( ocg != nullptr && ocg->getName() != nullptr )
|
|
{
|
|
const char* pszLayerName = (const char*)ocg->getName()->getCString();
|
|
@@ -3472,10 +3478,16 @@ void PDFDataset::TurnLayersOnOffPoppler()
|
|
{
|
|
int i;
|
|
int bAll = EQUAL(pszLayers, "ALL");
|
|
+#ifdef POPPLER_0_69_OR_LATER
|
|
+ for( const auto& refOCGPair: optContentConfig->getOCGs() )
|
|
+ {
|
|
+ auto ocg = refOCGPair.second.get();
|
|
+#else
|
|
GooList* ocgList = optContentConfig->getOCGs();
|
|
for(i=0;i<ocgList->getLength();i++)
|
|
{
|
|
OptionalContentGroup* ocg = (OptionalContentGroup*) ocgList->get(i);
|
|
+#endif
|
|
ocg->setState( (bAll) ? OptionalContentGroup::On : OptionalContentGroup::Off );
|
|
}
|
|
|
|
diff --git a/gdal/nmake.opt b/gdal/nmake.opt
|
|
index a3b88583425..c9ca28d3cd9 100644
|
|
--- nmake.opt
|
|
+++ nmake.opt
|
|
@@ -632,6 +632,7 @@ OCI_INCLUDE = -I$(ORACLE_HOME)\oci\include
|
|
# Uncomment POPPLER_0_20_OR_LATER = YES for Poppler >= 0.20.0
|
|
# Uncomment POPPLER_0_23_OR_LATER = YES for Poppler >= 0.23.0
|
|
# Uncomment POPPLER_0_58_OR_LATER = YES for Poppler >= 0.58.0
|
|
+# Uncomment POPPLER_0_69_OR_LATER = YES for Poppler >= 0.69.0
|
|
#POPPLER_ENABLED = YES
|
|
#POPPLER_CFLAGS = -Ie:/kde/include -Ie:/kde/include/poppler
|
|
#POPPLER_HAS_OPTCONTENT = YES
|
|
@@ -639,6 +640,7 @@ OCI_INCLUDE = -I$(ORACLE_HOME)\oci\include
|
|
#POPPLER_0_20_OR_LATER = YES
|
|
#POPPLER_0_23_OR_LATER = YES
|
|
#POPPLER_0_58_OR_LATER = YES
|
|
+#POPPLER_0_69_OR_LATER = YES
|
|
#POPPLER_LIBS = e:/kde/lib/poppler.lib e:/kde/lib/freetype.lib e:/kde/lib/liblcms-1.lib advapi32.lib gdi32.lib
|
|
|
|
# Uncomment for PDF support
|
|
|
|
--- frmts/pdf/pdfdataset.cpp.orig 2018-11-08 20:25:24.398021193 +0100
|
|
+++ frmts/pdf/pdfdataset.cpp 2018-11-08 20:35:15.305346284 +0100
|
|
@@ -2599,7 +2599,7 @@
|
|
#else
|
|
int nPos,
|
|
#endif
|
|
- char *pszMsg)
|
|
+ const char *pszMsg)
|
|
{
|
|
CPLString osError;
|
|
|
|
@@ -4442,7 +4442,7 @@
|
|
#ifdef HAVE_POPPLER
|
|
if (bUseLib.test(PDFLIB_POPPLER))
|
|
{
|
|
- PDFRectangle* psMediaBox = poPagePoppler->getMediaBox();
|
|
+ const PDFRectangle* psMediaBox = poPagePoppler->getMediaBox();
|
|
dfX1 = psMediaBox->x1;
|
|
dfY1 = psMediaBox->y1;
|
|
dfX2 = psMediaBox->x2;
|
|
@@ -4454,7 +4454,7 @@
|
|
if (bUseLib.test(PDFLIB_PODOFO))
|
|
{
|
|
CPLAssert(poPagePodofo);
|
|
- PoDoFo::PdfRect oMediaBox = poPagePodofo->GetMediaBox();
|
|
+ const PoDoFo::PdfRect oMediaBox = poPagePodofo->GetMediaBox();
|
|
dfX1 = oMediaBox.GetLeft();
|
|
dfY1 = oMediaBox.GetBottom();
|
|
dfX2 = dfX1 + oMediaBox.GetWidth();
|
|
@@ -4780,7 +4780,7 @@
|
|
GooString* poMetadata = poCatalogPoppler->readMetadata();
|
|
if (poMetadata)
|
|
{
|
|
- char* pszContent = poMetadata->getCString();
|
|
+ const char* pszContent = poMetadata->getCString();
|
|
if (pszContent != nullptr &&
|
|
STARTS_WITH(pszContent, "<?xpacket begin="))
|
|
{
|
|
@@ -4784,10 +4784,10 @@
|
|
if (pszContent != nullptr &&
|
|
STARTS_WITH(pszContent, "<?xpacket begin="))
|
|
{
|
|
- char *apszMDList[2];
|
|
+ const char *apszMDList[2];
|
|
apszMDList[0] = pszContent;
|
|
apszMDList[1] = nullptr;
|
|
- poDS->SetMetadata(apszMDList, "xml:XMP");
|
|
+ poDS->SetMetadata((char **) apszMDList, "xml:XMP");
|
|
}
|
|
delete poMetadata;
|
|
}
|