-
Notifications
You must be signed in to change notification settings - Fork 3
Minimal example that showcases PDF rendering with text selection enabled
This page shows you how to render a PDF with text-selection enabled. To get the minimal example working, I extracted the parts relevant to text-selection from viewer.js. The text-selection code in viewer.js supports operations like text-search and match, but this minimal example does not. The reason is that the text-search and match operations depend on some view-specific components (like the find bar) in viewer.js and will not work in this minimal example. At some point in the future, the text-selection, search, and match operations can be pulled out of viewer.js into their own class. Then all these operations can be abstracted and exposed via an API. This example is also available in the examples directory.
For this example, we are going to be using a sample PDF that is available here However, we will not be loading up this document directly in this example. Instead, we will be starting with the base64 representation of the PDF. Of course, if you have the PDF file at your disposal you can simply do PDFJS.getDocument('mypdf.pdf').then(...)
instead of using the base64-encoded data.
First, let's take a look at the HTML file that we're going to use. It's very simple and looks like this:
<html>
<head>
<title>Minimal pdf.js text-selection demo</title>
<link href="css/minimal.css" rel="stylesheet" media="screen" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script src="js/pdf.js" type="text/javascript"></script>
<script src="js/textlayerbuilder.js" type="text/javascript"></script>
<script src="js/minimal.js" type="text/javascript"></script>
</head>
<body>
This is a minimal pdf.js text-selection demo. The existing minimal-example shows you how to render a
PDF, but not how to enable text-selection. This example shows you how to do both. <br /><br />
<div id="pdfContainer" class = "pdf-content">
</div>
</body>
</html>
There are a few resources that we use. The first is a CSS file called minimal.css
. This contains the minimal CSS styles required to get text-selection to work. Text-selection is accomplished by overlaying div
s over the PDF. These div
s will contain text that matches the PDF text that they are overlaying. minimal.css
looks like this:
body {
font-family: arial, verdana, sans-serif;
}
.pdf-content {
border: 1px solid #000000;
}
/* CSS classes used by TextLayerBuilder to style the text layer divs */
/* This stuff is important! Otherwise when you select the text, the text in the divs will show up! */
::selection { background:rgba(0,0,255,0.3); }
::-moz-selection { background:rgba(0,0,255,0.3); }
.textLayer {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
color: #000;
font-family: sans-serif;
overflow: hidden;
}
.textLayer > div {
color: transparent;
position: absolute;
line-height: 1;
white-space: pre;
cursor: text;
}
.textLayer .highlight {
margin: -1px;
padding: 1px;
background-color: rgba(180, 0, 170, 0.2);
border-radius: 4px;
}
.textLayer .highlight.begin {
border-radius: 4px 0px 0px 4px;
}
.textLayer .highlight.end {
border-radius: 0px 4px 4px 0px;
}
.textLayer .highlight.middle {
border-radius: 0px;
}
.textLayer .highlight.selected {
background-color: rgba(0, 100, 0, 0.2);
}
The next resources that we have is pdf.js
itself. After that we have textlayerbuilder.js
. This file contains a stripped-down version of the TextLayerBuilder
object from viewer.js
, along with an additional convenience object (CustomStyle
) and a convenience method (getOutputScale()
). The former is for setting CSS styles easily (similar to .css()
in jQuery), and the latter is to get the output scale if we are on HiDPI displays. You don't need to worry too much about these; they are just things that TextLayerBuilder
needs:
/**
* Code extracted from pdf.js' viewer.js file. This contains code that is relevant to building the text overlays. I
* have removed dependencies on viewer.js and viewer.html.
*
* -- Vivin Suresh Paliath (http://vivin.net)
*/
var CustomStyle = (function CustomStyleClosure() {
// As noted on: http://www.zachstronaut.com/posts/2009/02/17/
// animate-css-transforms-firefox-webkit.html
// in some versions of IE9 it is critical that ms appear in this list
// before Moz
var prefixes = ['ms', 'Moz', 'Webkit', 'O'];
var _cache = { };
function CustomStyle() {
}
CustomStyle.getProp = function get(propName, element) {
// check cache only when no element is given
if (arguments.length == 1 && typeof _cache[propName] == 'string') {
return _cache[propName];
}
element = element || document.documentElement;
var style = element.style, prefixed, uPropName;
// test standard property first
if (typeof style[propName] == 'string') {
return (_cache[propName] = propName);
}
// capitalize
uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);
// test vendor specific properties
for (var i = 0, l = prefixes.length; i < l; i++) {
prefixed = prefixes[i] + uPropName;
if (typeof style[prefixed] == 'string') {
return (_cache[propName] = prefixed);
}
}
//if all fails then set to undefined
return (_cache[propName] = 'undefined');
};
CustomStyle.setProp = function set(propName, element, str) {
var prop = this.getProp(propName);
if (prop != 'undefined')
element.style[prop] = str;
};
return CustomStyle;
})();
var TextLayerBuilder = function textLayerBuilder(textLayerDiv, pageIdx) {
var textLayerFrag = document.createDocumentFragment();
this.textLayerDiv = textLayerDiv;
this.layoutDone = false;
this.divContentDone = false;
this.pageIdx = pageIdx;
this.matches = [];
this.beginLayout = function textLayerBuilderBeginLayout() {
this.textDivs = [];
this.renderingDone = false;
};
this.endLayout = function textLayerBuilderEndLayout() {
this.layoutDone = true;
this.insertDivContent();
};
this.renderLayer = function textLayerBuilderRenderLayer() {
var textDivs = this.textDivs;
var bidiTexts = this.textContent.bidiTexts;
var textLayerDiv = this.textLayerDiv;
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
// No point in rendering so many divs as it'd make the browser unusable
// even after the divs are rendered
var MAX_TEXT_DIVS_TO_RENDER = 100000;
if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER)
return;
for (var i = 0, ii = textDivs.length; i < ii; i++) {
var textDiv = textDivs[i];
if ('isWhitespace' in textDiv.dataset) {
continue;
}
textLayerFrag.appendChild(textDiv);
ctx.font = textDiv.style.fontSize + ' ' + textDiv.style.fontFamily;
var width = ctx.measureText(textDiv.textContent).width;
if (width > 0) {
var textScale = textDiv.dataset.canvasWidth / width;
var transform = 'scale(' + textScale + ', 1)';
if (bidiTexts[i].dir === 'ttb') {
transform = 'rotate(90deg) ' + transform;
}
CustomStyle.setProp('transform', textDiv, transform);
CustomStyle.setProp('transformOrigin', textDiv, '0% 0%');
textLayerDiv.appendChild(textDiv);
}
}
this.renderingDone = true;
textLayerDiv.appendChild(textLayerFrag);
};
this.setupRenderLayoutTimer = function textLayerSetupRenderLayoutTimer() {
// Schedule renderLayout() if user has been scrolling, otherwise
// run it right away
var RENDER_DELAY = 200; // in ms
var self = this;
//0 was originally PDFView.lastScroll
if (Date.now() - 0 > RENDER_DELAY) {
// Render right away
this.renderLayer();
} else {
// Schedule
if (this.renderTimer)
clearTimeout(this.renderTimer);
this.renderTimer = setTimeout(function () {
self.setupRenderLayoutTimer();
}, RENDER_DELAY);
}
};
this.appendText = function textLayerBuilderAppendText(geom) {
var textDiv = document.createElement('div');
// vScale and hScale already contain the scaling to pixel units
var fontHeight = geom.fontSize * Math.abs(geom.vScale);
textDiv.dataset.canvasWidth = geom.canvasWidth * geom.hScale;
textDiv.dataset.fontName = geom.fontName;
textDiv.style.fontSize = fontHeight + 'px';
textDiv.style.fontFamily = geom.fontFamily;
textDiv.style.left = geom.x + 'px';
textDiv.style.top = (geom.y - fontHeight) + 'px';
// The content of the div is set in the `setTextContent` function.
this.textDivs.push(textDiv);
};
this.insertDivContent = function textLayerUpdateTextContent() {
// Only set the content of the divs once layout has finished, the content
// for the divs is available and content is not yet set on the divs.
if (!this.layoutDone || this.divContentDone || !this.textContent)
return;
this.divContentDone = true;
var textDivs = this.textDivs;
var bidiTexts = this.textContent.bidiTexts;
for (var i = 0; i < bidiTexts.length; i++) {
var bidiText = bidiTexts[i];
var textDiv = textDivs[i];
if (!/\S/.test(bidiText.str)) {
textDiv.dataset.isWhitespace = true;
continue;
}
textDiv.textContent = bidiText.str;
// bidiText.dir may be 'ttb' for vertical texts.
textDiv.dir = bidiText.dir === 'rtl' ? 'rtl' : 'ltr';
}
this.setupRenderLayoutTimer();
};
this.setTextContent = function textLayerBuilderSetTextContent(textContent) {
this.textContent = textContent;
this.insertDivContent();
};
};
/**
* Returns scale factor for the canvas. It makes sense for the HiDPI displays.
* @return {Object} The object with horizontal (sx) and vertical (sy)
scales. The scaled property is set to false if scaling is
not required, true otherwise.
*/
function getOutputScale() {
var pixelRatio = 'devicePixelRatio' in window ? window.devicePixelRatio : 1;
return {
sx: pixelRatio,
sy: pixelRatio,
scaled: pixelRatio != 1
};
}
Finally we have minimal.js
, which contains all the logic required to actually load, render, and enable text-selection on the PDF. The code is well-commented, so you should be able to easily see what is going on:
//For demonstration purposes, the PDF data is not going to be obtained from an outside source. I will be
//storing it in a variable. Mozilla's viewer does support PDF uploads but I haven't really gone through
//that code. There are other ways to upload PDF data. For instance, I have a Spring app that accepts a
//PDF for upload and then communicates the binary data back to the page as base64. I then convert this
//into a Uint8Array manually. I will be demonstrating the same technique here. What matters most here is
//how we render the PDF with text-selection enabled. The source of the PDF is not important; just assume
//that we have the data as base64.
//
//The problem with understanding text selection was that the text selection code has heavily intertwined
//with viewer.html and viewer.js. I have extracted the parts I need out of viewer.js into a separate file
//which contains the bare minimum required to implement text selection. The key component is TextLayerBuilder,
//which is the object that handles the creation of text-selection divs. I have added this code as an external
//resource.
//
//This demo uses a PDF that only has one page. You can render other pages if you wish, but the focus here is
//just to show you how you can render a PDF with text selection. Hence the code only loads up one page.
//
//The CSS used here is also very important since it sets up the CSS for the text layer divs overlays that
//you actually end up selecting.
//
//For reference, the actual PDF document that is rendered is available at:
//http://vivin.net/pub/pdfjs/TestDocument.pdf
window.onload = function () {
//Base64 that represents the PDF
var pdfBase64 = "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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=";
var scale = 1.5; //Set this to whatever you want. This is basically the "zoom" factor for the PDF.
/**
* Converts a base64 string into a Uint8Array
*/
function base64ToUint8Array(base64) {
var raw = atob(base64); //This is a native function that decodes a base64-encoded string.
var uint8Array = new Uint8Array(new ArrayBuffer(raw.length));
for (var i = 0; i < raw.length; i++) {
uint8Array[i] = raw.charCodeAt(i);
}
return uint8Array;
}
function loadPdf(pdfData) {
PDFJS.disableWorker = true; //Not using web workers. Not disabling results in an error. This line is
//missing in the example code for rendering a pdf.
var pdf = PDFJS.getDocument(pdfData);
pdf.then(renderPdf);
}
function renderPdf(pdf) {
pdf.getPage(1).then(renderPage);
}
function renderPage(page) {
var viewport = page.getViewport(scale);
var $canvas = jQuery("<canvas></canvas>");
//Set the canvas height and width to the height and width of the viewport
var canvas = $canvas.get(0);
var context = canvas.getContext("2d");
canvas.height = viewport.height;
canvas.width = viewport.width;
//Append the canvas to the pdf container div
var $pdfContainer = jQuery("#pdfContainer");
$pdfContainer.css("height", canvas.height + "px").css("width", canvas.width + "px");
$pdfContainer.append($canvas);
//The following few lines of code set up scaling on the context if we are on a HiDPI display
var outputScale = getOutputScale();
if (outputScale.scaled) {
var cssScale = 'scale(' + (1 / outputScale.sx) + ', ' +
(1 / outputScale.sy) + ')';
CustomStyle.setProp('transform', canvas, cssScale);
CustomStyle.setProp('transformOrigin', canvas, '0% 0%');
if ($textLayerDiv.get(0)) {
CustomStyle.setProp('transform', $textLayerDiv.get(0), cssScale);
CustomStyle.setProp('transformOrigin', $textLayerDiv.get(0), '0% 0%');
}
}
context._scaleX = outputScale.sx;
context._scaleY = outputScale.sy;
if (outputScale.scaled) {
context.scale(outputScale.sx, outputScale.sy);
}
var canvasOffset = $canvas.offset();
var $textLayerDiv = jQuery("<div />")
.addClass("textLayer")
.css("height", viewport.height + "px")
.css("width", viewport.width + "px")
.offset({
top: canvasOffset.top,
left: canvasOffset.left
});
//Append the text-layer div to the DOM as a child of the PDF container div.
$pdfContainer.append($textLayerDiv);
page.getTextContent().then(function (textContent) {
var textLayer = new TextLayerBuilder({ textLayerDiv: $textLayerDiv.get(0) });
textLayer.setTextContent(textContent);
var renderContext = {
canvasContext: context,
viewport: viewport,
textLayer: textLayer
};
page.render(renderContext);
});
}
var pdfData = base64ToUint8Array(pdfBase64);
loadPdf(pdfData);
};