Skip to content

Instantly share code, notes, and snippets.

@yurydelendik
Last active October 1, 2024 08:02
Show Gist options
  • Save yurydelendik/f2b846dae7cb29c86d23 to your computer and use it in GitHub Desktop.
Save yurydelendik/f2b846dae7cb29c86d23 to your computer and use it in GitHub Desktop.
PDF.js get/show hightlight
function getHightlightCoords() {
var pageIndex = PDFViewerApplication.pdfViewer.currentPageNumber - 1;
var page = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
var pageRect = page.canvas.getClientRects()[0];
var selectionRects = window.getSelection().getRangeAt(0).getClientRects();
var viewport = page.viewport;
var selected = selectionRects.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 {page: pageIndex, coords: selected};
}
function showHighlight(selected) {
var pageIndex = selected.page;
var page = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
var pageElement = page.canvas.parentElement;
var viewport = page.viewport;
selected.coords.forEach(function (rect) {
var bounds = viewport.convertToViewportRectangle(rect);
var el = document.createElement('div');
el.setAttribute('style', 'position: absolute; background-color: pink;' +
'left:' + Math.min(bounds[0], bounds[2]) + 'px; top:' + Math.min(bounds[1], bounds[3]) + 'px;' +
'width:' + Math.abs(bounds[0] - bounds[2]) + 'px; height:' + Math.abs(bounds[1] - bounds[3]) + 'px;');
pageElement.appendChild(el);
});
}
@shessafridi
Copy link

I am getting this weird overflow with this approach any idea why this might be the case?

the pdf viewer I am using is ngx-extended-pdf-viewer

image

@vquilon
Copy link

vquilon commented Nov 27, 2021

This is my updated solution. With this example you can continue and add some buttons, with pagination or zoom scalation. Have FUN!

HTML

<link rel="stylesheet" href="https://mozilla.github.io/pdf.js/web/viewer.css">
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.min.js"></script>

<div id="pdfContainer" class="pdf-content"></div>

CSS

#pdfContainer {
  display: flex;
  justify-content: center;
}

JAVASCRIPT

window.onload = function () {
  function getOutputScale() {
    var pixelRatio = 'devicePixelRatio' in window ? window.devicePixelRatio : 1;
    return {
      sx: pixelRatio,
      sy: pixelRatio,
      scaled: pixelRatio != 1
    };
  }

  // atob() is used to convert base64 encoded PDF to binary-like data.
  var pdfBase64 = atob(
    "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/Z3Gk7/G6V9ibkJ/vwHTv4SDJP83MP0FMxH6e62lf40ehf5O4/R3mk9/h96F/g7+jv4e36NL84eDS/7K9PeYj6N/pfHkj3td8oezS/6419FfNE5/r/cmf8zN0d+hR5f+fzAfR/9S4/QvNT/540xP/6iCBUmbgFXBLv9ZQdPe5zmuny687h02rh/C39+EaZxQpX+/AfDBAUYKZW5kc3RyZWFtCmVuZG9iagoKMTEgMCBvYmoKPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5cGUvQmFzZUZvbnQvQkFBQUFBK1RpbWVzTmV3Um9tYW5QU01UCi9GaXJzdENoYXIgMAovTGFzdENoYXIgNjQKL1dpZHRoc1s3NzcgNjEwIDUwMCAyNzcgMzg5IDI1MCA0NDMgMjc3IDQ0MyA1MDAgNTAwIDQ0MyA1MDAgNzc3IDUwMCAyNTAKNTU2IDMzMyA1MDAgMjc3IDcyMiA1NTYgMzMzIDMzMyAzMzMgNTAwIDcyMiAyNTAgNTAwIDUwMCA2MTAgNTAwCjMzMyAzMzMgNTAwIDUwMCA3MjIgNTU2IDM4OSA5NDMgNTAwIDQwOCA2NjYgNTAwIDUwMCA1MDAgNTAwIDUwMAo3MjIgNDQzIDI3NyA2MTAgMjc3IDcyMiA3MjIgNjY2IDE4MCA3MjIgODg5IDI3NyA1MDAgMzMzIDMzMyA1MDAKNTAwIF0KL0ZvbnREZXNjcmlwdG9yIDkgMCBSCi9Ub1VuaWNvZGUgMTAgMCBSCj4+CmVuZG9iagoKMTIgMCBvYmoKPDwvRjEgMTEgMCBSCj4+CmVuZG9iagoKMTMgMCBvYmoKPDwvRm9udCAxMiAwIFIKL1hPYmplY3Q8PC9UcjQgNCAwIFI+PgovRXh0R1N0YXRlPDwvRUdTNSA1IDAgUj4+Ci9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUMvSW1hZ2VJL0ltYWdlQl0KPj4KZW5kb2JqCgoxIDAgb2JqCjw8L1R5cGUvUGFnZS9QYXJlbnQgNiAwIFIvUmVzb3VyY2VzIDEzIDAgUi9NZWRpYUJveFswIDAgNjEyIDc5Ml0vR3JvdXA8PC9TL1RyYW5zcGFyZW5jeS9DUy9EZXZpY2VSR0IvSSB0cnVlPj4vQ29udGVudHMgMiAwIFI+PgplbmRvYmoKCjYgMCBvYmoKPDwvVHlwZS9QYWdlcwovUmVzb3VyY2VzIDEzIDAgUgovTWVkaWFCb3hbIDAgMCA2MTIgNzkyIF0KL0tpZHNbIDEgMCBSIF0KL0NvdW50IDE+PgplbmRvYmoKCjE0IDAgb2JqCjw8L1R5cGUvQ2F0YWxvZy9QYWdlcyA2IDAgUgovT3BlbkFjdGlvblsxIDAgUiAvWFlaIG51bGwgbnVsbCAwXQovTGFuZyhlbi1VUykKPj4KZW5kb2JqCgoxNSAwIG9iago8PC9BdXRob3I8RkVGRjAwNTYwMDY5MDA3NjAwNjkwMDZFMDAyMDAwNTAwMDYxMDA2QzAwNjkwMDYxMDA3NDAwNjg+Ci9DcmVhdG9yPEZFRkYwMDU3MDA3MjAwNjkwMDc0MDA2NTAwNzI+Ci9Qcm9kdWNlcjxGRUZGMDA0QzAwNjkwMDYyMDA3MjAwNjUwMDRGMDA2NjAwNjYwMDY5MDA2MzAwNjUwMDIwMDAzNDAwMkUwMDMwPgovQ3JlYXRpb25EYXRlKEQ6MjAxMzA2MDYxODMxMzItMDcnMDAnKT4+CmVuZG9iagoKeHJlZgowIDE2CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAzNDA0OSAwMDAwMCBuIAowMDAwMDAwMDE5IDAwMDAwIG4gCjAwMDAwMDI5MzkgMDAwMDAgbiAKMDAwMDAwMjk2MCAwMDAwMCBuIAowMDAwMDAzMTM3IDAwMDAwIG4gCjAwMDAwMzQxOTIgMDAwMDAgbiAKMDAwMDAwMzE3NyAwMDAwMCBuIAowMDAwMDMyNjgyIDAwMDAwIG4gCjAwMDAwMzI3MDQgMDAwMDAgbiAKMDAwMDAzMjkwMyAwMDAwMCBuIAowMDAwMDMzNDcxIDAwMDAwIG4gCjAwMDAwMzM4OTEgMDAwMDAgbiAKMDAwMDAzMzkyNCAwMDAwMCBuIAowMDAwMDM0MjkxIDAwMDAwIG4gCjAwMDAwMzQzODggMDAwMDAgbiAKdHJhaWxlcgo8PC9TaXplIDE2L1Jvb3QgMTQgMCBSCi9JbmZvIDE1IDAgUgovSUQgWyA8QjFEMEZFNDk3OEU0QUFFQUQ5MEM5NkRDRDJFM0U0ODQ+CjxCMUQwRkU0OTc4RTRBQUVBRDkwQzk2RENEMkUzRTQ4ND4gXQovRG9jQ2hlY2tzdW0gLzAyODgzQjZCODM1QzZGMEMwQTVCRTUyNDgzMURFRkQwCj4+CnN0YXJ0eHJlZgozNDYyOQolJUVPRgo="
  );

  window.myState = {
    pdfDoc: null,
    pageNum: 1,
    pageRendering: false,
    pageNumPending: null,
    scale: 0.8,
    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();
          //textLayer.setTextContent(textContent);
          //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);
  
  /**
   * 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();
  });
};

@abhilashsajeev
Copy link

@vquilon @ricardojlrufino Is it possible to download the file with the highlights?

@vquilon
Copy link

vquilon commented Dec 30, 2021

@abhilashsajeev If you want to make annotations in the PDF file you need to modify the binary data of the file. To do that you need another library like https://pdf-lib.js.org/.

@achapman009
Copy link

achapman009 commented Jun 29, 2022

I am getting this weird overflow with this approach any idea why this might be the case?

the pdf viewer I am using is ngx-extended-pdf-viewer

image

@shessafridi I am having this same issue. Did you ever resolve this?

@vquilon
Copy link

vquilon commented Jun 29, 2022

I am getting this weird overflow with this approach any idea why this might be the case?
the pdf viewer I am using is ngx-extended-pdf-viewer
image

@shessafridi I am having this same issue. Did you ever resolve this?

This seems to be a problem in the style of hidden text layer. I mean, maybe you have other CSS that modify the text layers, for example the font-size, I recommend you, to use my solution from zero, no extra CSS or code.

I have a minimal solution in a Codepen. Only highgliht the texts, but in the javascript you can copy the text or other operations.

Minimalistic PDF selector

@nurullah
Copy link

nurullah commented Jul 8, 2022

I am getting this weird overflow with this approach any idea why this might be the case?
the pdf viewer I am using is ngx-extended-pdf-viewer
image

@shessafridi I am having this same issue. Did you ever resolve this?

As far as i remember this problem is caused by the textLayerMode property. You can try this property by giving 2 value.

const pdfViewer = new pdfjsViewer.PDFViewer({
  container,  
  eventBus,  
  linkService,  
  textLayerMode: 2  
})

@falxen
Copy link

falxen commented Jul 16, 2022

@vquilon Thanks for your codepen. https://codepen.io/vquilon/pen/zYdgjVV
Unfortunately, it doesn't seem to highlight anything for me - what paragraph or words is it meant to highlight? I was hoping to start off with your code: I'm trying to highlight a part of the PDF, when given the start index and end index (of how the text appears in the PDF).

@achapman009
Copy link

I am getting this weird overflow with this approach any idea why this might be the case?
the pdf viewer I am using is ngx-extended-pdf-viewer
image

@shessafridi I am having this same issue. Did you ever resolve this?

As far as i remember this problem is caused by the textLayerMode property. You can try this property by giving 2 value.

const pdfViewer = new pdfjsViewer.PDFViewer({
  container,  
  eventBus,  
  linkService,  
  textLayerMode: 2  
})

This is the correct answer. Fixed all issues.

@arty-ms
Copy link

arty-ms commented Nov 2, 2023

This solution is not useful for several reasons:

  1. It is an overlay on the top of the text, so it changes the view(color) of the text.
  2. On the tablets it will work with problems.
  3. The pdf.js TextLayer is rendered with incorrect fonts. That's why your highlight may be in incorrect place.
    The smooth way would be to make highlight using canvas. You need to construct charsMap of all characters rendered on the canvas by pdf.js. Then on mouse move you will need to find the char in charsMap and re-draw text with background on the top of pdf.js canvas. This drawing should be done in separate custom canvas.

@Mowmowj
Copy link

Mowmowj commented Jan 12, 2024

This solution is not useful for several reasons:

  1. It is an overlay on the top of the text, so it changes the view(color) of the text.
  2. On the tablets it will work with problems.
  3. The pdf.js TextLayer is rendered with incorrect fonts. That's why your highlight may be in incorrect place.
    The smooth way would be to make highlight using canvas. You need to construct charsMap of all characters rendered on the canvas by pdf.js. Then on mouse move you will need to find the char in charsMap and re-draw text with background on the top of pdf.js canvas. This drawing should be done in separate custom canvas.

Hi, I am working on this recently, I would like to discuss this with you.
About your problem :
No.1 you could add a svg layer under text layer to use rect to render the highlighted element then the text layer will not be changed.
No.2 curious to know why can't it work on tablet? cuz touch or something? (as i know ios selection have problem.)
No.3 you are right the text layer position is not 100% same with canvas text position. the canvas solution is great as i find the "apryse"(but it not open source and need pay) seems to use this solution. But I am not sure how much work need to do of this by self.

@dieggop
Copy link

dieggop commented Apr 26, 2024

Is possible to get only position of click on document? in points?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment