Correctly clip the text in the text layer (fixes #16316)

This commit is contained in:
Calixte Denizet 2023-04-18 16:39:10 +02:00
parent f1b005d7b8
commit 19ca41896e
4 changed files with 41 additions and 11 deletions

View File

@ -2575,19 +2575,26 @@ class PartialEvaluator {
];
}
function compareWithLastPosition() {
function compareWithLastPosition(glyphWidth) {
const currentTransform = getCurrentTextTransform();
let posX = currentTransform[4];
let posY = currentTransform[5];
const shiftedX = posX - viewBox[0];
const shiftedY = posY - viewBox[1];
if (
shiftedX < 0 ||
shiftedX > viewBox[2] ||
shiftedY < 0 ||
shiftedY > viewBox[3]
// Check if the glyph is in the viewbox.
if (textState.font && textState.font.vertical) {
if (
posX < viewBox[0] ||
posX > viewBox[2] ||
posY + glyphWidth < viewBox[1] ||
posY > viewBox[3]
) {
return false;
}
} else if (
posX + glyphWidth < viewBox[0] ||
posX > viewBox[2] ||
posY < viewBox[1] ||
posY > viewBox[3]
) {
return false;
}
@ -2837,8 +2844,16 @@ class PartialEvaluator {
continue;
}
if (!category.isZeroWidthDiacritic && !compareWithLastPosition()) {
// The glyph is not in page so just skip it.
if (
!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;
}

View File

@ -586,3 +586,4 @@
!issue16224.pdf
!issue16278.pdf
!copy_paste_ligatures.pdf
!issue16316.pdf

BIN
test/pdfs/issue16316.pdf Executable file

Binary file not shown.

View File

@ -2668,6 +2668,20 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
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 () {
const tree = await page.getStructTree();