diff --git a/src/core/chunked_stream.js b/src/core/chunked_stream.js index 920fc9af0..26a93f673 100644 --- a/src/core/chunked_stream.js +++ b/src/core/chunked_stream.js @@ -98,6 +98,10 @@ class ChunkedStream { } ensureByte(pos) { + if (pos < this.progressiveDataLength) { + return; + } + const chunk = Math.floor(pos / this.chunkSize); if (chunk === this.lastSuccessfulEnsureByteChunk) { return; @@ -234,7 +238,20 @@ class ChunkedStream { } makeSubStream(start, length, dict) { - this.ensureRange(start, start + length); + if (length) { + this.ensureRange(start, start + length); + } else { + // When the `length` is undefined you do *not*, under any circumstances, + // want to fallback on calling `this.ensureRange(start, this.end)` since + // that would force the *entire* PDF file to be loaded, thus completely + // breaking the whole purpose of using streaming and/or range requests. + // + // However, not doing any checking here could very easily lead to wasted + // time/resources during e.g. parsing, since `MissingDataException`s will + // require data to be re-parsed, which we attempt to minimize by at least + // checking that the *beginning* of the data is available here. + this.ensureByte(start); + } function ChunkedStreamSubstream() {} ChunkedStreamSubstream.prototype = Object.create(this);