/* poppler-annotation.h: qt interface to poppler * Copyright (C) 2006-2008, 2012, 2013, 2018-2022 Albert Astals Cid * Copyright (C) 2006, 2008 Pino Toscano * Copyright (C) 2007, Brad Hards * Copyright (C) 2010, Philip Lorenz * Copyright (C) 2012, 2015, Tobias Koenig * Copyright (C) 2012, Guillermo A. Amaral B. * Copyright (C) 2012, 2013 Fabio D'Urso * Copyright (C) 2013, Anthony Granger * Copyright (C) 2018, Dileep Sankhla * Copyright (C) 2020, Katarina Behrens * Copyright (C) 2020, Klarälvdalens Datakonsult AB, a KDAB Group company, . Work sponsored by Technische Universität Dresden * Copyright (C) 2021, Mahmoud Ahmed Khalil * Adapting code from * Copyright (C) 2004 by Enrico Ros * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _POPPLER_ANNOTATION_H_ #define _POPPLER_ANNOTATION_H_ #include #include #include #include #include #include #include #include #include #include #include #include "poppler-export.h" #include namespace Poppler { class Annotation; class AnnotationPrivate; class AnnotationAppearancePrivate; class TextAnnotationPrivate; class LineAnnotationPrivate; class GeomAnnotationPrivate; class HighlightAnnotationPrivate; class StampAnnotationPrivate; class InkAnnotationPrivate; class LinkAnnotationPrivate; class CaretAnnotationPrivate; class FileAttachmentAnnotationPrivate; class SoundAnnotationPrivate; class MovieAnnotationPrivate; class ScreenAnnotationPrivate; class WidgetAnnotationPrivate; class RichMediaAnnotationPrivate; class EmbeddedFile; class Link; class SoundObject; class MovieObject; class LinkRendition; class Page; /** * \short Helper class for (recursive) Annotation retrieval/storage. * */ class POPPLER_QT5_EXPORT AnnotationUtils { public: /** * Restore an Annotation (with revisions if needed) from the DOM * element \p annElement. * \returns a pointer to the complete Annotation or 0 if element is * invalid. */ Q_DECL_DEPRECATED static Annotation *createAnnotation(const QDomElement &annElement); /** * Save the Annotation \p ann as a child of \p annElement taking * care of saving all revisions if \p ann has any. */ Q_DECL_DEPRECATED static void storeAnnotation(const Annotation *ann, QDomElement &annElement, QDomDocument &document); /** * Returns an element called \p name from the direct children of * \p parentNode or a null element if not found. */ Q_DECL_DEPRECATED static QDomElement findChildElement(const QDomNode &parentNode, const QString &name); }; /** * \short AnnotationAppearance class wrapping Poppler's AP stream object * * The Annotation's Appearance Stream is a Form XObject containing * information required to properly render the Annotation on the document. * * This class wraps Poppler's Object implementing the appearance stream * for the calling annotation. It can be used to preserve the current * Appearance Stream for the calling annotation. * * \since 21.10.0 */ class POPPLER_QT5_EXPORT AnnotationAppearance { friend class Annotation; public: explicit AnnotationAppearance(AnnotationAppearancePrivate *annotationAppearancePrivate); ~AnnotationAppearance(); private: AnnotationAppearancePrivate *d; Q_DISABLE_COPY(AnnotationAppearance) }; /** * \short Annotation class holding properties shared by all annotations. * * An Annotation is an object (text note, highlight, sound, popup window, ..) * contained by a Page in the document. * * \warning Different Annotation objects might point to the same annotation. * * \section annotCreation How to add annotations * * Create an Annotation object of the desired subclass (for example * TextAnnotation) and set its properties: * @code * Poppler::TextAnnotation* myann = new Poppler::TextAnnotation(Poppler::TextAnnotation::InPlace); * myann->setBoundary(QRectF(0.1, 0.1, 0.2, 0.2)); // normalized coordinates: (0,0) is top-left, (1,1) is bottom-right * myann->setContents("Hello, world!"); * @endcode * \note Always set a boundary rectangle, or nothing will be shown! * * Obtain a pointer to the Page where you want to add the annotation (refer to * \ref req for instructions) and add the annotation: * @code * Poppler::Page* mypage = ...; * mypage->addAnnotation(myann); * @endcode * * You can keep on editing the annotation after it has been added to the page: * @code * myann->setContents("World, hello!"); // Let's change text... * myann->setAuthor("Your name here"); // ...and set an author too * @endcode * * When you're done with editing the annotation, you must destroy the Annotation * object: * @code * delete myann; * @endcode * * Use the PDFConverter class to save the modified document. * * \section annotFixedRotation FixedRotation flag specifics * * According to the PDF specification, annotations whose * Annotation::FixedRotation flag is set must always be shown in their original * orientation, no matter what the current rendering rotation or the page's * Page::orientation() values are. In comparison with regular annotations, such * annotations should therefore be transformed by an extra rotation at rendering * time to "undo" such context-related rotations, which is equal to * -(rendering_rotation + page_orientation). The rotation pivot * is the top-left corner of the boundary rectangle. * * In practice, %Poppler's \ref Page::renderToImage only "unrotates" the * page orientation, and does not unrotate the rendering rotation. * This ensures consistent renderings at different Page::Rotation values: * annotations are always positioned as if they were being positioned at the * default page orientation. * * Just like regular annotations, %Poppler Qt5 exposes normalized coordinates * relative to the page's default orientation. However, behind the scenes, the * coordinate system is different and %Poppler transparently transforms each * shape. If you never call either Annotation::setFlags or * Annotation::setBoundary, you don't need to worry about this; but if you do * call them, then you need to adhere to the following rules: * - Whenever you toggle the Annotation::FixedRotation flag, you must * set again the boundary rectangle first, and then you must set * again any other geometry-related property. * - Whenever you modify the boundary rectangle of an annotation whose * Annotation::FixedRotation flag is set, you must set again any other * geometry-related property. * * These two rules are necessary to make %Poppler's transparent coordinate * conversion work properly. */ class POPPLER_QT5_EXPORT Annotation { friend class AnnotationUtils; friend class LinkMovie; friend class LinkRendition; public: // enum definitions /** * Annotation subclasses * * \sa subType() */ // WARNING!!! oKular uses that very same values so if you change them notify the author! enum SubType { AText = 1, ///< TextAnnotation ALine = 2, ///< LineAnnotation AGeom = 3, ///< GeomAnnotation AHighlight = 4, ///< HighlightAnnotation AStamp = 5, ///< StampAnnotation AInk = 6, ///< InkAnnotation ALink = 7, ///< LinkAnnotation ACaret = 8, ///< CaretAnnotation AFileAttachment = 9, ///< FileAttachmentAnnotation ASound = 10, ///< SoundAnnotation AMovie = 11, ///< MovieAnnotation AScreen = 12, ///< ScreenAnnotation \since 0.20 AWidget = 13, ///< WidgetAnnotation \since 0.22 ARichMedia = 14, ///< RichMediaAnnotation \since 0.36 A_BASE = 0 }; /** * Annotation flags * * They can be OR'd together (e.g. Annotation::FixedRotation | Annotation::DenyPrint). * * \sa flags(), setFlags(int) */ // NOTE: Only flags that are known to work are documented enum Flag { Hidden = 1, ///< Do not display or print the annotation FixedSize = 2, FixedRotation = 4, ///< Do not rotate the annotation according to page orientation and rendering rotation \warning Extra care is needed with this flag: see \ref annotFixedRotation DenyPrint = 8, ///< Do not print the annotation DenyWrite = 16, DenyDelete = 32, ToggleHidingOnMouse = 64, External = 128 }; enum LineStyle { Solid = 1, Dashed = 2, Beveled = 4, Inset = 8, Underline = 16 }; enum LineEffect { NoEffect = 1, Cloudy = 2 }; enum RevScope { Root = 0 /** \since 0.20 */, Reply = 1, Group = 2, Delete = 4 }; enum RevType { None = 1, Marked = 2, Unmarked = 4, Accepted = 8, Rejected = 16, Cancelled = 32, Completed = 64 }; /** * Returns the author of the annotation. */ QString author() const; /** * Sets a new author for the annotation. */ void setAuthor(const QString &author); QString contents() const; void setContents(const QString &contents); /** * Returns the unique name (ID) of the annotation. */ QString uniqueName() const; /** * Sets a new unique name for the annotation. * * \note no check of the new uniqueName is done */ void setUniqueName(const QString &uniqueName); QDateTime modificationDate() const; void setModificationDate(const QDateTime &date); QDateTime creationDate() const; void setCreationDate(const QDateTime &date); /** * Returns this annotation's flags * * \sa Flag, setFlags(int) */ int flags() const; /** * Sets this annotation's flags * * \sa Flag, flags(), \ref annotFixedRotation */ void setFlags(int flags); /** * Returns this annotation's boundary rectangle in normalized coordinates * * \sa setBoundary(const QRectF&) */ QRectF boundary() const; /** * Sets this annotation's boundary rectangle * * The boundary rectangle is the smallest rectangle that contains the * annotation. * * \warning This property is mandatory: you must always set this. * * \sa boundary(), \ref annotFixedRotation */ void setBoundary(const QRectF &boundary); /** * \short Container class for Annotation style information * * \since 0.20 */ class POPPLER_QT5_EXPORT Style { public: Style(); Style(const Style &other); Style &operator=(const Style &other); ~Style(); // appearance properties QColor color() const; // black void setColor(const QColor &color); double opacity() const; // 1.0 void setOpacity(double opacity); // pen properties double width() const; // 1.0 void setWidth(double width); LineStyle lineStyle() const; // LineStyle::Solid void setLineStyle(LineStyle style); double xCorners() const; // 0.0 void setXCorners(double radius); double yCorners() const; // 0.0 void setYCorners(double radius); const QVector &dashArray() const; // [ 3 ] void setDashArray(const QVector &array); // pen effects LineEffect lineEffect() const; // LineEffect::NoEffect void setLineEffect(LineEffect effect); double effectIntensity() const; // 1.0 void setEffectIntensity(double intens); private: class Private; QSharedDataPointer d; }; /// \since 0.20 Style style() const; /// \since 0.20 void setStyle(const Style &style); /** * \short Container class for Annotation pop-up window information * * \since 0.20 */ class POPPLER_QT5_EXPORT Popup { public: Popup(); Popup(const Popup &other); Popup &operator=(const Popup &other); ~Popup(); // window state (Hidden, FixedRotation, Deny* flags allowed) int flags() const; // -1 (never initialized) -> 0 (if inited and shown) void setFlags(int flags); // geometric properties QRectF geometry() const; // no default void setGeometry(const QRectF &geom); // window contents/override properties QString title() const; // '' text in the titlebar (overrides author) void setTitle(const QString &title); QString summary() const; // '' short description (displayed if not empty) void setSummary(const QString &summary); QString text() const; // '' text for the window (overrides annot->contents) void setText(const QString &text); private: class Private; QSharedDataPointer d; }; /// \since 0.20 Popup popup() const; /// \warning Currently does nothing \since 0.20 void setPopup(const Popup &popup); /// \since 0.20 RevScope revisionScope() const; // Root /// \since 0.20 RevType revisionType() const; // None /** * Returns the revisions of this annotation * * \note The caller owns the returned annotations and they should * be deleted when no longer required. * * \since 0.20 */ QList revisions() const; /** * The type of the annotation. */ virtual SubType subType() const = 0; /** * Returns the current appearance stream of this annotation. * * \since 21.10.0 */ std::unique_ptr annotationAppearance() const; /** * Sets the annotation's appearance stream with the @p annotationAppearance. * * \since 21.10.0 */ void setAnnotationAppearance(const AnnotationAppearance &annotationAppearance); /** * Destructor. */ virtual ~Annotation(); /** * Describes the flags from an annotations 'AA' dictionary. * * This flag is used by the additionalAction() method for ScreenAnnotation * and WidgetAnnotation. * * \since 0.22 */ enum AdditionalActionType { CursorEnteringAction, ///< Performed when the cursor enters the annotation's active area CursorLeavingAction, ///< Performed when the cursor exists the annotation's active area MousePressedAction, ///< Performed when the mouse button is pressed inside the annotation's active area MouseReleasedAction, ///< Performed when the mouse button is released inside the annotation's active area FocusInAction, ///< Performed when the annotation receives the input focus FocusOutAction, ///< Performed when the annotation loses the input focus PageOpeningAction, ///< Performed when the page containing the annotation is opened PageClosingAction, ///< Performed when the page containing the annotation is closed PageVisibleAction, ///< Performed when the page containing the annotation becomes visible PageInvisibleAction ///< Performed when the page containing the annotation becomes invisible }; protected: /// \cond PRIVATE explicit Annotation(AnnotationPrivate &dd); Annotation(AnnotationPrivate &dd, const QDomNode &annNode); void storeBaseAnnotationProperties(QDomNode &annNode, QDomDocument &document) const; Q_DECLARE_PRIVATE(Annotation) QExplicitlySharedDataPointer d_ptr; /// \endcond private: virtual void store(QDomNode &parentNode, QDomDocument &document) const = 0; Q_DISABLE_COPY(Annotation) }; /** * \short Annotation containing text. * * A text annotation is an object showing some text directly on the page, or * linked to the contents using an icon shown on a page. */ class POPPLER_QT5_EXPORT TextAnnotation : public Annotation { friend class AnnotationUtils; friend class AnnotationPrivate; public: // local enums enum TextType { Linked, InPlace }; enum InplaceIntent { Unknown, Callout, TypeWriter }; explicit TextAnnotation(TextType type); ~TextAnnotation() override; SubType subType() const override; /** The type of text annotation represented by this object */ TextType textType() const; /** The name of the icon for this text annotation. Standard names for text annotation icons are: - Comment - Help - Insert - Key - NewParagraph - Note (this is the default icon to use) - Paragraph */ QString textIcon() const; /** Set the name of the icon to use for this text annotation. \sa textIcon for the list of standard names */ void setTextIcon(const QString &icon); QFont textFont() const; void setTextFont(const QFont &font); /// Default text color is black \since 0.69 QColor textColor() const; /// \since 0.69 void setTextColor(const QColor &color); // 0:left, 1:center, 2:right int inplaceAlign() const; void setInplaceAlign(int align); QPointF calloutPoint(int id) const; /// \since 0.20 QVector calloutPoints() const; /// \since 0.20 void setCalloutPoints(const QVector &points); InplaceIntent inplaceIntent() const; void setInplaceIntent(InplaceIntent intent); private: explicit TextAnnotation(const QDomNode &node); explicit TextAnnotation(TextAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; void setTextType(TextType type); Q_DECLARE_PRIVATE(TextAnnotation) Q_DISABLE_COPY(TextAnnotation) }; /** * \short Polygon/polyline annotation. * * This annotation represents a polygon (or polyline) to be drawn on a page. */ class POPPLER_QT5_EXPORT LineAnnotation : public Annotation { friend class AnnotationUtils; friend class AnnotationPrivate; public: // local enums /// \since 0.20 enum LineType { StraightLine, Polyline }; enum TermStyle { Square, Circle, Diamond, OpenArrow, ClosedArrow, None, Butt, ROpenArrow, RClosedArrow, Slash }; enum LineIntent { Unknown, Arrow, Dimension, PolygonCloud }; /// \since 0.20 explicit LineAnnotation(LineType type); ~LineAnnotation() override; SubType subType() const override; /// \since 0.20 LineType lineType() const; QLinkedList linePoints() const; void setLinePoints(const QLinkedList &points); TermStyle lineStartStyle() const; void setLineStartStyle(TermStyle style); TermStyle lineEndStyle() const; void setLineEndStyle(TermStyle style); bool isLineClosed() const; void setLineClosed(bool closed); QColor lineInnerColor() const; void setLineInnerColor(const QColor &color); double lineLeadingForwardPoint() const; void setLineLeadingForwardPoint(double point); double lineLeadingBackPoint() const; void setLineLeadingBackPoint(double point); bool lineShowCaption() const; void setLineShowCaption(bool show); LineIntent lineIntent() const; void setLineIntent(LineIntent intent); private: explicit LineAnnotation(const QDomNode &node); explicit LineAnnotation(LineAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; void setLineType(LineType type); Q_DECLARE_PRIVATE(LineAnnotation) Q_DISABLE_COPY(LineAnnotation) }; /** * \short Geometric annotation. * * The geometric annotation represents a geometric figure, like a rectangle or * an ellipse. */ class POPPLER_QT5_EXPORT GeomAnnotation : public Annotation { friend class AnnotationUtils; friend class AnnotationPrivate; public: GeomAnnotation(); ~GeomAnnotation() override; SubType subType() const override; // common enums enum GeomType { InscribedSquare, InscribedCircle }; GeomType geomType() const; void setGeomType(GeomType type); QColor geomInnerColor() const; void setGeomInnerColor(const QColor &color); private: explicit GeomAnnotation(const QDomNode &node); explicit GeomAnnotation(GeomAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; Q_DECLARE_PRIVATE(GeomAnnotation) Q_DISABLE_COPY(GeomAnnotation) }; /** * \short Text highlight annotation. * * The highlight annotation represents some areas of text being "highlighted". */ class POPPLER_QT5_EXPORT HighlightAnnotation : public Annotation { friend class AnnotationUtils; friend class AnnotationPrivate; public: HighlightAnnotation(); ~HighlightAnnotation() override; SubType subType() const override; /** The type of highlight */ enum HighlightType { Highlight, ///< highlighter pen style annotation Squiggly, ///< jagged or squiggly underline Underline, ///< straight line underline StrikeOut ///< straight line through-line }; /** Structure corresponding to a QuadPoints array. This matches a quadrilateral that describes the area around a word (or set of words) that are to be highlighted. */ struct Quad { QPointF points[4]; // 8 valid coords bool capStart; // false (vtx 1-4) [K] bool capEnd; // false (vtx 2-3) [K] double feather; // 0.1 (in range 0..1) [K] }; /** The type (style) of highlighting to use for this area or these areas. */ HighlightType highlightType() const; /** Set the type of highlighting to use for the given area or areas. */ void setHighlightType(HighlightType type); /** The list of areas to highlight. */ QList highlightQuads() const; /** Set the areas to highlight. */ void setHighlightQuads(const QList &quads); private: explicit HighlightAnnotation(const QDomNode &node); explicit HighlightAnnotation(HighlightAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; Q_DECLARE_PRIVATE(HighlightAnnotation) Q_DISABLE_COPY(HighlightAnnotation) }; /** * \short Stamp annotation. * * A simple annotation drawing a stamp on a page. */ class POPPLER_QT5_EXPORT StampAnnotation : public Annotation { friend class AnnotationUtils; friend class AnnotationPrivate; public: StampAnnotation(); ~StampAnnotation() override; SubType subType() const override; /** The name of the icon for this stamp annotation. Standard names for stamp annotation icons are: - Approved - AsIs - Confidential - Departmental - Draft (this is the default icon type) - Experimental - Expired - Final - ForComment - ForPublicRelease - NotApproved - NotForPublicRelease - Sold - TopSecret */ QString stampIconName() const; /** Set the icon type for this stamp annotation. \sa stampIconName for the list of standard icon names */ void setStampIconName(const QString &name); /** Set a custom icon for this stamp annotation. \since 21.10.0 */ void setStampCustomImage(const QImage &image); private: explicit StampAnnotation(const QDomNode &node); explicit StampAnnotation(StampAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; Q_DECLARE_PRIVATE(StampAnnotation) Q_DISABLE_COPY(StampAnnotation) }; /** * \short Ink Annotation. * * Annotation representing an ink path on a page. */ class POPPLER_QT5_EXPORT InkAnnotation : public Annotation { friend class AnnotationUtils; friend class AnnotationPrivate; public: InkAnnotation(); ~InkAnnotation() override; SubType subType() const override; QList> inkPaths() const; void setInkPaths(const QList> &paths); private: explicit InkAnnotation(const QDomNode &node); void store(QDomNode &parentNode, QDomDocument &document) const override; explicit InkAnnotation(InkAnnotationPrivate &dd); Q_DECLARE_PRIVATE(InkAnnotation) Q_DISABLE_COPY(InkAnnotation) }; class POPPLER_QT5_EXPORT LinkAnnotation : public Annotation { friend class AnnotationUtils; friend class AnnotationPrivate; public: ~LinkAnnotation() override; SubType subType() const override; // local enums enum HighlightMode { None, Invert, Outline, Push }; /** \since 0.20 */ Link *linkDestination() const; void setLinkDestination(Link *link); HighlightMode linkHighlightMode() const; void setLinkHighlightMode(HighlightMode mode); QPointF linkRegionPoint(int id) const; // TODO Next ABI break, remove ref from point void setLinkRegionPoint(int id, const QPointF &point); private: LinkAnnotation(); explicit LinkAnnotation(const QDomNode &node); explicit LinkAnnotation(LinkAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; Q_DECLARE_PRIVATE(LinkAnnotation) Q_DISABLE_COPY(LinkAnnotation) }; /** * \short Caret annotation. * * The caret annotation represents a symbol to indicate the presence of text. */ class POPPLER_QT5_EXPORT CaretAnnotation : public Annotation { friend class AnnotationUtils; friend class AnnotationPrivate; public: CaretAnnotation(); ~CaretAnnotation() override; SubType subType() const override; /** * The symbols for the caret annotation. */ enum CaretSymbol { None, P }; CaretSymbol caretSymbol() const; void setCaretSymbol(CaretSymbol symbol); private: explicit CaretAnnotation(const QDomNode &node); explicit CaretAnnotation(CaretAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; Q_DECLARE_PRIVATE(CaretAnnotation) Q_DISABLE_COPY(CaretAnnotation) }; /** * \short File attachment annotation. * * The file attachment annotation represents a file embedded in the document. * * \since 0.10 */ class POPPLER_QT5_EXPORT FileAttachmentAnnotation : public Annotation { friend class AnnotationPrivate; public: ~FileAttachmentAnnotation() override; SubType subType() const override; /** * Returns the name of the icon of this annotation. */ QString fileIconName() const; /** * Sets a new name for the icon of this annotation. */ void setFileIconName(const QString &icon); /** * Returns the EmbeddedFile of this annotation. */ EmbeddedFile *embeddedFile() const; /** * Sets a new EmbeddedFile for this annotation. * * \note FileAttachmentAnnotation takes ownership of the object */ void setEmbeddedFile(EmbeddedFile *ef); private: FileAttachmentAnnotation(); explicit FileAttachmentAnnotation(const QDomNode &node); explicit FileAttachmentAnnotation(FileAttachmentAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; Q_DECLARE_PRIVATE(FileAttachmentAnnotation) Q_DISABLE_COPY(FileAttachmentAnnotation) }; /** * \short Sound annotation. * * The sound annotation represents a sound to be played when activated. * * \since 0.10 */ class POPPLER_QT5_EXPORT SoundAnnotation : public Annotation { friend class AnnotationPrivate; public: ~SoundAnnotation() override; SubType subType() const override; /** * Returns the name of the icon of this annotation. */ QString soundIconName() const; /** * Sets a new name for the icon of this annotation. */ void setSoundIconName(const QString &icon); /** * Returns the SoundObject of this annotation. */ SoundObject *sound() const; /** * Sets a new SoundObject for this annotation. * * \note SoundAnnotation takes ownership of the object */ void setSound(SoundObject *s); private: SoundAnnotation(); explicit SoundAnnotation(const QDomNode &node); explicit SoundAnnotation(SoundAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; Q_DECLARE_PRIVATE(SoundAnnotation) Q_DISABLE_COPY(SoundAnnotation) }; /** * \short Movie annotation. * * The movie annotation represents a movie to be played when activated. * * \since 0.10 */ class POPPLER_QT5_EXPORT MovieAnnotation : public Annotation { friend class AnnotationPrivate; public: ~MovieAnnotation() override; SubType subType() const override; /** * Returns the MovieObject of this annotation. */ MovieObject *movie() const; /** * Sets a new MovieObject for this annotation. * * \note MovieAnnotation takes ownership of the object */ void setMovie(MovieObject *movie); /** * Returns the title of the movie of this annotation. */ QString movieTitle() const; /** * Sets a new title for the movie of this annotation. */ void setMovieTitle(const QString &title); private: MovieAnnotation(); explicit MovieAnnotation(const QDomNode &node); explicit MovieAnnotation(MovieAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; Q_DECLARE_PRIVATE(MovieAnnotation) Q_DISABLE_COPY(MovieAnnotation) }; /** * \short Screen annotation. * * The screen annotation represents a screen to be played when activated. * * \since 0.20 */ class POPPLER_QT5_EXPORT ScreenAnnotation : public Annotation { friend class AnnotationPrivate; public: ~ScreenAnnotation() override; SubType subType() const override; /** * Returns the LinkRendition of this annotation. */ LinkRendition *action() const; /** * Sets a new LinkRendition for this annotation. * * \note ScreenAnnotation takes ownership of the object */ void setAction(LinkRendition *action); /** * Returns the title of the screen of this annotation. */ QString screenTitle() const; /** * Sets a new title for the screen of this annotation. */ void setScreenTitle(const QString &title); /** * Returns the additional action of the given @p type fo the annotation or * @c 0 if no action has been defined. * * \since 0.22 */ Link *additionalAction(AdditionalActionType type) const; private: ScreenAnnotation(); explicit ScreenAnnotation(ScreenAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; // stub Q_DECLARE_PRIVATE(ScreenAnnotation) Q_DISABLE_COPY(ScreenAnnotation) }; /** * \short Widget annotation. * * The widget annotation represents a widget (form field) on a page. * * \note This class is just provided for consistency of the annotation API, * use the FormField classes to get all the form-related information. * * \since 0.22 */ class POPPLER_QT5_EXPORT WidgetAnnotation : public Annotation { friend class AnnotationPrivate; public: ~WidgetAnnotation() override; SubType subType() const override; /** * Returns the additional action of the given @p type fo the annotation or * @c 0 if no action has been defined. * * \since 0.22 */ Link *additionalAction(AdditionalActionType type) const; private: WidgetAnnotation(); explicit WidgetAnnotation(WidgetAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; // stub Q_DECLARE_PRIVATE(WidgetAnnotation) Q_DISABLE_COPY(WidgetAnnotation) }; /** * \short RichMedia annotation. * * The RichMedia annotation represents a video or sound on a page. * * \since 0.36 */ class POPPLER_QT5_EXPORT RichMediaAnnotation : public Annotation { friend class AnnotationPrivate; public: ~RichMediaAnnotation() override; SubType subType() const override; /** * The params object of a RichMediaAnnotation::Instance object. * * The params object provides media specific parameters, to play * back the media inside the PDF viewer. * * At the moment only parameters for flash player are supported. */ class POPPLER_QT5_EXPORT Params { friend class AnnotationPrivate; public: Params(); ~Params(); /** * Returns the parameters for the flash player. */ QString flashVars() const; private: void setFlashVars(const QString &flashVars); class Private; QScopedPointer d; }; /** * The instance object of a RichMediaAnnotation::Configuration object. * * The instance object represents one media object, that should be shown * on the page. It has a media type and a Params object, to define the * media specific parameters. */ class POPPLER_QT5_EXPORT Instance { friend class AnnotationPrivate; public: /** * Describes the media type of the instance. */ enum Type { Type3D, ///< A 3D media file. TypeFlash, ///< A Flash media file. TypeSound, ///< A sound media file. TypeVideo ///< A video media file. }; Instance(); ~Instance(); /** * Returns the media type of the instance. */ Type type() const; /** * Returns the params object of the instance or @c 0 if it doesn't exist. */ RichMediaAnnotation::Params *params() const; private: void setType(Type type); void setParams(RichMediaAnnotation::Params *params); class Private; QScopedPointer d; }; /** * The configuration object of a RichMediaAnnotation::Content object. * * The configuration object provides access to the various Instance objects * of the rich media annotation. */ class POPPLER_QT5_EXPORT Configuration { friend class AnnotationPrivate; public: /** * Describes the media type of the configuration. */ enum Type { Type3D, ///< A 3D media file. TypeFlash, ///< A Flash media file. TypeSound, ///< A sound media file. TypeVideo ///< A video media file. }; Configuration(); ~Configuration(); /** * Returns the media type of the configuration. */ Type type() const; /** * Returns the name of the configuration. */ QString name() const; /** * Returns the list of Instance objects of the configuration. */ QList instances() const; private: void setType(Type type); void setName(const QString &name); void setInstances(const QList &instances); class Private; QScopedPointer d; }; /** * The asset object of a RichMediaAnnotation::Content object. * * The asset object provides a mapping between identifier name, as * used in the flash vars string of RichMediaAnnotation::Params, and the * associated file spec object. */ class POPPLER_QT5_EXPORT Asset { friend class AnnotationPrivate; public: Asset(); ~Asset(); /** * Returns the identifier name of the asset. */ QString name() const; /** * Returns the embedded file the asset points to. */ EmbeddedFile *embeddedFile() const; private: void setName(const QString &name); void setEmbeddedFile(EmbeddedFile *embeddedFile); class Private; QScopedPointer d; }; /** * The content object of a RichMediaAnnotation. * * The content object provides access to the list of configurations * and assets of the rich media annotation. */ class POPPLER_QT5_EXPORT Content { friend class AnnotationPrivate; public: Content(); ~Content(); /** * Returns the list of configuration objects of the content object. */ QList configurations() const; /** * Returns the list of asset objects of the content object. */ QList assets() const; private: void setConfigurations(const QList &configurations); void setAssets(const QList &assets); class Private; QScopedPointer d; }; /** * The activation object of the RichMediaAnnotation::Settings object. * * The activation object is a wrapper around the settings for the activation * state. At the moment it provides only the activation condition. */ class POPPLER_QT5_EXPORT Activation { friend class AnnotationPrivate; public: /** * Describes the condition for activating the rich media. */ enum Condition { PageOpened, ///< Activate when page is opened. PageVisible, ///< Activate when page becomes visible. UserAction ///< Activate when user interacts with the annotation. }; Activation(); ~Activation(); /** * Returns the activation condition. */ Condition condition() const; private: void setCondition(Condition condition); class Private; QScopedPointer d; }; /** * The deactivation object of the RichMediaAnnotation::Settings object. * * The deactivation object is a wrapper around the settings for the deactivation * state. At the moment it provides only the deactivation condition. */ class POPPLER_QT5_EXPORT Deactivation { friend class AnnotationPrivate; public: /** * Describes the condition for deactivating the rich media. */ enum Condition { PageClosed, ///< Deactivate when page is closed. PageInvisible, ///< Deactivate when page becomes invisible. UserAction ///< Deactivate when user interacts with the annotation. }; Deactivation(); ~Deactivation(); /** * Returns the deactivation condition. */ Condition condition() const; private: void setCondition(Condition condition); class Private; QScopedPointer d; }; /** * The settings object of a RichMediaAnnotation. * * The settings object provides access to the configuration objects * for annotation activation and deactivation. */ class POPPLER_QT5_EXPORT Settings { friend class AnnotationPrivate; public: Settings(); ~Settings(); /** * Returns the Activation object of the settings object or @c 0 if it doesn't exist. */ RichMediaAnnotation::Activation *activation() const; /** * Returns the Deactivation object of the settings object or @c 0 if it doesn't exist. */ RichMediaAnnotation::Deactivation *deactivation() const; private: void setActivation(RichMediaAnnotation::Activation *activation); void setDeactivation(RichMediaAnnotation::Deactivation *deactivation); class Private; QScopedPointer d; }; /** * Returns the Settings object of the rich media annotation or @c 0 if it doesn't exist. */ RichMediaAnnotation::Settings *settings() const; /** * Returns the Content object of the rich media annotation or @c 0 if it doesn't exist. */ RichMediaAnnotation::Content *content() const; private: void setSettings(RichMediaAnnotation::Settings *settings); void setContent(RichMediaAnnotation::Content *content); RichMediaAnnotation(); explicit RichMediaAnnotation(const QDomNode &node); explicit RichMediaAnnotation(RichMediaAnnotationPrivate &dd); void store(QDomNode &parentNode, QDomDocument &document) const override; Q_DECLARE_PRIVATE(RichMediaAnnotation) Q_DISABLE_COPY(RichMediaAnnotation) }; } #endif