pdfdocument.cpp 19,0 КБ
Newer Older
OMP Education's avatar
OMP Education включено в состав коммита
1
2
/****************************************************************************
**
OMP Education's avatar
OMP Education включено в состав коммита
3
** Copyright (C) 2021 - 2025 Open Mobile Platform LLC.
OMP Education's avatar
OMP Education включено в состав коммита
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
** Contact: https://community.omprussia.ru/open-source
**
** This file is part of the AmberPDF project.
**
** $QT_BEGIN_LICENSE:BSD$
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Open Mobile Platform LLC copyright holder nor
**     the names of its contributors may be used to endorse or promote
**     products derived from this software without specific prior written
**     permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include <QFileInfo>
#include <QFutureWatcher>
#include <pdfpagewordstask.h>
#include "pdftaskqueue.h"
#include "tasks/pdfdocumentloadtask.h"
#include "tasks/pdfdocumentloadfrommemtask.h"
#include "tasks/pdfdocumentpagesizetask.h"
#include "tasks/pdfdocumentpagecounttask.h"
#include "tasks/pdfpageloadtask.h"
#include "tasks/pdfdocumentbookmarksloadtask.h"
OMP Education's avatar
OMP Education включено в состав коммита
50
51
52
53
54
55
#include "tasks/pdfdocumentuserbookmarksloadtask.h"
#include "tasks/pdfdocumentdeleteuserbookmarktask.h"
#include "tasks/pdfdocumentadduserbookmarktask.h"
#include "tasks/pdfdocumentidloadtask.h"
#include "tasks/pdfdocumentrenamebookmarksfiletask.h"
#include "tasks/pdfdocumentextractnewfileidtask.h"
OMP Education's avatar
OMP Education включено в состав коммита
56
57
58
#include "tasks/pdfdocumentversiongettask.h"
#include "tasks/pdfdocumentsavetask.h"
#include "tasks/pdfdocumentexporttask.h"
OMP Education's avatar
OMP Education включено в состав коммита
59
#include "tasks/pdfdocumentphrasesearchtask.h"
OMP Education's avatar
OMP Education включено в состав коммита
60
61
62
63
64
65
#include "pdfdocument.h"
#include "pdfword.h"
#include "pdfpage.h"
#include "pdfdocumentholder.h"
#include "pdfdocument_p.h"

OMP Education's avatar
OMP Education включено в состав коммита
66
67
68
/*!
 * Clear references of document data.
 */
OMP Education's avatar
OMP Education включено в состав коммита
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
void PdfDocumentPrivate::clear()
{
    if (m_documentHolder) {
        PdfTaskQueue::instance().addBlockedId(m_documentHolder->id());

        if (!m_openPages.empty()) {
            for (auto &future : m_openPages) {
                future.cancel();
                if (!future.isCanceled())
                    future.result().clear();
            }
            m_openPages.clear();
        }
    }

OMP Education's avatar
OMP Education включено в состав коммита
84
    m_documentHolder.clear();
OMP Education's avatar
OMP Education включено в состав коммита
85
86
87
88
    m_documentHolder.reset();
    m_status = PdfDocument::DocumentStatus::Unknown;
}

OMP Education's avatar
OMP Education включено в состав коммита
89
90
91
/*!
 * Handle loaded document.
 */
OMP Education's avatar
OMP Education включено в состав коммита
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
void PdfDocumentPrivate::handleDocument(QPair<int, QSharedPointer<fpdf_document_t__>> loadResult)
{
    m_status = loadResult.second  ? PdfDocument::DocumentStatus::Success
                                     : static_cast<PdfDocument::DocumentStatus>(loadResult.first);

    if (m_status != PdfDocument::DocumentStatus::Success)
        return;

    m_documentHolder.clear();
    m_documentHolder = QSharedPointer<PdfDocumentHolder>(new PdfDocumentHolder(loadResult.second));
    if (!m_documentHolder) {
        m_status = PdfDocument::DocumentStatus::InternalError;
        return;
    }

    m_status = PdfDocument::DocumentStatus::Success;
}

OMP Education's avatar
OMP Education включено в состав коммита
110
111
112
113
114
/*!
 * \class PdfDocument
 * \brief The PdfDocument class is a wrapper class of pdfium document.
 * \inmodule AmberPDF
 */
OMP Education's avatar
OMP Education включено в состав коммита
115

OMP Education's avatar
OMP Education включено в состав коммита
116
117
118
/*!
 * Default constructor.
 */
OMP Education's avatar
OMP Education включено в состав коммита
119
120
121
122
123
124
125
126
127
128
PdfDocument::PdfDocument(QObject *parent) : QObject(parent),
    d_ptr(new PdfDocumentPrivate())
{
    connect(this, &PdfDocument::statusChanged, this, [&](DocumentStatus status) {
        if (status != DocumentStatus::Success)
            return;

        Q_D(PdfDocument);
        QFutureInterface<int> pageCountInterface;
        d->m_pageCountWatcher.setFuture(pageCountInterface.future());
OMP Education's avatar
OMP Education включено в состав коммита
129
        auto pageCountTask = QSharedPointer<PdfTask>(new PdfDocumentPageCountTask(d->m_documentHolder, pageCountInterface));
OMP Education's avatar
OMP Education включено в состав коммита
130
131
        auto addingResult = PdfTaskQueue::instance().addTask(pageCountTask, PdfTaskQueue::TaskPriority::High, d->m_documentHolder->id());
        if (!addingResult) {
OMP Education's avatar
OMP Education включено в состав коммита
132
            pageCountTask.reset();
OMP Education's avatar
OMP Education включено в состав коммита
133
134
135
136
137
138
            d->m_status = DocumentStatus::InternalError;
            emit statusChanged(d->m_status);
        }

        QFutureInterface<int> versionInterface;
        d->m_versionWatcher.setFuture(versionInterface.future());
OMP Education's avatar
OMP Education включено в состав коммита
139
        auto versionTask = QSharedPointer<PdfTask>(new PdfDocumentVersionGetTask(d->m_documentHolder, versionInterface));
OMP Education's avatar
OMP Education включено в состав коммита
140
141
        addingResult = PdfTaskQueue::instance().addTask(versionTask, PdfTaskQueue::TaskPriority::High, d->m_documentHolder->id());
        if (!addingResult) {
OMP Education's avatar
OMP Education включено в состав коммита
142
            versionTask.reset();
OMP Education's avatar
OMP Education включено в состав коммита
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
            d->m_status = DocumentStatus::InternalError;
            emit statusChanged(d->m_status);
        }
    });

    connect(&d_ptr->m_pageCountWatcher, &QFutureWatcher<int>::finished, this, [&]() {
        Q_D(PdfDocument);
        if (d->m_pageCountWatcher.isCanceled())
            return;

        auto pageCount = d->m_pageCountWatcher.result();
        d_ptr->m_pagesCount = pageCount;
        emit pageCountChanged(d_ptr->m_pagesCount);
    });

    connect(&d_ptr->m_versionWatcher, &QFutureWatcher<int>::finished, this, [&]() {
        Q_D(PdfDocument);
        if (d->m_versionWatcher.isCanceled())
            return;

        d_ptr->m_fileVersion = d->m_versionWatcher.result();
        emit fileVersionChanged(d_ptr->m_fileVersion);
    });
}

OMP Education's avatar
OMP Education включено в состав коммита
168
169
170
/*!
 * Destructor.
 */
OMP Education's avatar
OMP Education включено в состав коммита
171
172
173
174
175
176
177
178
PdfDocument::~PdfDocument()
{
    Q_D(PdfDocument);
    d->clear();

    delete d_ptr;
}

OMP Education's avatar
OMP Education включено в состав коммита
179
180
181
/*!
 * Returns current status of document.
 */
OMP Education's avatar
OMP Education включено в состав коммита
182
183
184
185
186
187
PdfDocument::DocumentStatus PdfDocument::status() const
{
    Q_D(const PdfDocument);
    return d->m_status;
}

OMP Education's avatar
OMP Education включено в состав коммита
188
189
190
/*!
 * Returns page count of document.
 */
OMP Education's avatar
OMP Education включено в состав коммита
191
192
193
194
195
196
197
198
199
200
201
202
203
int PdfDocument::pageCount() const
{
    Q_D(const PdfDocument);

    if (!d->m_documentHolder)
        return -1;

    if (d->m_pageCountWatcher.isFinished() && !d->m_pageCountWatcher.isCanceled())
        return d->m_pageCountWatcher.result();

    return -1;
}

OMP Education's avatar
OMP Education включено в состав коммита
204
205
206
/*!
 * Returns path to document.
 */
OMP Education's avatar
OMP Education включено в состав коммита
207
208
209
210
211
212
QString PdfDocument::path() const
{
    Q_D(const PdfDocument);
    return d->m_path;
}

OMP Education's avatar
OMP Education включено в состав коммита
213
214
215
216
/*!
 * Initialize a PdfPageLoadTask and returns its result in future.
 */
QFuture<QSharedPointer<PdfPage>> PdfDocument::page(int pageIndex) const
OMP Education's avatar
OMP Education включено в состав коммита
217
218
219
220
221
222
223
224
225
226
227
{
    Q_D(const PdfDocument);

    if (pageIndex < 0 || pageIndex > pageCount())
        return {  };

    if (!d->m_documentHolder || status() != DocumentStatus::Success)
        return {  };

    if (!d->m_openPages.contains(pageIndex)) {
        QFutureInterface<QSharedPointer<PdfPage>> interface;
OMP Education's avatar
OMP Education включено в состав коммита
228

OMP Education's avatar
OMP Education включено в состав коммита
229
230
        auto loadPageTask = QSharedPointer<PdfTask>(new PdfPageLoadTask(d->m_documentHolder, interface, pageIndex));
        auto addingResult = PdfTaskQueue::instance().addTask(loadPageTask, PdfTaskQueue::TaskPriority::Low, d->m_documentHolder->id());
OMP Education's avatar
OMP Education включено в состав коммита
231
        if (!addingResult) {
OMP Education's avatar
OMP Education включено в состав коммита
232
            loadPageTask.reset();
OMP Education's avatar
OMP Education включено в состав коммита
233
234
235
236
237
238
239
240
241
242
243
            return {  };
        }

        interface.reportStarted();

        d->m_openPages.insert(pageIndex, interface.future());
    }

    return d->m_openPages.value(pageIndex);
}

OMP Education's avatar
OMP Education включено в состав коммита
244
245
246
/*!
 * Initialize a PdfDocumentPageSizeTask and returns its result in future.
 */
OMP Education's avatar
OMP Education включено в состав коммита
247
248
249
250
251
252
253
254
255
256
257
QFuture<QSizeF> PdfDocument::pageSize(int pageIndex) const
{
    Q_D(const PdfDocument);

    if (pageIndex < 0 || pageIndex > pageCount())
        return {  };

    if (!d->m_documentHolder || status() != DocumentStatus::Success)
        return {  };

    QFutureInterface<QSizeF> interface;
OMP Education's avatar
OMP Education включено в состав коммита
258

OMP Education's avatar
OMP Education включено в состав коммита
259
    auto loadPageTask = QSharedPointer<PdfTask>(new PdfDocumentPageSizeTask(d->m_documentHolder, interface, pageIndex));
OMP Education's avatar
OMP Education включено в состав коммита
260
261
    auto addingResult = PdfTaskQueue::instance().addTask(loadPageTask, PdfTaskQueue::TaskPriority::High, d->m_documentHolder->id());
    if (!addingResult) {
OMP Education's avatar
OMP Education включено в состав коммита
262
        loadPageTask.reset();
OMP Education's avatar
OMP Education включено в состав коммита
263
264
265
266
267
268
269
270
        return {  };
    }

    interface.reportStarted();

    return interface.future();
}

OMP Education's avatar
OMP Education включено в состав коммита
271
272
273
274
275
276
277
/*!
 * \fn PdfDocument::loadDocument(const QString &fileName, const QString &password)
 *
 * Loads document from PDF file.
 * \a fileName is path to file on device.
 * \a password is password for document loading if needed.
 */
OMP Education's avatar
OMP Education включено в состав коммита
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
void PdfDocument::loadDocument(const QString &fileName, const QString &password)
{
    Q_D(PdfDocument);

    if (d->m_status == DocumentStatus::Success)
        d->clear();

    d->m_status = DocumentStatus::Loading;
    emit statusChanged(d->m_status);

    d->m_path = fileName;
    emit pathChanged(d->m_path);

    QFileInfo fileInfo(fileName);
    if (!fileInfo.isReadable()) {
        d->m_status = DocumentStatus::FileError;
        emit statusChanged(d->m_status);
        return;
    }

    auto pdfiumLoadFuture = d->fromPdf(fileName, password);
    if (pdfiumLoadFuture.isFinished()) {
        d->handleDocument(pdfiumLoadFuture.result());
        emit statusChanged(d->m_status);
        return;
    }

    auto pdfLoadWatcher = new QFutureWatcher<QPair<int, QSharedPointer<fpdf_document_t__>>>(this);
    pdfLoadWatcher->setFuture(pdfiumLoadFuture);

    connect(pdfLoadWatcher, &QFutureWatcher<QPair<int, QSharedPointer<fpdf_document_t__>>>::finished, this, [&]() {
        Q_D(PdfDocument);
        auto watcher = dynamic_cast<QFutureWatcher<QPair<int, QSharedPointer<fpdf_document_t__>>>*>(sender());
        if (watcher == nullptr)
            return;
        if (watcher->isCanceled())
            d->m_status = DocumentStatus::InternalError;
        else
            d->handleDocument(watcher->result());

        emit statusChanged(d->m_status);
        watcher->deleteLater();
    });
}

OMP Education's avatar
OMP Education включено в состав коммита
323
324
325
326
327
328
329
/*!
 * \fn PdfDocument::loadDocument(const QByteArray &buffer, const QString &password)
 *
 * Loads document from memory.
 * \a buffer is memory buffer.
 * \a password is password for document loading if needed.
 */
OMP Education's avatar
OMP Education включено в состав коммита
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
void PdfDocument::loadDocument(const QByteArray &buffer, const QString &password)
{
    Q_D(PdfDocument);

    if (d->m_status == DocumentStatus::Success)
        d->clear();

    d->m_status = DocumentStatus::Loading;
    emit statusChanged(d->m_status);

    auto pdfiumLoadFuture = d->fromMem(buffer, password);
    if (pdfiumLoadFuture.isFinished()) {
        d->handleDocument(pdfiumLoadFuture.result());
        emit statusChanged(d->m_status);
        return;
    }

    auto pdfLoadWatcher = new QFutureWatcher<QPair<int, QSharedPointer<fpdf_document_t__>>>(this);
    pdfLoadWatcher->setFuture(pdfiumLoadFuture);

    connect(pdfLoadWatcher, &QFutureWatcher<QPair<int, QSharedPointer<fpdf_document_t__>>>::finished, this, [&]() {
        Q_D(PdfDocument);
        auto watcher = dynamic_cast<QFutureWatcher<QPair<int, QSharedPointer<fpdf_document_t__>>>*>(sender());
        if (watcher == nullptr)
            return;

        if (watcher->isCanceled())
            d->m_status = DocumentStatus::InternalError;
        else
            d->handleDocument(watcher->result());
        emit statusChanged(d->m_status);
        watcher->deleteLater();
    });
}

OMP Education's avatar
OMP Education включено в состав коммита
365
366
367
368
/*!
 * Initialize a PdfDocumentBookmarksLoadTask and returns its result in future.
 */
QFuture<QVector<PdfBookmark>> PdfDocument::bookmarks() const
OMP Education's avatar
OMP Education включено в состав коммита
369
370
371
{
    Q_D(const PdfDocument);
    QFutureInterface<QVector<PdfBookmark>> interface;
OMP Education's avatar
OMP Education включено в состав коммита
372

OMP Education's avatar
OMP Education включено в состав коммита
373
    auto task = QSharedPointer<PdfTask>(new PdfDocumentBookmarksLoadTask(d->m_documentHolder, interface));
OMP Education's avatar
OMP Education включено в состав коммита
374
375
376

    auto addResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::High);
    if (!addResult) {
OMP Education's avatar
OMP Education включено в состав коммита
377
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
378
379
380
381
382
383
384
385
        return {  };
    }

    interface.reportStarted();

    return interface.future();
}

OMP Education's avatar
OMP Education включено в состав коммита
386
/*!
OMP Education's avatar
OMP Education включено в состав коммита
387
 * Initialize a PdfDocumentUserBookmarksLoadTask and returns its result in future.
OMP Education's avatar
OMP Education включено в состав коммита
388
 */
OMP Education's avatar
OMP Education включено в состав коммита
389
QFuture<QVector<UserPdfBookmark>> PdfDocument::userBookmarks(const QString &fileName) const
OMP Education's avatar
OMP Education включено в состав коммита
390
391
392
{
    Q_D(const PdfDocument);
    QFutureInterface<QVector<UserPdfBookmark>> interface;
OMP Education's avatar
OMP Education включено в состав коммита
393

OMP Education's avatar
OMP Education включено в состав коммита
394
    auto task = QSharedPointer<PdfTask>(new PdfDocumentUserBookmarksLoadTask(d->m_documentHolder, interface, fileName));
OMP Education's avatar
OMP Education включено в состав коммита
395
396
397

    auto addResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::High);
    if (!addResult) {
OMP Education's avatar
OMP Education включено в состав коммита
398
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
399
400
401
402
403
404
405
406
407
        return {  };
    }

    interface.reportStarted();

    return interface.future();
}

/*!
OMP Education's avatar
OMP Education включено в состав коммита
408
 * Initialize a PdfDocumentAddUserBookmarkTask and returns its result in future.
OMP Education's avatar
OMP Education включено в состав коммита
409
410
411
412
413
414
415
416
417
 */
QFuture<bool> PdfDocument::addUserBookmark(int pageNumber, const QString &pageText, const QString &fileName)
{
    Q_D(const PdfDocument);
    QFutureInterface<bool> interface;
    const auto &future = interface.future();

    PdfDocumentAddUserBookmarkTask::NewBookmark newBookmark{pageNumber, pageText, fileName};

OMP Education's avatar
OMP Education включено в состав коммита
418
419
    auto task =
            QSharedPointer<PdfTask>(new PdfDocumentAddUserBookmarkTask(newBookmark, interface, d->m_documentHolder));
OMP Education's avatar
OMP Education включено в состав коммита
420
421
422
    auto addingResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::High,
                                                         d->m_documentHolder->id());
    if (!addingResult) {
OMP Education's avatar
OMP Education включено в состав коммита
423
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
424
425
        return {};
    }
OMP Education's avatar
OMP Education включено в состав коммита
426

OMP Education's avatar
OMP Education включено в состав коммита
427
    interface.reportStarted();
OMP Education's avatar
OMP Education включено в состав коммита
428

OMP Education's avatar
OMP Education включено в состав коммита
429
430
431
432
    return future;
}

/*!
OMP Education's avatar
OMP Education включено в состав коммита
433
 * Initialize a PdfDocumentDeleteUserBookmarkTask and returns its result in future.
OMP Education's avatar
OMP Education включено в состав коммита
434
435
436
437
438
439
440
 */
QFuture<bool> PdfDocument::deleteUserBookmark(int pageNumber, const QString &fileName)
{
    Q_D(const PdfDocument);
    QFutureInterface<bool> interface;
    const auto &future = interface.future();

OMP Education's avatar
OMP Education включено в состав коммита
441
    auto task = QSharedPointer<PdfTask>(new PdfDocumentDeleteUserBookmarkTask(pageNumber, fileName, interface, d->m_documentHolder));
OMP Education's avatar
OMP Education включено в состав коммита
442
443
444
    auto addingResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::High,
                                                         d->m_documentHolder->id());
    if (!addingResult) {
OMP Education's avatar
OMP Education включено в состав коммита
445
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
446
447
448
449
450
451
452
453
        return {};
    }

    interface.reportStarted();
    return future;
}

/*!
OMP Education's avatar
OMP Education включено в состав коммита
454
 * Initialize a PdfDocumentIdLoadTask and returns its result in future.
OMP Education's avatar
OMP Education включено в состав коммита
455
456
457
458
459
 */
QFuture<QString> PdfDocument::getFileId() const
{
    Q_D(const PdfDocument);
    QFutureInterface<QString> interface;
OMP Education's avatar
OMP Education включено в состав коммита
460

OMP Education's avatar
OMP Education включено в состав коммита
461
    auto task = QSharedPointer<PdfTask>(new PdfDocumentIdLoadTask(d->m_documentHolder, interface));
OMP Education's avatar
OMP Education включено в состав коммита
462
463
464

    auto addResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::High);
    if (!addResult) {
OMP Education's avatar
OMP Education включено в состав коммита
465
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
466
467
468
469
470
471
472
        return { };
    }

    interface.reportStarted();
    return interface.future();
}

OMP Education's avatar
OMP Education включено в состав коммита
473

OMP Education's avatar
OMP Education включено в состав коммита
474
/*!
OMP Education's avatar
OMP Education включено в состав коммита
475
 * Initialize a PdfDocumentExtractNewFileIdTask and returns its result in future.
OMP Education's avatar
OMP Education включено в состав коммита
476
477
478
479
 */
QFuture<QString> PdfDocument::getNewFileId(const QString &filePath) const
{
    QFutureInterface<QString> interface;
OMP Education's avatar
OMP Education включено в состав коммита
480
    auto task = QSharedPointer<PdfTask>(new PdfDocumentExtractNewFileIdTask(filePath, interface));
OMP Education's avatar
OMP Education включено в состав коммита
481
482
483

    auto addResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::High);
    if (!addResult) {
OMP Education's avatar
OMP Education включено в состав коммита
484
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
485
486
487
488
489
490
491
492
        return { };
    }

    interface.reportStarted();
    return interface.future();
}

/*!
OMP Education's avatar
OMP Education включено в состав коммита
493
 * Initialize a PdfDocumentRenameBookmarksFileTask and returns its result in future.
OMP Education's avatar
OMP Education включено в состав коммита
494
495
496
497
498
499
 */
QFuture<bool> PdfDocument::renameBookmarksFile(const QString &prevFileName, const QString &newFileName) const
{
    Q_D(const PdfDocument);
    QFutureInterface<bool> interface;

OMP Education's avatar
OMP Education включено в состав коммита
500
501
    auto task =
            QSharedPointer<PdfTask>(new PdfDocumentRenameBookmarksFileTask(interface, d->m_documentHolder, prevFileName, newFileName));
OMP Education's avatar
OMP Education включено в состав коммита
502
503
504
    auto renameResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::High,
                                                         d->m_documentHolder->id());
    if (!renameResult) {
OMP Education's avatar
OMP Education включено в состав коммита
505
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
506
507
508
509
510
511
512
        return {};
    }

    interface.reportStarted();
    return interface.future();
}

OMP Education's avatar
OMP Education включено в состав коммита
513
514
515
/*!
 * Initialize a PdfDocumentRenameBookmarksFileTask and returns its result in future.
 */
OMP Education's avatar
OMP Education включено в состав коммита
516
517
518
519
520
521
int PdfDocument::fileVersion() const
{
    Q_D(const PdfDocument);
    return d->m_fileVersion;
}

OMP Education's avatar
OMP Education включено в состав коммита
522
523
524
/*!
 * Initialize a PdfDocumentSaveTask and returns its result in future.
 */
OMP Education's avatar
OMP Education включено в состав коммита
525
526
527
528
bool PdfDocument::saveDocumentAs(const QString &path) const
{
    Q_D(const PdfDocument);
    QFutureInterface<bool> interface;
OMP Education's avatar
OMP Education включено в состав коммита
529
    
OMP Education's avatar
OMP Education включено в состав коммита
530
    auto task = QSharedPointer<PdfTask>(new PdfDocumentSaveTask(path, interface, d->m_documentHolder->document()));
OMP Education's avatar
OMP Education включено в состав коммита
531
532
533

    auto addResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::Immediately);
    if (!addResult) {
OMP Education's avatar
OMP Education включено в состав коммита
534
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
535
536
537
538
539
540
541
542
        return false;
    }

    interface.reportStarted();

    return interface.future().result();
}

OMP Education's avatar
OMP Education включено в состав коммита
543
544
545
/*!
 * Initialize a PdfDocumentExportTask and returns its result in future.
 */
OMP Education's avatar
OMP Education включено в состав коммита
546
547
548
549
bool PdfDocument::exportDocument(QIODevice *output) const
{
    Q_D(const PdfDocument);
    QFutureInterface<bool> interface;
OMP Education's avatar
OMP Education включено в состав коммита
550

OMP Education's avatar
OMP Education включено в состав коммита
551
    auto task = QSharedPointer<PdfTask>(new PdfDocumentExportTask(output, interface, d->m_documentHolder->document()));
OMP Education's avatar
OMP Education включено в состав коммита
552
553
554

    auto addResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::Immediately);
    if (!addResult) {
OMP Education's avatar
OMP Education включено в состав коммита
555
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
556
557
558
559
560
561
562
563
        return false;
    }

    interface.reportStarted();

    return interface.future().result();
}

OMP Education's avatar
OMP Education включено в состав коммита
564
565
566
/*!
 * Initialize a PdfDocumentPhraseSearchTask and returns its result in future.
 */
OMP Education's avatar
OMP Education включено в состав коммита
567
QFuture<PdfPageTexts*> PdfDocument::searchPhrase(const QString &phrase, PdfPageTexts* pageTextsModel) const
OMP Education's avatar
OMP Education включено в состав коммита
568
569
{
    Q_D(const PdfDocument);
OMP Education's avatar
OMP Education включено в состав коммита
570

OMP Education's avatar
OMP Education включено в состав коммита
571
572
    QFutureInterface<PdfPageTexts*> interface;
    auto task = QSharedPointer<PdfTask>(new PdfDocumentPhraseSearchTask(phrase, pageTextsModel, interface, d->m_documentHolder));
OMP Education's avatar
OMP Education включено в состав коммита
573
574
575

    auto addResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::Immediately);
    if (!addResult) {
OMP Education's avatar
OMP Education включено в состав коммита
576
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
577
578
579
580
581
582
583
        return {};
    }

    interface.reportStarted();

    return interface.future();
}
OMP Education's avatar
OMP Education включено в состав коммита
584
585
586
/*!
 * Initialize a PdfDocumentLoadTask and returns its result in future.
 */
OMP Education's avatar
OMP Education включено в состав коммита
587
588
589
QFuture<QPair<int, QSharedPointer<fpdf_document_t__>>> PdfDocumentPrivate::fromPdf(const QString &fileName, const QString &password)
{
    QFutureInterface<QPair<int, QSharedPointer<fpdf_document_t__>>> interface;
OMP Education's avatar
OMP Education включено в состав коммита
590
    auto task = QSharedPointer<PdfTask>(new PdfDocumentLoadTask(fileName, password, interface));
OMP Education's avatar
OMP Education включено в состав коммита
591
592
593
594

    auto addResult = PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::High);

    if (!addResult)
OMP Education's avatar
OMP Education включено в состав коммита
595
        task.reset();
OMP Education's avatar
OMP Education включено в состав коммита
596
597
598
599
600
601

    interface.reportStarted();

    return interface.future();
}

OMP Education's avatar
OMP Education включено в состав коммита
602
603
604
/*!
 * Initialize a PdfDocumentLoadFromMemTask and returns its result in future.
 */
OMP Education's avatar
OMP Education включено в состав коммита
605
606
607
QFuture<QPair<int, QSharedPointer<fpdf_document_t__>>> PdfDocumentPrivate::fromMem(const QByteArray &buffer, const QString &password)
{
    QFutureInterface<QPair<int, QSharedPointer<fpdf_document_t__>>> interface;
OMP Education's avatar
OMP Education включено в состав коммита
608
    auto task = QSharedPointer<PdfTask>(new PdfDocumentLoadFromMemTask(buffer, password, interface));
OMP Education's avatar
OMP Education включено в состав коммита
609
610
611
612
613
614

    PdfTaskQueue::instance().addTask(task, PdfTaskQueue::TaskPriority::High);
    interface.reportStarted();

    return interface.future();
}