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;