简体   繁体   English

使用 Pdf.js 突出显示 pdf 中的一个部分

[英]Highlight a section inside pdf using Pdf.js

I'm currently using pdf.js for my project to render PDFs.我目前正在为我的项目使用 pdf.js 来呈现 PDF。

Now there is this tricky task to highlight a section of a PDF page given the coordinates.现在有一个棘手的任务来突出显示给定坐标的 PDF 页面的一部分。

Example例子

Given a boundary section like [(31,35),(40,35),(40,40),(31,40)] I should highlight the given section with any primary color of choice.给定一个像[(31,35),(40,35),(40,40),(31,40)]这样的边界部分[(31,35),(40,35),(40,40),(31,40)]我应该用任何选择的原色突出显示给定的部分。

How can I accomplish this task using Javascript and the pdf.js API?如何使用 Javascript 和 pdf.js API 完成此任务?

Is it possible or am I sounding overambitious?这是可能的还是我听起来过于雄心勃勃?

One of the authors for PDF.js, cjones , has stated: PDF.js 的作者之一cjones表示:

No, and that's (highlighting) not like something we would add to pdf.js. That ought to be easy to layer on top of pdf.js.

Source : http://blog.mozilla.org/cjones/2011/07/03/pdf-js-first-milestone/来源http : //blog.mozilla.org/cjones/2011/07/03/pdf-js-first-milestone/

You will need to implement it yourself if you are interested in using this functionality.如果您有兴趣使用此功能,则需要自己实现它。

I found a better way to achieve this find the co-ordinate of the point in the html page我找到了一个更好的方法来实现这个在 html 页面中找到点的坐标

and then subtract the co-ordinate(position) of div.textLayer from it to find the co-ordinate然后从中减去div.textLayer的坐标(位置)以找到坐标

of the text in the pdf displayed online.在线显示的 pdf 中的文本。

In order to find the co-ordinate of the text in actual pdf find the aspect ratio and you would为了找到实际pdf中文本的坐标,找到纵横比,你会

get the actual co-ordinate获取实际坐标

example例子

if the pdf displayed online is 800x900 and the text co-ordinate如果在线显示的 pdf 是800x900并且文本坐标

[(31,35),(40,35),(40,40),(31,40)]

and the actual pdf size is 612x792实际的pdf大小是612x792

find the appropriate value of the area in actual pdf like this像这样在实际的pdf中找到该区域的适当值

(612/(800 / 31)),(792/(900/35))

and do this way for all co-ordinate found in online并对在线找到的所有坐标执行此操作

ie IE

(40,35),(40,40),(31,40)

NOTE: -笔记: -

Might want to check the PDF.js API called convertToPdfPoint可能想要检查名为convertToPdfPoint的 PDF.js API

If selecting text could be sufficient for your needs, you might find an entry for your solution in SO about highlighting text in PDF.js .如果选择文本足以满足您的需求,您可能会在SO 中找到有关在 PDF.js 中突出显示文本的解决方案条目。

The text is selected via document.getSelection() .文本是通过document.getSelection()

Adjustment for color as you said can be accomplished by using您所说的颜色调整可以通过使用来完成

<span style="yourColorDefinition">

instead of代替

<span class="hightlight">

I wrote this example to show how can be achived, the PDF display with textLayer, only with the updated pdf.js library.我写了这个例子来展示如何实现,PDF 显示与 textLayer,仅使用更新的 pdf.js 库。 If you want the interface of normal pdf web, you have to use viewer.js and implement the listeners.如果你想要普通pdf web的界面,你必须使用viewer.js并实现监听器。

 window.onload = function () { // atob() is used to convert base64 encoded PDF to binary-like data. var pdfBase64 = atob("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u78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNC4yLjEtYzA0MyA1Mi4zNzI3MjgsIDIwMDkvMDEvMTgtMTU6MDg6MDQgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaT5jZGFpbHk8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L2RjOmNyZWF0b3I+CiAgICAgICAgIDxkYzp0aXRsZT4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAgICAgICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+VGhpcyBpcyBhIHRlc3QgUERGIGZpbGU8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6QWx0PgogICAgICAgICA8L2RjOnRpdGxlPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMDAtMDYtMjlUMTA6MjE6MDgrMTE6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPk1pY3Jvc29mdCBXb3JkIDguMDwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxMy0xMC0yOFQxNToyNDoxMy0wNDowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTMtMTAtMjhUMTU6MjQ6MTMtMDQ6MDA8L3htcDpNZXRhZGF0YURhdGU++dXVpZDo2MmQ2YWU2ZC00M2M0LTQ3MmQtOWIyOC03YzRhZGQ4ZjllNDY8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+/eHBhY2tldCBlbmQ9InciPz4NCmVuZHN0cmVhbQ1lbmRvYmoNMiAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgNC9MZW5ndGggNDgvTiAxL1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjeMlUwULCx0XfOL80rUTDU985MKY62BIoFxeqHVBak6gckpqcW29kBBBgA1ncLgA0KZW5kc3RyZWFtDWVuZG9iag0zIDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9GaXJzdCA0L0xlbmd0aCAxNjcvTiAxL1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjePMvBCsIwEEXRX5mdDaKdxCpVSqFY3AkuBNexSelA6EAyRfx7A4qPu3znAAhNU3aLTByLwVkKb1Weo7dCPPdWfNGfDOYdzFGj0VivtV4hrn6vrK40RE48Cjw4Oqi3qMoruz/WuwxrvTeV3m2w+uJbZLcMPhZdxk8r0FMSCsFHqLYII0d40Oz4lVR5Jwm+uE+UIGdBfBK49RcYKXjVth8BBgBnZztkDQplbmRzdHJlYW0NZW5kb2JqDTQgMCBvYmoNPDwvRGVjb2RlUGFybXM8PC9Db2x1bW5zIDMvUHJlZGljdG9yIDEyPj4vRmlsdGVyL0ZsYXRlRGVjb2RlL0lEWzw0REM5MUExODc1QTZENzA3QUVDMjAzQkIwMjFDOTNBMD48RjZDOTJCMzY4QThBMTM0MDg0NTdBMUQzOTVBMzdFQjk+XS9JbmZvIDYgMCBSL0xlbmd0aCAzNy9Sb290IDggMCBSL1NpemUgNy9UeXBlL1hSZWYvV1sxIDIgMF0+PnN0cmVhbQ0KaN5iYmBgYGLkPcLEwD+ViYGhh4mBkYWJ8bEkkM0IEGAAKlkDFA0KZW5kc3RyZWFtDWVuZG9iag1zdGFydHhyZWYNCjExNg0KJSVFT0YNCg=="); function getOutputScale() { var pixelRatio = 'devicePixelRatio' in window ? window.devicePixelRatio : 1; return { sx: pixelRatio, sy: pixelRatio, scaled: pixelRatio != 1 }; } window.myState = { pdfDoc: null, pageNum: 1, pageRendering: false, pageNumPending: null, scale: 1.2, canvas: null, ctx: null, textLayer: null, }; myState.canvas = document.createElement("canvas"); var $pdfContainer = document.querySelector("#pdfContainer"); $pdfContainer.appendChild(myState.canvas); myState.ctx = myState.canvas.getContext('2d'); // Create TextLayer Div var canvasOffset = myState.canvas.getBoundingClientRect(); var $textLayerDiv = document.createElement("div"); $textLayerDiv.classList.add("textLayer"); $pdfContainer.append($textLayerDiv); myState.textLayer = $textLayerDiv; /** * Get page info from document, resize canvas accordingly, and render page. * @param num Page number. */ function renderPage(num) { myState.pageRendering = true; // Using promise to fetch the page myState.pdfDoc.getPage(num).then(function(page) { var viewport = page.getViewport({scale: myState.scale}); // The following few lines of code set up scaling on the ctx if we are on a HiDPI display var outputScale = getOutputScale(); myState.canvas.width = Math.floor(viewport.width); myState.canvas.height = Math.floor(viewport.height); myState.canvas.style.width = Math.floor(viewport.width) + "px"; myState.canvas.style.height = Math.floor(viewport.height) + "px"; $textLayerDiv.style.width = Math.floor(viewport.width) + "px"; $textLayerDiv.style.height = Math.floor(viewport.height) + "px"; let canvasOffset = myState.canvas.getBoundingClientRect(); $textLayerDiv.style.top = `${canvasOffset.top}px`; $textLayerDiv.style.left = `${canvasOffset.left}px`; const transform = outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] : null; // Render PDF page into canvas context var renderContext = { canvasContext: myState.ctx, viewport: viewport, transform: transform, }; var renderTask = page.render(renderContext); renderTask.promise.then(() => { myState.pageRendering = false; if (myState.pageNumPending !== null) { // New page rendering is pending renderPage(myState.pageNumPending); myState.pageNumPending = null; } return page.getTextContent().then((textContent) => { var textLayer = pdfjsLib.renderTextLayer({ textContent: textContent, container: $textLayerDiv, viewport: viewport }); textLayer._render(); }); }); }); // Update page counters // document.getElementById('page_num').textContent = num; } /** * If another page rendering in progress, waits until the rendering is * finised. Otherwise, executes rendering immediately. */ function queueRenderPage(num) { if (myState.pageRendering) { myState.pageNumPending = num; } else { renderPage(num); } } /** * Displays previous page. */ function onPrevPage() { if (myState.pageNum <= 1) { return; } myState.pageNum--; queueRenderPage(myState.pageNum); } /** * Displays next page. */ function onNextPage() { if (myState.pageNum >= myState.pdfDoc.numPages) { return; } myState.pageNum++; queueRenderPage(myState.pageNum); } // document.getElementById('next').addEventListener('click', onNextPage); // document.getElementById('prev').addEventListener('click', onPrevPage); let urlPDF = "https://www.soundczech.cz/temp/lorem-ipsum.pdf" /** * Asynchronously downloads PDF. */ pdfjsLib.getDocument({data: pdfBase64}).promise.then(function(pdfDoc_) { myState.pdfDoc = pdfDoc_; // document.getElementById('page_count').textContent = pdfDoc.numPages; // Initial/first page rendering renderPage(myState.pageNum); }); // Text Higlihter function getSelectionCoords() { let pageIndex = myState.pageNum; let selectedPromise = myState.pdfDoc.getPage(pageIndex).then((_page) => { let pageRect = myState.canvas.getClientRects()[0]; let selectionRects = window.getSelection().getRangeAt(0).getClientRects(); let viewport = _page.getViewport({scale: myState.scale}); let selectionRectsList = Object.values(selectionRects); let selected = selectionRectsList.map(function (r) { return viewport.convertToPdfPoint(r.left - pageRect.x, r.top - pageRect.y).concat( viewport.convertToPdfPoint(r.right - pageRect.x, r.bottom - pageRect.y)); }); return selected; }); return {pageIndex: pageIndex, coordsPromise: selectedPromise}; } function showHighlight() { var {pageIndex, coordsPromise} = getSelectionCoords(); myState.pdfDoc.getPage(pageIndex).then((page) => { var viewport = page.getViewport({scale: myState.scale});; coordsPromise.then((coords) => { let highlightColor = generateColor(); coords.forEach(function (rect) { let bounds = viewport.convertToViewportRectangle(rect); var x1 = Math.min(bounds[0], bounds[2]); var y1 = Math.min(bounds[1], bounds[3]); var width = Math.abs(bounds[0] - bounds[2]); var hight = Math.abs(bounds[1] - bounds[3]); var el = createRectDiv([x1, y1, width, hight], highlightColor); myState.textLayer.appendChild(el); }); }); }); } const generateColor = () => { return Math.floor(Math.random()*16777215).toString(16); } function createRectDiv(boundBox, highlightColor){ // console.log(randomColor); var el = document.createElement('div'); el.setAttribute('class', 'hiDiv') el.setAttribute('style', 'position: absolute; background-color: #'+highlightColor+'; opacity: 0.5;' + 'left:' + boundBox[0] + 'px; top:' + boundBox[1] + 'px;' + 'width:' + boundBox[2] + 'px; height:' + boundBox[3] + 'px;'); return el; } window.addEventListener('mouseup', function() { var length = window.getSelection().toString().length; if(length > 0){ showHighlight(); }else { // Clear All ?! } console.log(); }); };
 #pdfContainer { display: flex; justify-content: center; }
 <link href="https://mozilla.github.io/pdf.js/web/viewer.css" rel="stylesheet"/> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.min.js"></script> <div id="pdfContainer" class="pdf-content"></div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM