diff --git a/Minimal-example-that-showcases-PDF-rendering-with-text-selection-enabled.md b/Minimal-example-that-showcases-PDF-rendering-with-text-selection-enabled.md new file mode 100644 index 0000000..4fa0842 --- /dev/null +++ b/Minimal-example-that-showcases-PDF-rendering-with-text-selection-enabled.md @@ -0,0 +1,418 @@ +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](http://vivin.net/pub/pdfjs/TestDocument.pdf) 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. + +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 + + + Minimal pdf.js text-selection demo + + + + + + + + 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.

+
+
+ + +``` + +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: + +```css +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: + +```javascript +/** + * 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: + +```javascript +//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(""); + + //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("
") + .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.get(0), 0); //The second zero is an index identifying + //the page. It is set to page.number - 1. + textLayer.setTextContent(textContent); + + var renderContext = { + canvasContext: context, + viewport: viewport, + textLayer: textLayer + }; + + page.render(renderContext); + }); + } + + var pdfData = base64ToUint8Array(pdfBase64); + loadPdf(pdfData); +}; +``` \ No newline at end of file