经过数小时的研究,我在 ng2-pdf-viewer 中找到了 synctex highlight 的解决方案。
我们可以创建一个 div 元素并根据这些值调整其顶部、左侧、宽度和高度,而不是在画布上绘制同步输出值。在此之前,我们需要重新计算相对于我们的 pdf-viewer 的值。
“synctex view”命令的结果返回 v、h、width、height、页码值。
然后解析如下。
var pageno = parseInt(datas['pageNum']);
//i'm using ng2-pdf-viewer, ViewChild('pdfviewer');
var pageView = this.pdfviewer.pdfViewer._pages[pageno - 1];
//datas - array returning from server contains synctex output values
var left = parseInt(datas['h']);
var top = parseInt(datas['v']);
var width = parseInt(datas['width']);
var height = parseInt(datas['height']);
//recalculating top value
top = pageView.viewport.viewBox[3] - top;
var valueArray = [left,top,left + width,top + height];
let rect = pageView.viewport.convertToViewportRectangle(valueArray);
rect = pdfjs.Util.normalizeRect(rect);
var x = Math.min(rect[0], rect[2]), width = Math.abs(rect[0] - rect[2]);
var y = Math.min(rect[1], rect[3]), height = Math.abs(rect[1] - rect[3])
const element = document.createElement('div');
element.setAttribute("class", "overlay-div-synctex");
element.style.left = x + 'px';
element.style.top = y + 'px';
element.style.width = width + 'px';
element.style.height = height + 'px';
element.style.position = 'absolute';
element.style.backgroundColor = 'rgba(255,255,0,0.5)';
//jquery is used here, replace it with javascript
$('*[data-page-number="'+pageno+'"]').append(element);
this.pdfviewer.pdfViewer._scrollIntoView({
pageDiv: pageView.div
});
如果您的 synctex 命令返回多个 h,v.. 值,则循环并附加突出显示元素。
希望对你有帮助。