1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-19 22:58:07 +02:00

Merge pull request #17858 from Snuffleupagus/issue-17848

Ensure that Mesh /Shadings have non-zero width/height (issue 17848)
This commit is contained in:
Jonas Jenwald 2024-03-30 21:59:58 +01:00 committed by GitHub
commit 3d2eb36e27
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 51 additions and 14 deletions

View file

@ -1472,26 +1472,43 @@ class PartialEvaluator {
// Shadings and patterns may be referenced by the same name but the resource
// dictionary could be different so we can't use the name for the cache key.
let id = localShadingPatternCache.get(shading);
if (!id) {
var shadingFill = Pattern.parseShading(
if (id) {
return id;
}
let patternIR;
try {
const shadingFill = Pattern.parseShading(
shading,
this.xref,
resources,
this._pdfFunctionFactory,
localColorSpaceCache
);
const patternIR = shadingFill.getIR();
id = `pattern_${this.idFactory.createObjId()}`;
if (this.parsingType3Font) {
id = `${this.idFactory.getDocId()}_type3_${id}`;
patternIR = shadingFill.getIR();
} catch (reason) {
if (reason instanceof AbortException) {
return null;
}
localShadingPatternCache.set(shading, id);
if (this.options.ignoreErrors) {
warn(`parseShading - ignoring shading: "${reason}".`);
if (this.parsingType3Font) {
this.handler.send("commonobj", [id, "Pattern", patternIR]);
} else {
this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]);
localShadingPatternCache.set(shading, null);
return null;
}
throw reason;
}
id = `pattern_${this.idFactory.createObjId()}`;
if (this.parsingType3Font) {
id = `${this.idFactory.getDocId()}_type3_${id}`;
}
localShadingPatternCache.set(shading, id);
if (this.parsingType3Font) {
this.handler.send("commonobj", [id, "Pattern", patternIR]);
} else {
this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]);
}
return id;
}
@ -1551,14 +1568,16 @@ class PartialEvaluator {
);
} else if (typeNum === PatternType.SHADING) {
const shading = dict.get("Shading");
const matrix = dict.getArray("Matrix");
const objId = this.parseShading({
shading,
resources,
localColorSpaceCache,
localShadingPatternCache,
});
operatorList.addOp(fn, ["Shading", objId, matrix]);
if (objId) {
const matrix = dict.getArray("Matrix");
operatorList.addOp(fn, ["Shading", objId, matrix]);
}
return undefined;
}
throw new FormatError(`Unknown PatternType: ${typeNum}`);
@ -2109,6 +2128,9 @@ class PartialEvaluator {
localColorSpaceCache,
localShadingPatternCache,
});
if (!patternId) {
continue;
}
args = [patternId];
fn = OPS.shadingFill;
break;

View file

@ -956,13 +956,20 @@ class MeshShading extends BaseShading {
}
getIR() {
const { bounds } = this;
// Ensure that the shading has non-zero width and height, to prevent errors
// in `pattern_helper.js` (fixes issue17848.pdf).
if (bounds[2] - bounds[0] === 0 || bounds[3] - bounds[1] === 0) {
throw new FormatError(`Invalid MeshShading bounds: [${bounds}].`);
}
return [
"Mesh",
this.shadingType,
this.coords,
this.colors,
this.figures,
this.bounds,
bounds,
this.bbox,
this.background,
];

View file

@ -462,6 +462,7 @@
!issue15716.pdf
!bug1671312_reduced.pdf
!bug1671312_ArialNarrow.pdf
!issue17848.pdf
!issue6108.pdf
!issue6113.pdf
!openoffice.pdf

BIN
test/pdfs/issue17848.pdf Normal file

Binary file not shown.

View file

@ -2562,6 +2562,13 @@
"link": false,
"type": "eq"
},
{
"id": "issue17848",
"file": "pdfs/issue17848.pdf",
"md5": "9a5b7ee97e1e03ad506115f15f9b57af",
"rounds": 1,
"type": "eq"
},
{
"id": "personwithdog",
"file": "pdfs/personwithdog.pdf",