Attempt to combine text runs positioned with setTextMatrix
This commit is contained in:
parent
8aa5901c20
commit
7ddb0bc718
@ -1396,7 +1396,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
|||||||
textState = stateManager.state;
|
textState = stateManager.state;
|
||||||
var fn = operation.fn;
|
var fn = operation.fn;
|
||||||
args = operation.args;
|
args = operation.args;
|
||||||
var advance;
|
var advance, diff;
|
||||||
|
|
||||||
switch (fn | 0) {
|
switch (fn | 0) {
|
||||||
case OPS.setFont:
|
case OPS.setFont:
|
||||||
@ -1429,7 +1429,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
|||||||
(args[0] - textContentItem.lastAdvanceWidth);
|
(args[0] - textContentItem.lastAdvanceWidth);
|
||||||
textContentItem.height +=
|
textContentItem.height +=
|
||||||
(args[1] - textContentItem.lastAdvanceHeight);
|
(args[1] - textContentItem.lastAdvanceHeight);
|
||||||
var diff = (args[0] - textContentItem.lastAdvanceWidth) -
|
diff = (args[0] - textContentItem.lastAdvanceWidth) -
|
||||||
(args[1] - textContentItem.lastAdvanceHeight);
|
(args[1] - textContentItem.lastAdvanceHeight);
|
||||||
addFakeSpaces(diff, textContentItem.str);
|
addFakeSpaces(diff, textContentItem.str);
|
||||||
break;
|
break;
|
||||||
@ -1450,6 +1450,24 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
|
|||||||
textState.carriageReturn();
|
textState.carriageReturn();
|
||||||
break;
|
break;
|
||||||
case OPS.setTextMatrix:
|
case OPS.setTextMatrix:
|
||||||
|
// Optimization to treat same line movement as advance.
|
||||||
|
advance = textState.calcTextLineMatrixAdvance(
|
||||||
|
args[0], args[1], args[2], args[3], args[4], args[5]);
|
||||||
|
if (advance !== null && textContentItem.initialized &&
|
||||||
|
advance.value > 0 &&
|
||||||
|
advance.value <= textContentItem.fakeMultiSpaceMax) {
|
||||||
|
textState.translateTextLineMatrix(advance.width,
|
||||||
|
advance.height);
|
||||||
|
textContentItem.width +=
|
||||||
|
(advance.width - textContentItem.lastAdvanceWidth);
|
||||||
|
textContentItem.height +=
|
||||||
|
(advance.height - textContentItem.lastAdvanceHeight);
|
||||||
|
diff = (advance.width - textContentItem.lastAdvanceWidth) -
|
||||||
|
(advance.height - textContentItem.lastAdvanceHeight);
|
||||||
|
addFakeSpaces(diff, textContentItem.str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
flushTextContentItem();
|
flushTextContentItem();
|
||||||
textState.setTextMatrix(args[0], args[1], args[2], args[3],
|
textState.setTextMatrix(args[0], args[1], args[2], args[3],
|
||||||
args[4], args[5]);
|
args[4], args[5]);
|
||||||
@ -2547,6 +2565,30 @@ var TextState = (function TextStateClosure() {
|
|||||||
m[4] = m[0] * x + m[2] * y + m[4];
|
m[4] = m[0] * x + m[2] * y + m[4];
|
||||||
m[5] = m[1] * x + m[3] * y + m[5];
|
m[5] = m[1] * x + m[3] * y + m[5];
|
||||||
},
|
},
|
||||||
|
calcTextLineMatrixAdvance:
|
||||||
|
function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) {
|
||||||
|
var font = this.font;
|
||||||
|
if (!font) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var m = this.textLineMatrix;
|
||||||
|
if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var txDiff = e - m[4], tyDiff = f - m[5];
|
||||||
|
if ((font.vertical && txDiff !== 0) || (!font.vertical && tyDiff !== 0)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var tx, ty, denominator = a * d - b * c;
|
||||||
|
if (font.vertical) {
|
||||||
|
tx = -tyDiff * c / denominator;
|
||||||
|
ty = tyDiff * a / denominator;
|
||||||
|
} else {
|
||||||
|
tx = txDiff * d / denominator;
|
||||||
|
ty = -txDiff * b / denominator;
|
||||||
|
}
|
||||||
|
return { width: tx, height: ty, value: (font.vertical ? ty : tx), };
|
||||||
|
},
|
||||||
calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {
|
calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {
|
||||||
// 9.4.4 Text Space Details
|
// 9.4.4 Text Space Details
|
||||||
var tsm = [this.fontSize * this.textHScale, 0,
|
var tsm = [this.fontSize * this.textHScale, 0,
|
||||||
|
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -20,6 +20,7 @@
|
|||||||
!issue6204.pdf
|
!issue6204.pdf
|
||||||
!issue6782.pdf
|
!issue6782.pdf
|
||||||
!issue6961.pdf
|
!issue6961.pdf
|
||||||
|
!issue6962.pdf
|
||||||
!issue7020.pdf
|
!issue7020.pdf
|
||||||
!issue7101.pdf
|
!issue7101.pdf
|
||||||
!issue7115.pdf
|
!issue7115.pdf
|
||||||
|
BIN
test/pdfs/issue6962.pdf
Normal file
BIN
test/pdfs/issue6962.pdf
Normal file
Binary file not shown.
@ -1111,6 +1111,13 @@
|
|||||||
"type": "eq",
|
"type": "eq",
|
||||||
"about": "Please note that this file currently renders incorrectly."
|
"about": "Please note that this file currently renders incorrectly."
|
||||||
},
|
},
|
||||||
|
{ "id": "issue6962",
|
||||||
|
"file": "pdfs/issue6962.pdf",
|
||||||
|
"md5": "d40e871ecca68baf93114bd28c782148",
|
||||||
|
"rounds": 1,
|
||||||
|
"link": false,
|
||||||
|
"type": "text"
|
||||||
|
},
|
||||||
{ "id": "issue5644",
|
{ "id": "issue5644",
|
||||||
"file": "pdfs/issue5644.pdf",
|
"file": "pdfs/issue5644.pdf",
|
||||||
"md5": "6f9313c5043b3ecb0ab2df321d3e1847",
|
"md5": "6f9313c5043b3ecb0ab2df321d3e1847",
|
||||||
|
Loading…
Reference in New Issue
Block a user