// Copyright (C) 2019 Jakub Melka // // This file is part of PdfForQt. // // PdfForQt is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // PdfForQt is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with PDFForQt. If not, see . #ifndef PDFOPTIONALCONTENT_H #define PDFOPTIONALCONTENT_H #include "pdfobject.h" namespace pdf { class PDFDocument; /// State of the optional content group, or result of expression enum class OCState { ON, OFF, Unknown }; constexpr OCState operator &(OCState left, OCState right) { if (left == OCState::Unknown) { return right; } if (right == OCState::Unknown) { return left; } return (left == OCState::ON && right == OCState::ON) ? OCState::ON : OCState::OFF; } constexpr OCState operator |(OCState left, OCState right) { if (left == OCState::Unknown) { return right; } if (right == OCState::Unknown) { return left; } return (left == OCState::ON || right == OCState::ON) ? OCState::ON : OCState::OFF; } /// Configuration of optional content configuration. class PDFOptionalContentConfiguration { public: enum class BaseState { ON, OFF, Unchanged }; enum class ListMode { AllPages, VisiblePages }; struct UsageApplication { QByteArray event; std::vector optionalContengGroups; std::vector categories; }; /// Creates new optional content properties configuration from the object. If object is not valid, /// then exception is thrown. /// \param document Document /// \param object Object containing documents optional content configuration static PDFOptionalContentConfiguration create(const PDFDocument* document, const PDFObject& object); const QString& getName() const { return m_name; } const QString& getCreator() const { return m_creator; } BaseState getBaseState() const { return m_baseState; } const std::vector& getOnArray() const { return m_OnArray; } const std::vector& getOffArray() const { return m_OffArray; } const std::vector& getIntents() const { return m_intents; } const std::vector& getUsageApplications() const { return m_usageApplications; } const PDFObject& getOrder() const { return m_order; } ListMode getListMode() const { return m_listMode; } const std::vector>& getRadioButtonGroups() const { return m_radioButtonGroups; } const std::vector& getLocked() const { return m_locked; } private: /// Creates usage application /// \param document Document /// \param object Object containing usage application static UsageApplication createUsageApplication(const PDFDocument* document, const PDFObject& object); QString m_name; QString m_creator; BaseState m_baseState = BaseState::ON; std::vector m_OnArray; std::vector m_OffArray; std::vector m_intents; std::vector m_usageApplications; PDFObject m_order; ListMode m_listMode = ListMode::AllPages; std::vector> m_radioButtonGroups; std::vector m_locked; }; /// Class reprezenting optional content group - it contains properties of the group, /// such as name, usage etc. class PDFOptionalContentGroup { public: explicit PDFOptionalContentGroup(); /// Creates optional content group from the object. Object must be valid optional /// content group, if it is invalid, then exception is thrown. /// \param document Document /// \param object Object containing optional content group static PDFOptionalContentGroup create(const PDFDocument* document, const PDFObject& object); PDFObjectReference getReference() const { return m_reference; } const QString& getName() const { return m_name; } const std::vector& getIntents() const { return m_intents; } PDFObject getCreatorInfo() const { return m_creatorInfo; } PDFObject getLanguage() const { return m_language; } PDFReal getUsageZoomMin() const { return m_usageZoomMin; } PDFReal getUsageZoomMax() const { return m_usageZoomMax; } OCState getUsagePrintState() const { return m_usagePrintState; } OCState getUsageViewState() const { return m_usageViewState; } OCState getUsageExportState() const { return m_usageExportState; } private: PDFObjectReference m_reference; QString m_name; std::vector m_intents; PDFObject m_creatorInfo; PDFObject m_language; PDFReal m_usageZoomMin; PDFReal m_usageZoomMax; OCState m_usagePrintState; OCState m_usageViewState; OCState m_usageExportState; }; /// Object containing properties of the optional content of the PDF document. It contains /// for example all documents optional content groups. class PDFOptionalContentProperties { public: explicit PDFOptionalContentProperties() = default; /// Returns, if object is valid - at least one optional content group exists bool isValid() const { return !m_allOptionalContentGroups.empty() && m_allOptionalContentGroups.size() == m_optionalContentGroups.size(); } /// Creates new optional content properties from the object. If object is not valid, /// then exception is thrown. /// \param document Document /// \param object Object containing documents optional content properties static PDFOptionalContentProperties create(const PDFDocument* document, const PDFObject& object); const std::vector& getAllOptionalContentGroups() const { return m_allOptionalContentGroups; } const PDFOptionalContentConfiguration& getDefaultConfiguration() const { return m_defaultConfiguration; } const PDFOptionalContentGroup& getOptionalContentGroup(PDFObjectReference reference) const { return m_optionalContentGroups.at(reference); } private: std::vector m_allOptionalContentGroups; PDFOptionalContentConfiguration m_defaultConfiguration; std::vector m_configurations; std::map m_optionalContentGroups; }; } // namespace pdf #endif // PDFOPTIONALCONTENT_H