mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-22 16:18:08 +02:00
Merge pull request #13796 from Snuffleupagus/issue-13794
Allow `StreamsSequenceStream.readBlock` to skip sub-streams with errors (issue 13794)
This commit is contained in:
commit
336a74a0e5
5 changed files with 46 additions and 6 deletions
|
@ -127,7 +127,7 @@ class DecodeStream extends BaseStream {
|
|||
}
|
||||
|
||||
class StreamsSequenceStream extends DecodeStream {
|
||||
constructor(streams) {
|
||||
constructor(streams, onError = null) {
|
||||
let maybeLength = 0;
|
||||
for (const stream of streams) {
|
||||
maybeLength +=
|
||||
|
@ -138,6 +138,7 @@ class StreamsSequenceStream extends DecodeStream {
|
|||
super(maybeLength);
|
||||
|
||||
this.streams = streams;
|
||||
this._onError = onError;
|
||||
}
|
||||
|
||||
readBlock() {
|
||||
|
@ -147,7 +148,16 @@ class StreamsSequenceStream extends DecodeStream {
|
|||
return;
|
||||
}
|
||||
const stream = streams.shift();
|
||||
const chunk = stream.getBytes();
|
||||
let chunk;
|
||||
try {
|
||||
chunk = stream.getBytes();
|
||||
} catch (reason) {
|
||||
if (this._onError) {
|
||||
this._onError(reason, stream.dict && stream.dict.objId);
|
||||
return;
|
||||
}
|
||||
throw reason;
|
||||
}
|
||||
const bufferLength = this.bufferLength;
|
||||
const newLength = bufferLength + chunk.length;
|
||||
const buffer = this.ensureBuffer(newLength);
|
||||
|
|
|
@ -30,6 +30,7 @@ import {
|
|||
stringToPDFString,
|
||||
stringToUTF8String,
|
||||
unreachable,
|
||||
UNSUPPORTED_FEATURES,
|
||||
Util,
|
||||
warn,
|
||||
} from "../shared/util.js";
|
||||
|
@ -225,16 +226,35 @@ class Page {
|
|||
return shadow(this, "rotate", rotate);
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
_onSubStreamError(handler, reason, objId) {
|
||||
if (this.evaluatorOptions.ignoreErrors) {
|
||||
// Error(s) when reading one of the /Contents sub-streams -- sending
|
||||
// unsupported feature notification and allow parsing to continue.
|
||||
handler.send("UnsupportedFeature", {
|
||||
featureId: UNSUPPORTED_FEATURES.errorContentSubStream,
|
||||
});
|
||||
warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`);
|
||||
return;
|
||||
}
|
||||
throw reason;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Promise<BaseStream>}
|
||||
*/
|
||||
getContentStream() {
|
||||
getContentStream(handler) {
|
||||
return this.pdfManager.ensure(this, "content").then(content => {
|
||||
if (content instanceof BaseStream) {
|
||||
return content;
|
||||
}
|
||||
if (Array.isArray(content)) {
|
||||
return new StreamsSequenceStream(content);
|
||||
return new StreamsSequenceStream(
|
||||
content,
|
||||
this._onSubStreamError.bind(this, handler)
|
||||
);
|
||||
}
|
||||
// Replace non-existent page content with empty content.
|
||||
return new NullStream();
|
||||
|
@ -307,7 +327,7 @@ class Page {
|
|||
renderInteractiveForms,
|
||||
annotationStorage,
|
||||
}) {
|
||||
const contentStreamPromise = this.getContentStream();
|
||||
const contentStreamPromise = this.getContentStream(handler);
|
||||
const resourcesPromise = this.loadResources([
|
||||
"ColorSpace",
|
||||
"ExtGState",
|
||||
|
@ -417,7 +437,7 @@ class Page {
|
|||
sink,
|
||||
combineTextItems,
|
||||
}) {
|
||||
const contentStreamPromise = this.getContentStream();
|
||||
const contentStreamPromise = this.getContentStream(handler);
|
||||
const resourcesPromise = this.loadResources([
|
||||
"ExtGState",
|
||||
"Font",
|
||||
|
|
|
@ -335,6 +335,7 @@ const UNSUPPORTED_FEATURES = {
|
|||
errorFontBuildPath: "errorFontBuildPath",
|
||||
errorFontGetPath: "errorFontGetPath",
|
||||
errorMarkedContent: "errorMarkedContent",
|
||||
errorContentSubStream: "errorContentSubStream",
|
||||
};
|
||||
|
||||
const PasswordResponses = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue