/* SPDX-FileCopyrightText: 2006 Pino Toscano SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef _KDJVU_ #define _KDJVU_ #include #include #include #include #include #include #include class QDomDocument; class QFile; #ifndef MINIEXP_H typedef struct miniexp_s *miniexp_t; #endif /** * @brief Qt (KDE) encapsulation of the DjVuLibre */ class KDjVu { public: KDjVu(); ~KDjVu(); KDjVu(const KDjVu &) = delete; KDjVu &operator=(const KDjVu &) = delete; /** * A DjVu page. */ class Page { friend class KDjVu; public: ~Page(); int width() const; int height() const; int dpi() const; int orientation() const; private: Page(); int m_width; int m_height; int m_dpi; int m_orientation; }; /** * The base implementation for a DjVu link. */ class Link { friend class KDjVu; public: Link() = default; virtual ~Link(); Link(const Link &) = delete; Link &operator=(const Link &) = delete; enum LinkType { PageLink, UrlLink }; enum LinkArea { UnknownArea, RectArea, EllipseArea, PolygonArea }; virtual int type() const = 0; LinkArea areaType() const; QPoint point() const; QSize size() const; QPolygon polygon() const; private: LinkArea m_area; QPoint m_point; QSize m_size; QPolygon m_poly; }; /** * A link to reach a page of a DjVu document. */ class PageLink : public Link { friend class KDjVu; public: int type() const override; QString page() const; private: PageLink(); QString m_page; }; /** * A DjVu link to open an external Url. */ class UrlLink : public Link { friend class KDjVu; public: int type() const override; QString url() const; private: UrlLink(); QString m_url; }; /** * The base implementation for a DjVu annotation. */ class Annotation { friend class KDjVu; public: virtual ~Annotation(); Annotation(const Annotation &) = delete; Annotation &operator=(const Annotation &) = delete; enum AnnotationType { TextAnnotation, LineAnnotation }; virtual int type() const = 0; QPoint point() const; QString comment() const; void setComment(const QString &comment); virtual QColor color() const; virtual void setColor(const QColor &color); protected: explicit Annotation(miniexp_t anno); miniexp_t m_anno; QPoint m_point; }; /** * A DjVu text annotation. */ class TextAnnotation : public Annotation { friend class KDjVu; public: int type() const override; QColor color() const override; void setColor(const QColor &color) override; QSize size() const; bool inlineText() const; private: explicit TextAnnotation(miniexp_t anno); QSize m_size; bool m_inlineText; }; /** * A DjVu line annotation. */ class LineAnnotation : public Annotation { friend class KDjVu; public: int type() const override; QColor color() const override; void setColor(const QColor &color) override; QPoint point2() const; bool isArrow() const; int width() const; void setWidth(int width); private: explicit LineAnnotation(miniexp_t anno); QPoint m_point2; bool m_isArrow; miniexp_t m_width; }; /** * A DjVu text entity. */ class TextEntity { friend class KDjVu; public: ~TextEntity(); QString text() const; QRect rect() const; private: TextEntity(); QString m_text; QRect m_rect; }; /** * Opens the file \p fileName, closing the old one if necessary. */ bool openFile(const QString &fileName); /** * Close the file currently opened, if any. */ void closeFile(); /** * The pages of the current document, or an empty vector otherwise. * \note KDjVu handles the pages, so you don't need to delete them manually * \return a vector with the pages of the current document */ const QVector &pages() const; /** * Get the metadata for the specified \p key, or a null variant otherwise. */ QVariant metaData(const QString &key) const; /** * Get an XML document with the bookmarks of the current document (if any). * The XML will look like this: * \verbatim * * * * ... * * * \endverbatim */ const QDomDocument *documentBookmarks() const; /** * Reads the links and the annotations for the page \p pageNum * * For both \p links and \p annotations , you can pass either a valid pointer * (in case you want to extract that kind of information), or a null pointer * (if you don't want that information). */ void linksAndAnnotationsForPage(int pageNum, QList *links, QList *annotations) const; /** * Check if the image for the specified \p page with the specified * \p width, \p height and \p rotation is already in cache, and returns * it. If not, a null image is returned. */ QImage image(int page, int width, int height, int rotation); /** * Export the currently open document as PostScript file \p fileName. * \returns whether the exporting was successful */ bool exportAsPostScript(const QString &fileName, const QList &pageList) const; /** * Export the currently open document as PostScript file. * \returns whether the exporting was successful */ bool exportAsPostScript(QFile *file, const QList &pageList) const; /** * Return the list of the text entities for the specified \p page, that matches the * specified \p granularity. */ QList textEntities(int page, const QString &granularity) const; /** * Enable or disable the internal rendered pages cache. */ void setCacheEnabled(bool enable); /** * \returns whether the internal rendered pages cache is enabled */ bool isCacheEnabled() const; /** * Return the page number of the page whose title is \p name. */ int pageNumber(const QString &name) const; private: class Private; Private *const d; }; #endif