This commit is contained in:
Vanessa 2022-07-06 10:57:22 +08:00
parent 313074414a
commit dad4cb505b

View File

@ -369,6 +369,24 @@ const getHightlightCoordsByRect = (pdf: any, color: string, rectResizeElement: H
return result; return result;
}; };
const mergeRects = (range: Range) => {
const rects = range.getClientRects();
const mergedRects: { left: number, top: number, right: number, bottom: number }[] = [];
let lastTop: number = undefined
Array.from(rects).forEach(item => {
if (item.height === 0 || item.width === 0) {
return;
}
if (typeof lastTop === "undefined" || Math.abs(lastTop - item.top) > 4) {
mergedRects.push({left: item.left, top: item.top, right: item.right, bottom: item.bottom});
lastTop = item.top;
} else {
mergedRects[mergedRects.length - 1].right = item.right
}
})
return mergedRects
}
const getHightlightCoordsByRange = (pdf: any, color: string) => { const getHightlightCoordsByRange = (pdf: any, color: string) => {
const range = window.getSelection().getRangeAt(0); const range = window.getSelection().getRangeAt(0);
const startPageElement = hasClosestByClassName(range.startContainer, "page"); const startPageElement = hasClosestByClassName(range.startContainer, "page");
@ -409,9 +427,8 @@ const getHightlightCoordsByRange = (pdf: any, color: string) => {
range.setEndAfter(startDivs[startDivs.length - 1]); range.setEndAfter(startDivs[startDivs.length - 1]);
} }
const startSelectionRects = range.getClientRects();
const startSelected: number[] = []; const startSelected: number[] = [];
Array.from(startSelectionRects).forEach(function (r) { mergeRects(range).forEach(function (r) {
startSelected.push( startSelected.push(
startViewport.convertToPdfPoint(r.left - startPageRect.x, startViewport.convertToPdfPoint(r.left - startPageRect.x,
r.top - startPageRect.y).concat(startViewport.convertToPdfPoint(r.right - startPageRect.x, r.top - startPageRect.y).concat(startViewport.convertToPdfPoint(r.right - startPageRect.x,
@ -427,8 +444,7 @@ const getHightlightCoordsByRange = (pdf: any, color: string) => {
const endViewport = endPage.viewport; const endViewport = endPage.viewport;
const endDivs = endPage.textLayer.textDivs; const endDivs = endPage.textLayer.textDivs;
cloneRange.setStart(endDivs[0], 0); cloneRange.setStart(endDivs[0], 0);
const endSelectionRects = cloneRange.getClientRects(); mergeRects(cloneRange).forEach(function (r) {
Array.from(endSelectionRects).forEach(function (r) {
endSelected.push( endSelected.push(
endViewport.convertToPdfPoint(r.left - endPageRect.x, endViewport.convertToPdfPoint(r.left - endPageRect.x,
r.top - endPageRect.y).concat(endViewport.convertToPdfPoint(r.right - endPageRect.x, r.top - endPageRect.y).concat(endViewport.convertToPdfPoint(r.right - endPageRect.x,