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(); 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 ( posX < viewBox[0] ||
shiftedX < 0 || posX > viewBox[2] ||
shiftedX > viewBox[2] || posY + glyphWidth < viewBox[1] ||
shiftedY < 0 || posY > viewBox[3]
shiftedY > 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;
} }

View File

@ -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

Binary file not shown.

View File

@ -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();