diff --git a/src/pdf/api/qpdfdocument_p.h b/src/pdf/api/qpdfdocument_p.h index 9287542107bb26cc00ea643759ed394748223feb..15d8b82594feef017ea834b6be44b72f3dae2181 100644 --- a/src/pdf/api/qpdfdocument_p.h +++ b/src/pdf/api/qpdfdocument_p.h @@ -98,6 +98,7 @@ public: void _q_copyFromSequentialSourceDevice(); void tryLoadDocument(); void checkComplete(); + bool checkPageComplete(int page); void setStatus(QPdfDocument::Status status); static FPDF_BOOL fpdf_IsDataAvail(struct _FX_FILEAVAIL* pThis, size_t offset, size_t size); diff --git a/src/pdf/qpdfdocument.cpp b/src/pdf/qpdfdocument.cpp index 69095369186e141e73bc75bf42f68f4410f734bc..4c4f8f24eb21315d3a70e60418c5d9f086920237 100644 --- a/src/pdf/qpdfdocument.cpp +++ b/src/pdf/qpdfdocument.cpp @@ -186,7 +186,35 @@ void QPdfDocumentPrivate::load(QIODevice *newDevice, bool transferDeviceOwnershi } else { device = newDevice; initiateAsyncLoadWithTotalSizeKnown(device->size()); - checkComplete(); + if (!avail) { + setStatus(QPdfDocument::Error); + return; + } + + if (!doc) + tryLoadDocument(); + + if (!doc) { + updateLastError(); + setStatus(QPdfDocument::Error); + return; + } + + QPdfMutexLocker lock; + const int newPageCount = FPDF_GetPageCount(doc); + lock.unlock(); + if (newPageCount != pageCount) { + pageCount = newPageCount; + emit q->pageCountChanged(pageCount); + } + + // If it's a local file, and the first page is available, probably the whole document is available. + if (checkPageComplete(0)) { + setStatus(QPdfDocument::Ready); + } else { + updateLastError(); + setStatus(QPdfDocument::Error); + } } } @@ -311,6 +339,23 @@ void QPdfDocumentPrivate::checkComplete() } } +bool QPdfDocumentPrivate::checkPageComplete(int page) +{ + if (loadComplete) + return true; + + QPdfMutexLocker lock; + int result = PDF_DATA_NOTAVAIL; + while (result == PDF_DATA_NOTAVAIL) + result = FPDFAvail_IsPageAvail(avail, page, this); + lock.unlock(); + + if (result == PDF_DATA_ERROR) + updateLastError(); + + return (result != PDF_DATA_ERROR); +} + void QPdfDocumentPrivate::setStatus(QPdfDocument::Status documentStatus) { if (status == documentStatus) @@ -581,7 +626,7 @@ QSizeF QPdfDocument::pageSize(int page) const */ QImage QPdfDocument::render(int page, QSize imageSize, QPdfDocumentRenderOptions renderOptions) { - if (!d->doc) + if (!d->doc || !d->checkPageComplete(page)) return QImage(); const QPdfMutexLocker lock;