Correctly clip the text in the text layer (fixes #16316)
This commit is contained in:
parent
f1b005d7b8
commit
19ca41896e
@ -2575,19 +2575,26 @@ class PartialEvaluator {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
function compareWithLastPosition() {
|
function compareWithLastPosition(glyphWidth) {
|
||||||
const currentTransform = getCurrentTextTransform();
|
const currentTransform = getCurrentTextTransform();
|
||||||
let posX = currentTransform[4];
|
let posX = currentTransform[4];
|
||||||
let posY = currentTransform[5];
|
let posY = currentTransform[5];
|
||||||
|
|
||||||
const shiftedX = posX - viewBox[0];
|
// Check if the glyph is in the viewbox.
|
||||||
const shiftedY = posY - viewBox[1];
|
if (textState.font && textState.font.vertical) {
|
||||||
|
|
||||||
if (
|
if (
|
||||||
shiftedX < 0 ||
|
posX < viewBox[0] ||
|
||||||
shiftedX > viewBox[2] ||
|
posX > viewBox[2] ||
|
||||||
shiftedY < 0 ||
|
posY + glyphWidth < viewBox[1] ||
|
||||||
shiftedY > viewBox[3]
|
posY > viewBox[3]
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
posX + glyphWidth < viewBox[0] ||
|
||||||
|
posX > viewBox[2] ||
|
||||||
|
posY < viewBox[1] ||
|
||||||
|
posY > viewBox[3]
|
||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2837,8 +2844,16 @@ class PartialEvaluator {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!category.isZeroWidthDiacritic && !compareWithLastPosition()) {
|
if (
|
||||||
// The glyph is not in page so just skip it.
|
!category.isZeroWidthDiacritic &&
|
||||||
|
!compareWithLastPosition(scaledDim)
|
||||||
|
) {
|
||||||
|
// The glyph is not in page so just skip it but move the cursor.
|
||||||
|
if (!font.vertical) {
|
||||||
|
textState.translateTextMatrix(scaledDim * textState.textHScale, 0);
|
||||||
|
} else {
|
||||||
|
textState.translateTextMatrix(0, scaledDim);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -586,3 +586,4 @@
|
|||||||
!issue16224.pdf
|
!issue16224.pdf
|
||||||
!issue16278.pdf
|
!issue16278.pdf
|
||||||
!copy_paste_ligatures.pdf
|
!copy_paste_ligatures.pdf
|
||||||
|
!issue16316.pdf
|
||||||
|
BIN
test/pdfs/issue16316.pdf
Executable file
BIN
test/pdfs/issue16316.pdf
Executable file
Binary file not shown.
@ -2668,6 +2668,20 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
|
|||||||
await loadingTask.destroy();
|
await loadingTask.destroy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("gets text content with a specific view box", async function () {
|
||||||
|
const loadingTask = getDocument(buildGetDocumentParams("issue16316.pdf"));
|
||||||
|
const pdfDoc = await loadingTask.promise;
|
||||||
|
const pdfPage = await pdfDoc.getPage(1);
|
||||||
|
const { items } = await pdfPage.getTextContent({
|
||||||
|
disableNormalization: true,
|
||||||
|
});
|
||||||
|
const text = mergeText(items);
|
||||||
|
|
||||||
|
expect(text).toEqual("Experimentation,");
|
||||||
|
|
||||||
|
await loadingTask.destroy();
|
||||||
|
});
|
||||||
|
|
||||||
it("gets empty structure tree", async function () {
|
it("gets empty structure tree", async function () {
|
||||||
const tree = await page.getStructTree();
|
const tree = await page.getStructTree();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user