From 0c0b9ea5a5d6bbef938de8a77c5b00cb228b902d Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 12 Oct 2018 19:02:40 +0200 Subject: [PATCH] Add support for Poppler 0.69 (fixes #1004) --- GDALmake.opt.in | 1 + configure | 61 ++++++++++++++++++++++++++--------- configure.ac | 56 +++++++++++++++++++++++--------- frmts/pdf/GNUmakefile | 4 +++ frmts/pdf/makefile.vc | 6 +++- frmts/pdf/pdfdataset.cpp | 12 +++++++ nmake.opt | 2 ++ 7 files changed, 111 insertions(+), 31 deletions(-) diff --git a/GDALmake.opt.in b/GDALmake.opt.in index 30749ae982a..f9ab41fd124 100644 --- a/GDALmake.opt.in +++ b/GDALmake.opt.in @@ -481,6 +481,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/configure b/configure index 050bc79ac97..a8472ba8c2d 100755 --- a/configure +++ b/configure @@ -669,6 +669,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 @@ -34798,6 +34799,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; } @@ -34840,24 +34842,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 ' > 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 ' > 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 ' > 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 @@ -34962,6 +34991,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/configure.ac b/configure.ac index 4b8ab911cec..0c588e04f03 100644 --- a/configure.ac +++ b/configure.ac @@ -4496,6 +4496,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]) @@ -4536,21 +4537,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 ' > 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 ' > 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 ' > 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 @@ -4635,6 +4660,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/frmts/pdf/GNUmakefile b/frmts/pdf/GNUmakefile index 2c332d2798f..6a267f529b2 100644 --- a/frmts/pdf/GNUmakefile +++ b/frmts/pdf/GNUmakefile @@ -34,6 +34,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/frmts/pdf/makefile.vc b/frmts/pdf/makefile.vc index b4fa14d0a18..ad76d3de70c 100644 --- a/frmts/pdf/makefile.vc +++ b/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/frmts/pdf/pdfdataset.cpp b/frmts/pdf/pdfdataset.cpp index ee89fd07564..1a56f57ee06 100644 --- a/frmts/pdf/pdfdataset.cpp +++ b/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;igetLength();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;igetLength();i++) { OptionalContentGroup* ocg = (OptionalContentGroup*) ocgList->get(i); +#endif ocg->setState( (bAll) ? OptionalContentGroup::On : OptionalContentGroup::Off ); } diff --git a/nmake.opt b/nmake.opt index 682d766d93e..1eb049038c8 100644 --- a/nmake.opt +++ b/nmake.opt @@ -639,6 +639,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 @@ -646,6 +647,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