diff --git a/generators/poppler/CMakeLists.txt b/generators/poppler/CMakeLists.txt index 34deae9bf..ef58428f9 100644 --- a/generators/poppler/CMakeLists.txt +++ b/generators/poppler/CMakeLists.txt @@ -35,6 +35,16 @@ int main() } " HAVE_POPPLER_FANCY_SIGNATURE) +check_cxx_source_compiles(" +#include +int main() +{ + Poppler::Document *doc = Poppler::Document::load(\"\", nullptr, nullptr); + doc->xrefWasReconstructed(); + return 0; +} +" HAVE_POPPLER_RECONSTRUCTION_CALLBACK) + configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/config-okular-poppler.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-okular-poppler.h diff --git a/generators/poppler/config-okular-poppler.h.cmake b/generators/poppler/config-okular-poppler.h.cmake index 704328004..4d986d67b 100644 --- a/generators/poppler/config-okular-poppler.h.cmake +++ b/generators/poppler/config-okular-poppler.h.cmake @@ -6,3 +6,7 @@ /* Defined if we have the pdf fancy signature feature in the Poppler library */ #cmakedefine HAVE_POPPLER_FANCY_SIGNATURE 1 + +/* Defined if we have Poppler version that notifies for XRef Table reconstruction */ +#cmakedefine HAVE_POPPLER_RECONSTRUCTION_CALLBACK 1 + diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp index e88330674..db71f349e 100644 --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -66,6 +66,8 @@ #include "pdfsignatureutils.h" #include "popplerembeddedfile.h" +#include + Q_DECLARE_METATYPE(Poppler::Annotation *) Q_DECLARE_METATYPE(Poppler::FontInfo) Q_DECLARE_METATYPE(const Poppler::LinkMovie *) @@ -546,6 +548,7 @@ PDFGenerator::PDFGenerator(QObject *parent, const QVariantList &args) : Generator(parent, args) , pdfdoc(nullptr) , docSynopsisDirty(true) + , xrefReconstructed(false) , docEmbeddedFilesDirty(true) , nextFontPage(0) , annotProxy(nullptr) @@ -624,6 +627,16 @@ Okular::Document::OpenResult PDFGenerator::init(QVector &pagesVe } } + xrefReconstructed = false; +#ifdef HAVE_POPPLER_RECONSTRUCTION_CALLBACK + if (pdfdoc->xrefWasReconstructed()) { + xrefReconstructionHandler(); + } else { + std::function cb = std::bind(&PDFGenerator::xrefReconstructionHandler, this); + pdfdoc->setXRefReconstructedCallback(cb); + } +#endif + // build Pages (currentPage was set -1 by deletePages) int pageCount = pdfdoc->numPages(); if (pageCount < 0) { @@ -1931,6 +1944,15 @@ Okular::CertificateStore *PDFGenerator::certificateStore() const #endif } +void PDFGenerator::xrefReconstructionHandler() +{ + if (!xrefReconstructed) { + qCDebug(OkularPdfDebug) << "XRef Table of the document has been reconstructed"; + xrefReconstructed = true; + emit warning(i18n("Some errors were found in the document, Okular might not be able to show the content correctly"), 5000); + } +} + #include "generator_pdf.moc" Q_LOGGING_CATEGORY(OkularPdfDebug, "org.kde.okular.generators.pdf", QtWarningMsg) diff --git a/generators/poppler/generator_pdf.h b/generators/poppler/generator_pdf.h index ec7c6ddc9..e3a5e5ba4 100644 --- a/generators/poppler/generator_pdf.h +++ b/generators/poppler/generator_pdf.h @@ -136,8 +136,11 @@ private: // poppler dependent stuff Poppler::Document *pdfdoc; + void xrefReconstructionHandler(); + // misc variables for document info and synopsis caching bool docSynopsisDirty; + bool xrefReconstructed; Okular::DocumentSynopsis docSyn; mutable bool docEmbeddedFilesDirty; mutable QList docEmbeddedFiles;