diff --git a/src/core/base_stream.js b/src/core/base_stream.js index a5a0eb1b556f7..bf252b24e7297 100644 --- a/src/core/base_stream.js +++ b/src/core/base_stream.js @@ -68,6 +68,10 @@ class BaseStream { return false; } + get isImageStream() { + return false; + } + get canAsyncDecodeImageFromBuffer() { return false; } diff --git a/src/core/ccitt_stream.js b/src/core/ccitt_stream.js index 2bb80f3afa4f2..ca173f460b5c0 100644 --- a/src/core/ccitt_stream.js +++ b/src/core/ccitt_stream.js @@ -55,6 +55,10 @@ class CCITTFaxStream extends DecodeStream { this.buffer[this.bufferLength++] = c; } } + + get isImageStream() { + return true; + } } export { CCITTFaxStream }; diff --git a/src/core/decode_stream.js b/src/core/decode_stream.js index b541ed8983077..c76078f111cce 100644 --- a/src/core/decode_stream.js +++ b/src/core/decode_stream.js @@ -148,7 +148,7 @@ class DecodeStream extends BaseStream { class StreamsSequenceStream extends DecodeStream { constructor(streams, onError = null) { - streams = streams.filter(s => s instanceof BaseStream); + streams = streams.filter(s => s instanceof BaseStream && !s.isImageStream); let maybeLength = 0; for (const stream of streams) { diff --git a/src/core/document.js b/src/core/document.js index f624458cb24ca..a33d20385c09c 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -270,7 +270,7 @@ class Page { async getContentStream() { const content = await this.pdfManager.ensure(this, "content"); - if (content instanceof BaseStream) { + if (content instanceof BaseStream && !content.isImageStream) { return content; } if (Array.isArray(content)) { diff --git a/src/core/jbig2_stream.js b/src/core/jbig2_stream.js index 0fdda06ae1a93..c62c3580ce1e8 100644 --- a/src/core/jbig2_stream.js +++ b/src/core/jbig2_stream.js @@ -52,6 +52,10 @@ class Jbig2Stream extends DecodeStream { return true; } + get isImageStream() { + return true; + } + async decodeImage(bytes, _decoderOptions) { if (this.eof) { return this.buffer; diff --git a/src/core/jpeg_stream.js b/src/core/jpeg_stream.js index 4af24eeb8e733..75511f7087853 100644 --- a/src/core/jpeg_stream.js +++ b/src/core/jpeg_stream.js @@ -194,6 +194,10 @@ class JpegStream extends DecodeStream { decoder?.close(); } } + + get isImageStream() { + return true; + } } export { JpegStream }; diff --git a/src/core/jpx_stream.js b/src/core/jpx_stream.js index e454d58bd9754..54938eb745d41 100644 --- a/src/core/jpx_stream.js +++ b/src/core/jpx_stream.js @@ -64,6 +64,10 @@ class JpxStream extends DecodeStream { get canAsyncDecodeImageFromBuffer() { return this.stream.isAsync; } + + get isImageStream() { + return true; + } } export { JpxStream }; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 4a7a9a6e9b2d7..7b1a154a0ef1c 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -866,3 +866,4 @@ !bitmap-trailing-7fff-stripped-harder.pdf !bitmap-trailing-7fff-stripped.pdf !bitmap.pdf +!bomb_giant.pdf diff --git a/test/pdfs/bomb_giant.pdf b/test/pdfs/bomb_giant.pdf new file mode 100755 index 0000000000000..bbc7a43af92ad Binary files /dev/null and b/test/pdfs/bomb_giant.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index 02c0c2ffa14fc..a87b74e0274e9 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -13922,5 +13922,12 @@ "rounds": 1, "type": "eq", "useWasm": false + }, + { + "id": "bomb_giant_contents_image_stream", + "file": "pdfs/bomb_giant.pdf", + "md5": "e515a9abb11ab74332e57e371bfae61e", + "rounds": 1, + "type": "eq" } ]