#ifndef VEXPORTER_H #define VEXPORTER_H #include #include #include #include #include #include "dialog/vexportdialog.h" class QWidget; class VWebView; class VDocument; class VExporter : public QObject { Q_OBJECT public: explicit VExporter(QWidget *p_parent = nullptr); void prepareExport(const ExportOption &p_opt); bool exportPDF(VFile *p_file, const ExportOption &p_opt, const QString &p_outputFile, QString *p_errMsg = NULL); bool exportHTML(VFile *p_file, const ExportOption &p_opt, const QString &p_outputFile, QString *p_errMsg = NULL); bool exportCustom(VFile *p_file, const ExportOption &p_opt, const QString &p_outputFile, QString *p_errMsg = NULL); int exportPDFInOne(const QList &p_htmlFiles, const ExportOption &p_opt, const QString &p_outputFile, QString *p_errMsg = NULL); int exportCustomInOne(const QList &p_files, const ExportOption &p_opt, const QString &p_outputFile, QString *p_errMsg = NULL); void setAskedToStop(bool p_askedToStop); signals: // Request to output log. void outputLog(const QString &p_log); private slots: void handleLogicsFinished(); void handleLoadFinished(bool p_ok); void handleDownloadRequested(QWebEngineDownloadItem *p_item); private: enum class ExportState { Idle = 0, Cancelled, Busy, Failed, Successful }; enum NoteState { NotReady = 0, WebLogicsReady = 0x1, WebLoadFinished = 0x2, Ready = 0x3, Failed = 0x4 }; void initWebViewer(VFile *p_file, const ExportOption &p_opt); void clearWebViewer(); void clearNoteState(); bool isNoteStateReady() const; bool isNoteStateFailed() const; bool exportViaWebView(VFile *p_file, const ExportOption &p_opt, const QString &p_outputFile, QString *p_errMsg = NULL); bool exportToPDF(VWebView *p_webViewer, const QString &p_filePath, const QPageLayout &p_layout); bool exportToPDFViaWK(VDocument *p_webDocument, const ExportPDFOption &p_opt, const QString &p_filePath, QString *p_errMsg = NULL); bool exportToCustom(VDocument *p_webDocument, const ExportCustomOption &p_opt, const QString &p_filePath, QString *p_errMsg = NULL); bool exportToHTML(VDocument *p_webDocument, const ExportHTMLOption &p_opt, const QString &p_filePath); bool exportToMHTML(VWebView *p_webViewer, const ExportHTMLOption &p_opt, const QString &p_filePath); bool htmlsToPDFViaWK(const QList &p_htmlFiles, const QString &p_filePath, const ExportPDFOption &p_opt, QString *p_errMsg = NULL); bool convertFilesViaCustom(const QList &p_files, const QString &p_filePath, const ExportCustomOption &p_opt, QString *p_errMsg = NULL); void prepareWKArguments(const ExportPDFOption &p_opt); int startProcess(const QString &p_program, const QStringList &p_args); int startProcess(const QString &p_cmd); // @p_embedImages: embed as data URI. bool outputToHTMLFile(const QString &p_file, const QString &p_title, const QString &p_headContent, const QString &p_styleContent, const QString &p_bodyContent, bool p_embedCssStyle, bool p_completeHTML, bool p_embedImages); // Fix @p_html's resources like url("...") with "file" or "qrc" schema. // Copy the resource to @p_folder and fix the url string. static bool fixStyleResources(const QString &p_folder, QString &p_html); // Fix @p_html's resources like url("...") with "file" or "qrc" schema. // Embed the image data in data URIs. static bool embedStyleResources(QString &p_html); // Fix @p_html's resources like . // Copy the resource to @p_folder and fix the url string. static bool fixBodyResources(const QUrl &p_baseUrl, const QString &p_folder, QString &p_html); // Embed @p_html's resources like . static bool embedBodyResources(const QUrl &p_baseUrl, QString &p_html); static QString getResourceRelativePath(const QString &p_file); QPageLayout m_pageLayout; // Will be allocated and free for each conversion. VWebView *m_webViewer; VDocument *m_webDocument; // Base URL of VWebView. QUrl m_baseUrl; QString m_htmlTemplate; // Template to hold the export HTML result. QString m_exportHtmlTemplate; NoteState m_noteState; ExportState m_state; // Download state used for MIME HTML. QWebEngineDownloadItem::DownloadState m_downloadState; // Arguments for wkhtmltopdf. QStringList m_wkArgs; bool m_askedToStop; }; inline void VExporter::clearNoteState() { m_noteState = NoteState::NotReady; } inline bool VExporter::isNoteStateReady() const { return m_noteState == NoteState::Ready; } inline bool VExporter::isNoteStateFailed() const { return m_noteState & NoteState::Failed; } inline void VExporter::setAskedToStop(bool p_askedToStop) { m_askedToStop = p_askedToStop; } #endif // VEXPORTER_H