Prevent lookup errors in PartialEvaluator.hasBlendModes
from breaking all parsing/rendering of a page (issue 11678)
The PDF document in question is *corrupt*, since it contains an XObject with a truncated dictionary and where the stream contents start without a "stream" operator.
This commit is contained in:
parent
7b07b88e71
commit
65e6ea2cb2
@ -61,6 +61,7 @@ import {
|
|||||||
WinAnsiEncoding,
|
WinAnsiEncoding,
|
||||||
ZapfDingbatsEncoding,
|
ZapfDingbatsEncoding,
|
||||||
} from "./encodings.js";
|
} from "./encodings.js";
|
||||||
|
import { getLookupTableFactory, MissingDataException } from "./core_utils.js";
|
||||||
import {
|
import {
|
||||||
getNormalizedUnicodes,
|
getNormalizedUnicodes,
|
||||||
getUnicodeForGlyph,
|
getUnicodeForGlyph,
|
||||||
@ -77,7 +78,6 @@ import { bidi } from "./bidi.js";
|
|||||||
import { ColorSpace } from "./colorspace.js";
|
import { ColorSpace } from "./colorspace.js";
|
||||||
import { DecodeStream } from "./stream.js";
|
import { DecodeStream } from "./stream.js";
|
||||||
import { getGlyphsUnicode } from "./glyphlist.js";
|
import { getGlyphsUnicode } from "./glyphlist.js";
|
||||||
import { getLookupTableFactory } from "./core_utils.js";
|
|
||||||
import { getMetrics } from "./metrics.js";
|
import { getMetrics } from "./metrics.js";
|
||||||
import { isPDFFunction } from "./function.js";
|
import { isPDFFunction } from "./function.js";
|
||||||
import { JpegStream } from "./jpeg_stream.js";
|
import { JpegStream } from "./jpeg_stream.js";
|
||||||
@ -266,7 +266,27 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
|||||||
if (processed[graphicState.toString()]) {
|
if (processed[graphicState.toString()]) {
|
||||||
continue; // The ExtGState has already been processed.
|
continue; // The ExtGState has already been processed.
|
||||||
}
|
}
|
||||||
graphicState = xref.fetch(graphicState);
|
try {
|
||||||
|
graphicState = xref.fetch(graphicState);
|
||||||
|
} catch (ex) {
|
||||||
|
if (ex instanceof MissingDataException) {
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
if (this.options.ignoreErrors) {
|
||||||
|
if (graphicState instanceof Ref) {
|
||||||
|
// Avoid parsing a corrupt ExtGState more than once.
|
||||||
|
processed[graphicState.toString()] = true;
|
||||||
|
}
|
||||||
|
// Error(s) in the ExtGState -- sending unsupported feature
|
||||||
|
// notification and allow parsing/rendering to continue.
|
||||||
|
this.handler.send("UnsupportedFeature", {
|
||||||
|
featureId: UNSUPPORTED_FEATURES.unknown,
|
||||||
|
});
|
||||||
|
warn(`hasBlendModes - ignoring ExtGState: "${ex}".`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!(graphicState instanceof Dict)) {
|
if (!(graphicState instanceof Dict)) {
|
||||||
continue;
|
continue;
|
||||||
@ -308,7 +328,27 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
|||||||
// time for badly generated PDF files (fixes issue6961.pdf).
|
// time for badly generated PDF files (fixes issue6961.pdf).
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
xObject = xref.fetch(xObject);
|
try {
|
||||||
|
xObject = xref.fetch(xObject);
|
||||||
|
} catch (ex) {
|
||||||
|
if (ex instanceof MissingDataException) {
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
if (this.options.ignoreErrors) {
|
||||||
|
if (xObject instanceof Ref) {
|
||||||
|
// Avoid parsing a corrupt XObject more than once.
|
||||||
|
processed[xObject.toString()] = true;
|
||||||
|
}
|
||||||
|
// Error(s) in the XObject -- sending unsupported feature
|
||||||
|
// notification and allow parsing/rendering to continue.
|
||||||
|
this.handler.send("UnsupportedFeature", {
|
||||||
|
featureId: UNSUPPORTED_FEATURES.unknown,
|
||||||
|
});
|
||||||
|
warn(`hasBlendModes - ignoring XObject: "${ex}".`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!isStream(xObject)) {
|
if (!isStream(xObject)) {
|
||||||
continue;
|
continue;
|
||||||
|
1
test/pdfs/issue11678.pdf.link
Normal file
1
test/pdfs/issue11678.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
https://github.com/mozilla/pdf.js/files/4304559/default.pdf
|
@ -3064,6 +3064,15 @@
|
|||||||
"link": false,
|
"link": false,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
},
|
},
|
||||||
|
{ "id": "issue11678",
|
||||||
|
"file": "pdfs/issue11678.pdf",
|
||||||
|
"md5": "e2efadeb91932f4c21e4fc682cce7de9",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": true,
|
||||||
|
"firstPage": 2,
|
||||||
|
"lastPage": 2,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "issue4890",
|
{ "id": "issue4890",
|
||||||
"file": "pdfs/issue4890.pdf",
|
"file": "pdfs/issue4890.pdf",
|
||||||
"md5": "1666feb4cd26318c2bdbea6a175dce87",
|
"md5": "1666feb4cd26318c2bdbea6a175dce87",
|
||||||
|
Loading…
Reference in New Issue
Block a user