Ignore color-operators in Type3 glyphs beginning with a d1
operator (issue 12705)
Please refer to the PDF specification at https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf#G8.1977497 and https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf#G7.3998470 This patch removes the color-operators in the evaluator, since that should be more efficient than doing it repeatedly in the main-thread when rendering the Type3 glyphs.
This commit is contained in:
parent
00b4f86db3
commit
67e5db75d8
@ -3602,7 +3602,7 @@ class TranslatedFont {
|
|||||||
var charProcOperatorList = Object.create(null);
|
var charProcOperatorList = Object.create(null);
|
||||||
|
|
||||||
for (const key of charProcs.getKeys()) {
|
for (const key of charProcs.getKeys()) {
|
||||||
loadCharProcsPromise = loadCharProcsPromise.then(function () {
|
loadCharProcsPromise = loadCharProcsPromise.then(() => {
|
||||||
var glyphStream = charProcs.get(key);
|
var glyphStream = charProcs.get(key);
|
||||||
var operatorList = new OperatorList();
|
var operatorList = new OperatorList();
|
||||||
return type3Evaluator
|
return type3Evaluator
|
||||||
@ -3612,7 +3612,16 @@ class TranslatedFont {
|
|||||||
resources: fontResources,
|
resources: fontResources,
|
||||||
operatorList,
|
operatorList,
|
||||||
})
|
})
|
||||||
.then(function () {
|
.then(() => {
|
||||||
|
// According to the PDF specification, section "9.6.5 Type 3 Fonts"
|
||||||
|
// and "Table 113":
|
||||||
|
// "A glyph description that begins with the d1 operator should
|
||||||
|
// not execute any operators that set the colour (or other
|
||||||
|
// colour-related parameters) in the graphics state;
|
||||||
|
// any use of such operators shall be ignored."
|
||||||
|
if (operatorList.fnArray[0] === OPS.setCharWidthAndBounds) {
|
||||||
|
this._removeType3ColorOperators(operatorList);
|
||||||
|
}
|
||||||
charProcOperatorList[key] = operatorList.getIR();
|
charProcOperatorList[key] = operatorList.getIR();
|
||||||
|
|
||||||
for (const dependency of operatorList.dependencies) {
|
for (const dependency of operatorList.dependencies) {
|
||||||
@ -3631,6 +3640,68 @@ class TranslatedFont {
|
|||||||
});
|
});
|
||||||
return this.type3Loaded;
|
return this.type3Loaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
_removeType3ColorOperators(operatorList) {
|
||||||
|
if (
|
||||||
|
typeof PDFJSDev === "undefined" ||
|
||||||
|
PDFJSDev.test("!PRODUCTION || TESTING")
|
||||||
|
) {
|
||||||
|
assert(
|
||||||
|
operatorList.fnArray[0] === OPS.setCharWidthAndBounds,
|
||||||
|
"Type3 glyph shall start with the d1 operator."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let i = 1,
|
||||||
|
ii = operatorList.length;
|
||||||
|
while (i < ii) {
|
||||||
|
switch (operatorList.fnArray[i]) {
|
||||||
|
case OPS.setStrokeColorSpace:
|
||||||
|
case OPS.setFillColorSpace:
|
||||||
|
case OPS.setStrokeColor:
|
||||||
|
case OPS.setStrokeColorN:
|
||||||
|
case OPS.setFillColor:
|
||||||
|
case OPS.setFillColorN:
|
||||||
|
case OPS.setStrokeGray:
|
||||||
|
case OPS.setFillGray:
|
||||||
|
case OPS.setStrokeRGBColor:
|
||||||
|
case OPS.setFillRGBColor:
|
||||||
|
case OPS.setStrokeCMYKColor:
|
||||||
|
case OPS.setFillCMYKColor:
|
||||||
|
case OPS.shadingFill:
|
||||||
|
case OPS.setRenderingIntent:
|
||||||
|
operatorList.fnArray.splice(i, 1);
|
||||||
|
operatorList.argsArray.splice(i, 1);
|
||||||
|
ii--;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case OPS.setGState:
|
||||||
|
const gStateObj = operatorList.argsArray[i];
|
||||||
|
let j = 0,
|
||||||
|
jj = gStateObj.length;
|
||||||
|
while (j < jj) {
|
||||||
|
const [gStateKey] = gStateObj[j];
|
||||||
|
switch (gStateKey) {
|
||||||
|
case "TR":
|
||||||
|
case "TR2":
|
||||||
|
case "HT":
|
||||||
|
case "BG":
|
||||||
|
case "BG2":
|
||||||
|
case "UCR":
|
||||||
|
case "UCR2":
|
||||||
|
gStateObj.splice(j, 1);
|
||||||
|
jj--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class StateManager {
|
class StateManager {
|
||||||
|
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -222,6 +222,7 @@
|
|||||||
!issue5734.pdf
|
!issue5734.pdf
|
||||||
!issue4875.pdf
|
!issue4875.pdf
|
||||||
!issue11740_reduced.pdf
|
!issue11740_reduced.pdf
|
||||||
|
!issue12705.pdf
|
||||||
!issue4881.pdf
|
!issue4881.pdf
|
||||||
!issue5994.pdf
|
!issue5994.pdf
|
||||||
!issue6151.pdf
|
!issue6151.pdf
|
||||||
|
BIN
test/pdfs/issue12705.pdf
Normal file
BIN
test/pdfs/issue12705.pdf
Normal file
Binary file not shown.
@ -4531,6 +4531,12 @@
|
|||||||
"annotations": true,
|
"annotations": true,
|
||||||
"type": "eq"
|
"type": "eq"
|
||||||
},
|
},
|
||||||
|
{ "id": "issue12705",
|
||||||
|
"file": "pdfs/issue12705.pdf",
|
||||||
|
"md5": "d8725b9dcfef72fd4fa4a39cab711624",
|
||||||
|
"rounds": 1,
|
||||||
|
"type": "eq"
|
||||||
|
},
|
||||||
{ "id": "annotation-strikeout",
|
{ "id": "annotation-strikeout",
|
||||||
"file": "pdfs/annotation-strikeout.pdf",
|
"file": "pdfs/annotation-strikeout.pdf",
|
||||||
"md5": "6624e6b5bedd2f2855b6ab12bbf93c57",
|
"md5": "6624e6b5bedd2f2855b6ab12bbf93c57",
|
||||||
|
Loading…
Reference in New Issue
Block a user