How to create a JavaScript PDF viewer

How to create a JavaScript PDF viewer


 element.

1

id="canvas_container">

2
     id="pdf_renderer">
3

To keep things simple, we’ll be rendering only one page inside the canvas at any given time. We will, however, allow users to switch to the previous page or the next page by pressing a button. Additionally, to display the current page number, and to allow users to jump to any page they desire, our interface will have an input field.

To support zoom operations, add two more buttons to the interface: one to zoom in and one to zoom out.

1

id="zoom_controls">

2
    
3
    
4

At the end of this section, the web page code looks like this.

1
 
2
 lang="en">
3

4
   charset="utf-8">
5
   name="viewport" content="width=device-width, initial-scale=1">
6
  </span>My PDF Viewer<span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-7" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>7</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-8" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>8</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-9" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>9</pre></td><td class="rouge-code"><pre>     <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"my_pdf_viewer"</span><span style="color: #f4bf75">></span>
</p></span></pre></td></tr><tr id="line-10" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>10</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"canvas_container"</span><span style="color: #f4bf75">></span>
</p></span></pre></td></tr><tr id="line-11" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>11</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><canvas> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"pdf_renderer"</span><span style="color: #f4bf75">></span></canvas></span>
</pre></td></tr><tr id="line-12" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>12</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-13" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>13</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-14" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>14</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"navigation_controls"</span><span style="color: #f4bf75">></span>
</p></span></pre></td></tr><tr id="line-15" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>15</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"go_previous"</span><span style="color: #f4bf75">></span>Previous<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-16" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>16</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><input/> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"current_page"</span> <span style="color: #6a9fb5">value=</span><span style="color: #90a959">"1"</span> <span style="color: #6a9fb5">type=</span><span style="color: #90a959">"number"</span><span style="color: #f4bf75">/></span>
</span></pre></td></tr><tr id="line-17" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>17</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"go_next"</span><span style="color: #f4bf75">></span>Next<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-18" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>18</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-19" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>19</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-20" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>20</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"zoom_controls"</span><span style="color: #f4bf75">></span>  
</p></span></pre></td></tr><tr id="line-21" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>21</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"zoom_in"</span><span style="color: #f4bf75">></span>+<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-22" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>22</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"zoom_out"</span><span style="color: #f4bf75">></span>-<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-23" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>23</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-24" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>24</pre></td><td class="rouge-code"><pre>    <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-25" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>25</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-26" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>26</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"/>
</pre></td></tr></tbody></table></div><h2>
<span class="sectionnum">2.</span> Getting PDF.js</h2><p>Now that a bare-bones user interface for our JavaScript PDF viewer is ready, let’s add PDF.js to our web page. Because the latest version of the library is available on <a href="https://cdnjs.com/libraries/pdf.js" target="_blank" rel="external noopener">CDNJS</a>, we can do so by simply adding the following lines towards the end of the web page.</p><div class="rouge-syntax-highlight"><table class="rouge-line-table html"><tbody><tr id="line-1" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>1</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"><script type="litespeed/javascript">]]></script></span></pre></td></tr><tr id="line-2" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>2</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75">    </span><span style="color: #6a9fb5">src=</span><span style="color: #90a959">"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.0.943/pdf.min.js"</span><span style="color: #f4bf75">></span>
</pre></td></tr><tr id="line-3" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>3</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"/>
</pre></td></tr></tbody></table></div><p>If you prefer to use a local copy of the library, you can download it from the <a href="https://github.com/mozilla/pdfjs-dist" target="_blank" rel="external noopener">pdfjs-dist</a> repository.</p><h2>
<span class="sectionnum">3.</span> Loading a PDF File</h2><p>Before we start loading a PDF file, let’s create a simple JavaScript object to store the state of our PDF viewer in JS. Inside it, we’ll have three items: a reference to the PDF file itself, the current page index, and the current zoom level.</p><div class="rouge-syntax-highlight"><table class="rouge-line-table html"><tbody><tr id="line-1" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>1</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"><script/></span>
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">myState</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #6a9fb5">pdf</span><span style="color: #d0d0d0">:</span> <span style="color: #d28445">null</span><span style="color: #d0d0d0">,</span>
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #6a9fb5">currentPage</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">1</span><span style="color: #d0d0d0">,</span>
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #6a9fb5">zoom</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">1</span>
</pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>    <span style="color: #d0d0d0">}</span>
</pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-8" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>8</pre>
</td>
<td class="rouge-code">
<pre>    <span style="color: #949494">// more code here
</span>
</pre>
</td>
</tr>
<tr id="line-9" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>9</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
</tbody>
</table>
</div>
At this point, we can load our PDF file by calling the <code class="inline">getDocument()</code> method of the <code class="inline">pdfjsLib</code> object, which runs asynchronously.
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>pdfjsLib.getDocument('./my_document.pdf').then((pdf) => {
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>    // more code here
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>});
</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="callout-block">
<span class="callout-icon callout-info"/>
Note that the <code class="inline">getDocument()</code> method internally uses an <code class="inline">XMLHttpRequest</code> object to load the PDF file. This means that the file must be present either on your own web server or on a server that allows cross-origin requests.
</div>
If you don’t have a PDF file handy, you can get the one I’m using from <a href="https://en.wikipedia.org/w/index.php?title=Special:ElectronPdf&page=New+Horizons&action=show-download-screen" target="_blank" rel="external noopener">Wikipedia</a>.
Once the PDF file has been loaded successfully, we can update the <code class="inline">pdf</code> property of our state object.
Lastly, add a call to a function named <code class="inline">render()</code> so that our PDF viewer in JS automatically renders the first page of the PDF file. We’ll define the function in the next step.
<h2>
<span class="sectionnum">4.</span> Rendering a Page</h2>
By calling the <code class="inline">getPage()</code> method of the <code class="inline">pdf</code> object and passing a page number to it, we can get a reference to any page in the PDF file. For now, let’s pass the <code class="inline">currentPage</code> property of our state object to it. This method too returns a promise, so we’ll need a callback function to handle its result.
Accordingly, create a new function called <code class="inline">render()</code> containing the following code:
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>function render() {
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    myState.pdf.getPage(myState.currentPage).then((page) => {
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>        // more code here
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>    });
</pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre>}
</pre>
</td>
</tr>
</tbody>
</table>
</div>
To actually render a page, we must call the <code class="inline">render()</code> method of the <code class="inline">page</code> object available inside the callback. As arguments, the method expects the 2D context of our canvas and a <code class="inline">PageViewport</code> object, which we can get by calling the <code class="inline">getViewport()</code> method. Because the <code class="inline">getViewport()</code> method expects the desired zoom level as an argument, we must pass the <code class="inline">zoom</code> property of our state object to it.
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>var canvas = document.getElementById("pdf_renderer");
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>var ctx = canvas.getContext('2d');
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>var viewport = page.getViewport(myState.zoom);
</pre>
</td>
</tr>
</tbody>
</table>
</div>
The dimensions of the viewport depend on the original size of the page and the zoom level. In order to make sure that the entire viewport is rendered on our canvas, we must now change the size of our canvas to match that of the viewport. Here’s how:
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>canvas.width = viewport.width;
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>canvas.height = viewport.height;
</pre>
</td>
</tr>
</tbody>
</table>
</div>
At this point, we can go ahead and render the page.
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>page.render({
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    canvasContext: ctx,
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>    viewport: viewport
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>});
</pre>
</td>
</tr>
</tbody>
</table>
</div>
Putting it all together, the whole source code looks like this.
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"> <span style="color: #6a9fb5">lang=</span><span style="color: #90a959">"en"</span><span style="color: #f4bf75">></span>
</span></pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>  <span style="color: #f4bf75"><meta/> <span style="color: #6a9fb5">charset=</span><span style="color: #90a959">"utf-8"</span><span style="color: #f4bf75">></span>
</span></pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>  <span style="color: #f4bf75"><meta/> <span style="color: #6a9fb5">name=</span><span style="color: #90a959">"viewport"</span> <span style="color: #6a9fb5">content=</span><span style="color: #90a959">"width=device-width, initial-scale=1"</span><span style="color: #f4bf75">></span>
</span></pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre>  <span style="color: #f4bf75"><title/></span>My PDF Viewer<span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-8" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>8</pre>
</td>
<td class="rouge-code">
<pre>  <span style="color: #f4bf75"><script type="litespeed/javascript">]]></script></span></pre></td></tr><tr id="line-9" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>9</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75">    </span><span style="color: #6a9fb5">src=</span><span style="color: #90a959">"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.0.943/pdf.min.js"</span><span style="color: #f4bf75">></span>
</pre></td></tr><tr id="line-10" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>10</pre></td><td class="rouge-code"><pre>  <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-11" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>11</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-12" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>12</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-13" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>13</pre></td><td class="rouge-code"><pre>     <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"my_pdf_viewer"</span><span style="color: #f4bf75">></span>
</p></span></pre></td></tr><tr id="line-14" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>14</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"canvas_container"</span><span style="color: #f4bf75">></span>
</p></span></pre></td></tr><tr id="line-15" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>15</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><canvas> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"pdf_renderer"</span><span style="color: #f4bf75">></span></canvas></span>
</pre></td></tr><tr id="line-16" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>16</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-17" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>17</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-18" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>18</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"navigation_controls"</span><span style="color: #f4bf75">></span>
</p></span></pre></td></tr><tr id="line-19" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>19</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"go_previous"</span><span style="color: #f4bf75">></span>Previous<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-20" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>20</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><input/> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"current_page"</span> <span style="color: #6a9fb5">value=</span><span style="color: #90a959">"1"</span> <span style="color: #6a9fb5">type=</span><span style="color: #90a959">"number"</span><span style="color: #f4bf75">/></span>
</span></pre></td></tr><tr id="line-21" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>21</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"go_next"</span><span style="color: #f4bf75">></span>Next<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-22" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>22</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-23" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>23</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-24" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>24</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"zoom_controls"</span><span style="color: #f4bf75">></span>  
</p></span></pre></td></tr><tr id="line-25" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>25</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"zoom_in"</span><span style="color: #f4bf75">></span>+<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-26" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>26</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"zoom_out"</span><span style="color: #f4bf75">></span>-<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-27" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>27</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-28" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>28</pre></td><td class="rouge-code"><pre>    <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-29" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>29</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-30" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>30</pre></td><td class="rouge-code"><pre>    <span style="color: #f4bf75"><script/></span>
</pre>
</td>
</tr>
<tr id="line-31" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>31</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">myState</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-32" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>32</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #6a9fb5">pdf</span><span style="color: #d0d0d0">:</span> <span style="color: #d28445">null</span><span style="color: #d0d0d0">,</span>
</pre>
</td>
</tr>
<tr id="line-33" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>33</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #6a9fb5">currentPage</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">1</span><span style="color: #d0d0d0">,</span>
</pre>
</td>
</tr>
<tr id="line-34" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>34</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #6a9fb5">zoom</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">1</span>
</pre>
</td>
</tr>
<tr id="line-35" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>35</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">}</span>
</pre>
</td>
</tr>
<tr id="line-36" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>36</pre>
</td>
<td class="rouge-code">
<pre>     
</pre>
</td>
</tr>
<tr id="line-37" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>37</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">pdfjsLib</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getDocument</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">./my_document.pdf</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">then</span><span style="color: #d0d0d0">((</span><span style="color: #d0d0d0;background-color: #151515">pdf</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">=></span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-38" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>38</pre>
</td>
<td class="rouge-code">
<pre>     
</pre>
</td>
</tr>
<tr id="line-39" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>39</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">pdf</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-40" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>40</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">();</span>
</pre>
</td>
</tr>
<tr id="line-41" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>41</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-42" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>42</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-43" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>43</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-44" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>44</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d28445">function</span> <span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">()</span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-45" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>45</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getPage</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">currentPage</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">then</span><span style="color: #d0d0d0">((</span><span style="color: #d0d0d0;background-color: #151515">page</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">=></span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-46" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>46</pre>
</td>
<td class="rouge-code">
<pre>         
</pre>
</td>
</tr>
<tr id="line-47" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>47</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">canvas</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">"</span><span style="color: #90a959">pdf_renderer</span><span style="color: #90a959">"</span><span style="color: #d0d0d0">);</span>
</pre>
</td>
</tr>
<tr id="line-48" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>48</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">ctx</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">canvas</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getContext</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">2d</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">);</span>
</pre>
</td>
</tr>
<tr id="line-49" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>49</pre>
</td>
<td class="rouge-code">
<pre>     
</pre>
</td>
</tr>
<tr id="line-50" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>50</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">viewport</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">page</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getViewport</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">zoom</span><span style="color: #d0d0d0">);</span>
</pre>
</td>
</tr>
<tr id="line-51" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>51</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-52" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>52</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0;background-color: #151515">canvas</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">width</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">viewport</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">width</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-53" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>53</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0;background-color: #151515">canvas</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">height</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">viewport</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">height</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-54" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>54</pre>
</td>
<td class="rouge-code">
<pre>         
</pre>
</td>
</tr>
<tr id="line-55" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>55</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0;background-color: #151515">page</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">({</span>
</pre>
</td>
</tr>
<tr id="line-56" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>56</pre>
</td>
<td class="rouge-code">
<pre>                    <span style="color: #6a9fb5">canvasContext</span><span style="color: #d0d0d0">:</span> <span style="color: #d0d0d0;background-color: #151515">ctx</span><span style="color: #d0d0d0">,</span>
</pre>
</td>
</tr>
<tr id="line-57" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>57</pre>
</td>
<td class="rouge-code">
<pre>                    <span style="color: #6a9fb5">viewport</span><span style="color: #d0d0d0">:</span> <span style="color: #d0d0d0;background-color: #151515">viewport</span>
</pre>
</td>
</tr>
<tr id="line-58" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>58</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-59" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>59</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-60" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>60</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">}</span>
</pre>
</td>
</tr>
<tr id="line-61" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>61</pre>
</td>
<td class="rouge-code">
<pre>    <span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-62" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>62</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-63" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>63</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
</tbody>
</table>
</div>
If you try opening the web page in a browser, you should now be able to see the first page of your PDF file.
<figure class="post_image"><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=850/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-first-page-demo.png" alt="Demo" loading="lazy" width="870px" height="554px" class="resized-image resized-image-desktop" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=1700/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-first-page-demo.png 2x"/><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=630/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-first-page-demo.png" alt="Demo" loading="lazy" width="650px" height="416px" class="resized-image resized-image-tablet" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=1260/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-first-page-demo.png 2x"/><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=360/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-first-page-demo.png" alt="Demo" loading="lazy" width="380px" height="246px" class="resized-image resized-image-mobile" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=720/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-first-page-demo.png 2x"/></figure>
You may have noticed that the size of our PDF viewer currently depends on the size of the page being rendered and the zoom level. This is not ideal because we don’t want the layout of our web page to be affected while users interact with the PDF viewer in JavaScript. 
To fix this, all we need to do is give a fixed width and height to the <code class="inline">
<div> element encapsulating our canvas and set its <code class="inline">overflow</code> CSS property to <code class="inline">auto</code>. This property, when necessary, adds scroll bars to the <code class="inline">
<div> element, allowing users to scroll both horizontally and vertically.
Add the following code inside the <code class="inline"/> tag of the web page:
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"><style/></span>
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    <span style="color: #d0d0d0;background-color: #151515">#canvas_container</span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">width</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">800px</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">height</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">450px</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">overflow</span><span style="color: #d0d0d0">:</span> <span style="color: #d0d0d0;background-color: #151515">auto</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>    <span style="color: #d0d0d0">}</span>
</pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
</tbody>
</table>
</div>
You are, of course, free to change the width and height or even use media queries to make the <code class="inline">
<div> element match your requirements.
Optionally, you can include the following CSS rules to make the <code class="inline">
<div> element seem more distinct:
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>#canvas_container {
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    background: #333;
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>    text-align: center;
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>    border: solid 3px;
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>}
</pre>
</td>
</tr>
</tbody>
</table>
</div>
If you refresh the web page now, you should see something like this on your screen:
<figure class="post_image"><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=850/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-first-page-with-background.png" alt="Demo With Background" loading="lazy" width="870px" height="554px" class="resized-image resized-image-desktop" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=1700/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-first-page-with-background.png 2x"/><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=630/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-first-page-with-background.png" alt="Demo With Background" loading="lazy" width="650px" height="416px" class="resized-image resized-image-tablet" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=1260/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-first-page-with-background.png 2x"/><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=360/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-first-page-with-background.png" alt="Demo With Background" loading="lazy" width="380px" height="246px" class="resized-image resized-image-mobile" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=720/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-first-page-with-background.png 2x"/></figure>
<h2>
<span class="sectionnum">5.</span> Changing the Current Page</h2>
Our JavaScript PDF viewer is currently capable of showing only the first page of any PDF file given to it. To allow users to change the page being rendered, we must now add click event listeners to the <code class="inline">go_previous</code> and <code class="inline">go_next</code> buttons we created earlier.
Inside the event listener of the <code class="inline">go_previous</code> button, we must decrement the <code class="inline">currentPage</code> property of our state object, making sure that it doesn't fall below <code class="inline">1</code>. After we do so, we can simply call the <code class="inline">render()</code> function again to render the new page.
Additionally, we must update the value of the <code class="inline">current_page</code> text field so that it displays the new page number. The following code shows you how:
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>document.getElementById('go_previous')
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    .addEventListener('click', (e) => {
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>    if(myState.pdf == null|| myState.currentPage == 1) 
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>    return;
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>       
</pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>    myState.currentPage -= 1;
</pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre>    document.getElementById("current_page").value = myState.currentPage;
</pre>
</td>
</tr>
<tr id="line-8" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>8</pre>
</td>
<td class="rouge-code">
<pre>    render();
</pre>
</td>
</tr>
<tr id="line-9" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>9</pre>
</td>
<td class="rouge-code">
<pre>});
</pre>
</td>
</tr>
</tbody>
</table>
</div>
Similarly, inside the event listener of the <code class="inline">go_next</code> button, we must increment the <code class="inline">currentPage</code> property, while ensuring that it doesn’t exceed the number of pages present in the PDF file, which we can determine using the <code class="inline">numPages</code> property of the <code class="inline">_pdfInfo</code> object.
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>document.getElementById('go_next')
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    .addEventListener('click', (e) => {
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>    if(myState.pdf == null || myState.currentPage > myState.pdf._pdfInfo.numPages) 
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>    return;
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>         
</pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>    myState.currentPage += 1;
</pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre>    document.getElementById("current_page").value = myState.currentPage;
</pre>
</td>
</tr>
<tr id="line-8" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>8</pre>
</td>
<td class="rouge-code">
<pre>    render();
</pre>
</td>
</tr>
<tr id="line-9" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>9</pre>
</td>
<td class="rouge-code">
<pre>});
</pre>
</td>
</tr>
</tbody>
</table>
</div>
Lastly, we must add a key press event listener to the <code class="inline">current_page</code> text field so that users can directly jump to any page they desire by simply typing in a page number and hitting the <strong>Enter</strong> key. Inside the event listener, we need to make sure that the number the user has entered is both greater than zero and less than or equal to the <code class="inline">numPages</code> property.
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>document.getElementById('current_page')
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    .addEventListener('keypress', (e) => {
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>    if(myState.pdf == null) return;
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>    // Get key code
</pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>    var code = (e.keyCode ? e.keyCode : e.which);
</pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-8" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>8</pre>
</td>
<td class="rouge-code">
<pre>    // If key code matches that of the Enter key
</pre>
</td>
</tr>
<tr id="line-9" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>9</pre>
</td>
<td class="rouge-code">
<pre>    if(code == 13) {
</pre>
</td>
</tr>
<tr id="line-10" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>10</pre>
</td>
<td class="rouge-code">
<pre>        var desiredPage = document.getElementById('current_page').valueAsNumber;
</pre>
</td>
</tr>
<tr id="line-11" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>11</pre>
</td>
<td class="rouge-code">
<pre>                         
</pre>
</td>
</tr>
<tr id="line-12" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>12</pre>
</td>
<td class="rouge-code">
<pre>        if(desiredPage >= 1 <span style="color: #151515;background-color: #ac4142">&&</span> desiredPage <span style="color: #f4bf75"><</span><span style="color: #151515;background-color: #ac4142">=</span> <span style="color: #6a9fb5">myState.pdf._pdfInfo.numPages</span><span style="color: #151515;background-color: #ac4142">)</span> <span style="color: #151515;background-color: #ac4142">{</span>
</pre>
</td>
</tr>
<tr id="line-13" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>13</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #6a9fb5">myState.currentPage = </span><span style="color: #90a959">desiredPage;</span>
</pre>
</td>
</tr>
<tr id="line-14" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>14</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #6a9fb5">document.getElementById</span><span style="color: #151515;background-color: #ac4142">("</span><span style="color: #6a9fb5">current_page</span><span style="color: #151515;background-color: #ac4142">"</span><span style="color: #6a9fb5">).value = </span><span style="color: #90a959">desiredPage;</span>
</pre>
</td>
</tr>
<tr id="line-15" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>15</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #6a9fb5">render</span><span style="color: #151515;background-color: #ac4142">();</span>
</pre>
</td>
</tr>
<tr id="line-16" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>16</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #151515;background-color: #ac4142">}</span>
</pre>
</td>
</tr>
<tr id="line-17" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>17</pre>
</td>
<td class="rouge-code">
<pre>    <span style="color: #151515;background-color: #ac4142">}</span>
</pre>
</td>
</tr>
<tr id="line-18" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>18</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #151515;background-color: #ac4142">});</span>
</pre>
</td>
</tr>
</tbody>
</table>
</div>
Our PDF viewer in JavaScript can now display any page of the PDF file.
<figure class="post_image"><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=850/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-controls.png" alt="Page Controls" loading="lazy" width="870px" height="554px" class="resized-image resized-image-desktop" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=1700/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-controls.png 2x"/><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=630/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-controls.png" alt="Page Controls" loading="lazy" width="650px" height="416px" class="resized-image resized-image-tablet" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=1260/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-controls.png 2x"/><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=360/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-controls.png" alt="Page Controls" loading="lazy" width="380px" height="246px" class="resized-image resized-image-mobile" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=720/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-page-controls.png 2x"/></figure>
<h2>
<span class="sectionnum">6.</span> Changing the Zoom Level</h2>
Because our <code class="inline">render()</code> function already uses the <code class="inline">zoom</code> property of the state object while rendering a page, adjusting the zoom level is as easy as incrementing or decrementing the property and calling the function.
Inside the on-click event listener of the <code class="inline">zoom_in</code> button, let’s increment the <code class="inline">zoom</code> property by <code class="inline">0.5</code>.
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>document.getElementById('zoom_in')
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    .addEventListener('click', (e) => {
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>    if(myState.pdf == null) return;
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>    myState.zoom += 0.5;
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>    render();
</pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre>});
</pre>
</td>
</tr>
</tbody>
</table>
</div>
And inside the on-click event listener of the <code class="inline">zoom_out</code> button, let’s decrement the <code class="inline">zoom</code> property by <code class="inline">0.5</code>.
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre>document.getElementById('zoom_out')
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre>    .addEventListener('click', (e) => {
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre>    if(myState.pdf == null) return;
</pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre>    myState.zoom -= 0.5;
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>    
</pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>    render();
</pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre>});
</pre>
</td>
</tr>
</tbody>
</table>
</div>
You are free to add upper and lower bounds to the <code class="inline">zoom</code> property, but they are not required.
This is what it looks like when it’s all put together.
<div class="rouge-syntax-highlight">
<table class="rouge-line-table html">
<tbody>
<tr id="line-1" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>1</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-2" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>2</pre>
</td>
<td class="rouge-code">
<pre> 
</pre>
</td>
</tr>
<tr id="line-3" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>3</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"> <span style="color: #6a9fb5">lang=</span><span style="color: #90a959">"en"</span><span style="color: #f4bf75">></span>
</span></pre>
</td>
</tr>
<tr id="line-4" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>4</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-5" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>5</pre>
</td>
<td class="rouge-code">
<pre>  <span style="color: #f4bf75"><meta/> <span style="color: #6a9fb5">charset=</span><span style="color: #90a959">"utf-8"</span><span style="color: #f4bf75">></span>
</span></pre>
</td>
</tr>
<tr id="line-6" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>6</pre>
</td>
<td class="rouge-code">
<pre>  <span style="color: #f4bf75"><meta/> <span style="color: #6a9fb5">name=</span><span style="color: #90a959">"viewport"</span> <span style="color: #6a9fb5">content=</span><span style="color: #90a959">"width=device-width, initial-scale=1"</span><span style="color: #f4bf75">></span>
</span></pre>
</td>
</tr>
<tr id="line-7" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>7</pre>
</td>
<td class="rouge-code">
<pre>  <span style="color: #f4bf75"><title/></span>My PDF Viewer<span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-8" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>8</pre>
</td>
<td class="rouge-code">
<pre>  <span style="color: #f4bf75"><script type="litespeed/javascript">]]></script></span></pre></td></tr><tr id="line-9" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>9</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75">    </span><span style="color: #6a9fb5">src=</span><span style="color: #90a959">"http://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.0.943/pdf.min.js"</span><span style="color: #f4bf75">></span>
</pre></td></tr><tr id="line-10" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>10</pre></td><td class="rouge-code"><pre>  <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-11" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>11</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-12" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>12</pre></td><td class="rouge-code"><pre>  <span style="color: #f4bf75"><style/></span>
</pre></td></tr><tr id="line-13" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>13</pre></td><td class="rouge-code"><pre>      <span style="color: #d0d0d0;background-color: #151515">#canvas_container</span> <span style="color: #d0d0d0">{</span>
</pre></td></tr><tr id="line-14" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>14</pre></td><td class="rouge-code"><pre>          <span style="color: #d0d0d0;background-color: #151515">width</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">800px</span><span style="color: #d0d0d0">;</span>
</pre></td></tr><tr id="line-15" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>15</pre></td><td class="rouge-code"><pre>          <span style="color: #d0d0d0;background-color: #151515">height</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">450px</span><span style="color: #d0d0d0">;</span>
</pre></td></tr><tr id="line-16" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>16</pre></td><td class="rouge-code"><pre>          <span style="color: #d0d0d0;background-color: #151515">overflow</span><span style="color: #d0d0d0">:</span> <span style="color: #d0d0d0;background-color: #151515">auto</span><span style="color: #d0d0d0">;</span>
</pre></td></tr><tr id="line-17" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>17</pre></td><td class="rouge-code"><pre>      <span style="color: #d0d0d0">}</span>
</pre></td></tr><tr id="line-18" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>18</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-19" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>19</pre></td><td class="rouge-code"><pre>      <span style="color: #d0d0d0;background-color: #151515">#canvas_container</span> <span style="color: #d0d0d0">{</span>
</pre></td></tr><tr id="line-20" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>20</pre></td><td class="rouge-code"><pre>        <span style="color: #d0d0d0;background-color: #151515">background</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">#333</span><span style="color: #d0d0d0">;</span>
</pre></td></tr><tr id="line-21" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>21</pre></td><td class="rouge-code"><pre>        <span style="color: #d0d0d0;background-color: #151515">text-align</span><span style="color: #d0d0d0">:</span> <span style="color: #d0d0d0;background-color: #151515">center</span><span style="color: #d0d0d0">;</span>
</pre></td></tr><tr id="line-22" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>22</pre></td><td class="rouge-code"><pre>        <span style="color: #d0d0d0;background-color: #151515">border</span><span style="color: #d0d0d0">:</span> <span style="color: #d0d0d0;background-color: #151515">solid</span> <span style="color: #90a959">3px</span><span style="color: #d0d0d0">;</span>
</pre></td></tr><tr id="line-23" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>23</pre></td><td class="rouge-code"><pre>      <span style="color: #d0d0d0">}</span>
</pre></td></tr><tr id="line-24" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>24</pre></td><td class="rouge-code"><pre>  <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-25" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>25</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-26" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>26</pre></td><td class="rouge-code"><pre><span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-27" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>27</pre></td><td class="rouge-code"><pre>     <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"my_pdf_viewer"</span><span style="color: #f4bf75">></span>
</p></span></pre></td></tr><tr id="line-28" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>28</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"canvas_container"</span><span style="color: #f4bf75">></span>
</p></span></pre></td></tr><tr id="line-29" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>29</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><canvas> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"pdf_renderer"</span><span style="color: #f4bf75">></span></canvas></span>
</pre></td></tr><tr id="line-30" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>30</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-31" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>31</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-32" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>32</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"navigation_controls"</span><span style="color: #f4bf75">></span>
</p></span></pre></td></tr><tr id="line-33" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>33</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"go_previous"</span><span style="color: #f4bf75">></span>Previous<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-34" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>34</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><input/> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"current_page"</span> <span style="color: #6a9fb5">value=</span><span style="color: #90a959">"1"</span> <span style="color: #6a9fb5">type=</span><span style="color: #90a959">"number"</span><span style="color: #f4bf75">/></span>
</span></pre></td></tr><tr id="line-35" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>35</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"go_next"</span><span style="color: #f4bf75">></span>Next<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-36" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>36</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-37" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>37</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-38" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>38</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"><p> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"zoom_controls"</span><span style="color: #f4bf75">></span>  
</p></span></pre></td></tr><tr id="line-39" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>39</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"zoom_in"</span><span style="color: #f4bf75">></span>+<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-40" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>40</pre></td><td class="rouge-code"><pre>            <span style="color: #f4bf75"><button> <span style="color: #6a9fb5">id=</span><span style="color: #90a959">"zoom_out"</span><span style="color: #f4bf75">></span>-<span style="color: #f4bf75"/></button></span>
</pre></td></tr><tr id="line-41" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>41</pre></td><td class="rouge-code"><pre>        <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-42" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>42</pre></td><td class="rouge-code"><pre>    <span style="color: #f4bf75"/>
</pre></td></tr><tr id="line-43" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>43</pre></td><td class="rouge-code"><pre>
</pre></td></tr><tr id="line-44" class="lineno"><td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;"><pre>44</pre></td><td class="rouge-code">
<pre>    <span style="color: #f4bf75"><script/></span>
</pre>
</td>
</tr>
<tr id="line-45" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>45</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">myState</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-46" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>46</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #6a9fb5">pdf</span><span style="color: #d0d0d0">:</span> <span style="color: #d28445">null</span><span style="color: #d0d0d0">,</span>
</pre>
</td>
</tr>
<tr id="line-47" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>47</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #6a9fb5">currentPage</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">1</span><span style="color: #d0d0d0">,</span>
</pre>
</td>
</tr>
<tr id="line-48" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>48</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #6a9fb5">zoom</span><span style="color: #d0d0d0">:</span> <span style="color: #90a959">1</span>
</pre>
</td>
</tr>
<tr id="line-49" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>49</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">}</span>
</pre>
</td>
</tr>
<tr id="line-50" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>50</pre>
</td>
<td class="rouge-code">
<pre>     
</pre>
</td>
</tr>
<tr id="line-51" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>51</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">pdfjsLib</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getDocument</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">./my_document.pdf</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">then</span><span style="color: #d0d0d0">((</span><span style="color: #d0d0d0;background-color: #151515">pdf</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">=></span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-52" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>52</pre>
</td>
<td class="rouge-code">
<pre>     
</pre>
</td>
</tr>
<tr id="line-53" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>53</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">pdf</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-54" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>54</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">();</span>
</pre>
</td>
</tr>
<tr id="line-55" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>55</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-56" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>56</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-57" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>57</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-58" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>58</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d28445">function</span> <span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">()</span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-59" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>59</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getPage</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">currentPage</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">then</span><span style="color: #d0d0d0">((</span><span style="color: #d0d0d0;background-color: #151515">page</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">=></span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-60" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>60</pre>
</td>
<td class="rouge-code">
<pre>         
</pre>
</td>
</tr>
<tr id="line-61" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>61</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">canvas</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">"</span><span style="color: #90a959">pdf_renderer</span><span style="color: #90a959">"</span><span style="color: #d0d0d0">);</span>
</pre>
</td>
</tr>
<tr id="line-62" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>62</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">ctx</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">canvas</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getContext</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">2d</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">);</span>
</pre>
</td>
</tr>
<tr id="line-63" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>63</pre>
</td>
<td class="rouge-code">
<pre>     
</pre>
</td>
</tr>
<tr id="line-64" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>64</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">viewport</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">page</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getViewport</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">zoom</span><span style="color: #d0d0d0">);</span>
</pre>
</td>
</tr>
<tr id="line-65" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>65</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-66" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>66</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0;background-color: #151515">canvas</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">width</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">viewport</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">width</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-67" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>67</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0;background-color: #151515">canvas</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">height</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">viewport</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">height</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-68" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>68</pre>
</td>
<td class="rouge-code">
<pre>         
</pre>
</td>
</tr>
<tr id="line-69" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>69</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0;background-color: #151515">page</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">({</span>
</pre>
</td>
</tr>
<tr id="line-70" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>70</pre>
</td>
<td class="rouge-code">
<pre>                    <span style="color: #6a9fb5">canvasContext</span><span style="color: #d0d0d0">:</span> <span style="color: #d0d0d0;background-color: #151515">ctx</span><span style="color: #d0d0d0">,</span>
</pre>
</td>
</tr>
<tr id="line-71" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>71</pre>
</td>
<td class="rouge-code">
<pre>                    <span style="color: #6a9fb5">viewport</span><span style="color: #d0d0d0">:</span> <span style="color: #d0d0d0;background-color: #151515">viewport</span>
</pre>
</td>
</tr>
<tr id="line-72" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>72</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-73" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>73</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-74" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>74</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">}</span>
</pre>
</td>
</tr>
<tr id="line-75" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>75</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-76" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>76</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">go_previous</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">addEventListener</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">click</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">,</span> <span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">e</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">=></span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-77" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>77</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #aa759f">if</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span> <span style="color: #d0d0d0">==</span> <span style="color: #d28445">null</span> <span style="color: #d0d0d0">||</span> <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">currentPage</span> <span style="color: #d0d0d0">==</span> <span style="color: #90a959">1</span><span style="color: #d0d0d0">)</span> 
</pre>
</td>
</tr>
<tr id="line-78" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>78</pre>
</td>
<td class="rouge-code">
<pre>              <span style="color: #aa759f">return</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-79" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>79</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">currentPage</span> <span style="color: #d0d0d0">-=</span> <span style="color: #90a959">1</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-80" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>80</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">"</span><span style="color: #90a959">current_page</span><span style="color: #90a959">"</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">value</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">currentPage</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-81" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>81</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">();</span>
</pre>
</td>
</tr>
<tr id="line-82" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>82</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-83" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>83</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-84" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>84</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">go_next</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">addEventListener</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">click</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">,</span> <span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">e</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">=></span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-85" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>85</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #aa759f">if</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span> <span style="color: #d0d0d0">==</span> <span style="color: #d28445">null</span> <span style="color: #d0d0d0">||</span> <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">currentPage</span> <span style="color: #d0d0d0">></span> <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">_pdfInfo</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">numPages</span><span style="color: #d0d0d0">)</span> 
</pre>
</td>
</tr>
<tr id="line-86" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>86</pre>
</td>
<td class="rouge-code">
<pre>               <span style="color: #aa759f">return</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-87" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>87</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">currentPage</span> <span style="color: #d0d0d0">+=</span> <span style="color: #90a959">1</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-88" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>88</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">"</span><span style="color: #90a959">current_page</span><span style="color: #90a959">"</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">value</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">currentPage</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-89" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>89</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">();</span>
</pre>
</td>
</tr>
<tr id="line-90" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>90</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-91" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>91</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-92" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>92</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">current_page</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">addEventListener</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">keypress</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">,</span> <span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">e</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">=></span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-93" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>93</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #aa759f">if</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span> <span style="color: #d0d0d0">==</span> <span style="color: #d28445">null</span><span style="color: #d0d0d0">)</span> <span style="color: #aa759f">return</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-94" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>94</pre>
</td>
<td class="rouge-code">
<pre>         
</pre>
</td>
</tr>
<tr id="line-95" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>95</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #949494">// Get key code
</span>
</pre>
</td>
</tr>
<tr id="line-96" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>96</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">code</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">e</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">keyCode</span> <span style="color: #d0d0d0">?</span> <span style="color: #d0d0d0;background-color: #151515">e</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">keyCode</span> <span style="color: #d0d0d0">:</span> <span style="color: #d0d0d0;background-color: #151515">e</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">which</span><span style="color: #d0d0d0">);</span>
</pre>
</td>
</tr>
<tr id="line-97" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>97</pre>
</td>
<td class="rouge-code">
<pre>         
</pre>
</td>
</tr>
<tr id="line-98" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>98</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #949494">// If key code matches that of the Enter key
</span>
</pre>
</td>
</tr>
<tr id="line-99" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>99</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #aa759f">if</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">code</span> <span style="color: #d0d0d0">==</span> <span style="color: #90a959">13</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-100" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>100</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d28445">var</span> <span style="color: #d0d0d0;background-color: #151515">desiredPage</span> <span style="color: #d0d0d0">=</span> 
</pre>
</td>
</tr>
<tr id="line-101" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>101</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">current_page</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">valueAsNumber</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-102" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>102</pre>
</td>
<td class="rouge-code">
<pre>                                 
</pre>
</td>
</tr>
<tr id="line-103" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>103</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #aa759f">if</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">desiredPage</span> <span style="color: #d0d0d0">>=</span> <span style="color: #90a959">1</span> <span style="color: #d0d0d0">&&</span> <span style="color: #d0d0d0;background-color: #151515">desiredPage</span> <span style="color: #d0d0d0"><=</span> <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">_pdfInfo</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">numPages</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-104" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>104</pre>
</td>
<td class="rouge-code">
<pre>                    <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">currentPage</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">desiredPage</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-105" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>105</pre>
</td>
<td class="rouge-code">
<pre>                    <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">"</span><span style="color: #90a959">current_page</span><span style="color: #90a959">"</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">value</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0;background-color: #151515">desiredPage</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-106" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>106</pre>
</td>
<td class="rouge-code">
<pre>                    <span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">();</span>
</pre>
</td>
</tr>
<tr id="line-107" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>107</pre>
</td>
<td class="rouge-code">
<pre>                <span style="color: #d0d0d0">}</span>
</pre>
</td>
</tr>
<tr id="line-108" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>108</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0">}</span>
</pre>
</td>
</tr>
<tr id="line-109" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>109</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-110" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>110</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-111" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>111</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">zoom_in</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">addEventListener</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">click</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">,</span> <span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">e</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">=></span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-112" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>112</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #aa759f">if</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span> <span style="color: #d0d0d0">==</span> <span style="color: #d28445">null</span><span style="color: #d0d0d0">)</span> <span style="color: #aa759f">return</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-113" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>113</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">zoom</span> <span style="color: #d0d0d0">+=</span> <span style="color: #90a959">0.5</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-114" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>114</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">();</span>
</pre>
</td>
</tr>
<tr id="line-115" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>115</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-116" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>116</pre>
</td>
<td class="rouge-code">
<pre>
</pre>
</td>
</tr>
<tr id="line-117" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>117</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0;background-color: #151515">document</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">getElementById</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">zoom_out</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">).</span><span style="color: #d0d0d0;background-color: #151515">addEventListener</span><span style="color: #d0d0d0">(</span><span style="color: #90a959">'</span><span style="color: #90a959">click</span><span style="color: #90a959">'</span><span style="color: #d0d0d0">,</span> <span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">e</span><span style="color: #d0d0d0">)</span> <span style="color: #d0d0d0">=></span> <span style="color: #d0d0d0">{</span>
</pre>
</td>
</tr>
<tr id="line-118" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>118</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #aa759f">if</span><span style="color: #d0d0d0">(</span><span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">pdf</span> <span style="color: #d0d0d0">==</span> <span style="color: #d28445">null</span><span style="color: #d0d0d0">)</span> <span style="color: #aa759f">return</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-119" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>119</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">myState</span><span style="color: #d0d0d0">.</span><span style="color: #d0d0d0;background-color: #151515">zoom</span> <span style="color: #d0d0d0">-=</span> <span style="color: #90a959">0.5</span><span style="color: #d0d0d0">;</span>
</pre>
</td>
</tr>
<tr id="line-120" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>120</pre>
</td>
<td class="rouge-code">
<pre>            <span style="color: #d0d0d0;background-color: #151515">render</span><span style="color: #d0d0d0">();</span>
</pre>
</td>
</tr>
<tr id="line-121" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>121</pre>
</td>
<td class="rouge-code">
<pre>        <span style="color: #d0d0d0">});</span>
</pre>
</td>
</tr>
<tr id="line-122" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>122</pre>
</td>
<td class="rouge-code">
<pre>    <span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-123" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>123</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
<tr id="line-124" class="lineno">
<td class="rouge-gutter gl" style="-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none;user-select: none;">
<pre>124</pre>
</td>
<td class="rouge-code">
<pre><span style="color: #f4bf75"/>
</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>Our PDF viewer in JavaScript is ready. If you refresh the web page again, you should be able to view all the pages present in the PDF document in JavaScript and also zoom in to or zoom out of them.</p>
<figure class="post_image"><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=850/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-zoom-demo.png" alt="Zoom Demo" loading="lazy" width="870px" height="554px" class="resized-image resized-image-desktop" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=1700/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-zoom-demo.png 2x"/><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=630/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-zoom-demo.png" alt="Zoom Demo" loading="lazy" width="650px" height="416px" class="resized-image resized-image-tablet" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=1260/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-zoom-demo.png 2x"/><img decoding="async" src="https://cms-assets.tutsplus.com/cdn-cgi/image/width=360/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-zoom-demo.png" alt="Zoom Demo" loading="lazy" width="380px" height="246px" class="resized-image resized-image-mobile" srcset="https://cms-assets.tutsplus.com/cdn-cgi/image/width=720/uploads/users/413/posts/36126/image/how-to-create-a-javascript-pdf-viewer-zoom-demo.png 2x"/></figure>
<h2 id="toc-lgn5-conclusion">Congratulations! You’ve Learned to Create a Viewer for <span>PDF Documents in JavaScript!</span><br />
</h2>
<p>You now know how to use PDF.js to create a custom JavaScript PDF viewer for your website. With your new viewer for PDF documents in JavaScript, you can confidently offer a seamless user experience while displaying your organization's brochures, white papers, forms, and other documents generally meant to be distributed as hard copies.</p>
<p>You can <a href="https://github.com/mozilla/pdf.js" target="_blank" rel="external noopener">learn more about PDF.js on the official GitHub repo</a>.</p>
</div>
<p></code></p>
</div>
<p></code></p>
</div>
<p></code></div>
<p></code></p>
</div>
<p><br />
<br /><a href="https://webdesign.tutsplus.com/how-to-create-a-pdf-viewer-in-javascript--cms-32505t">Source link </a></p>
		</div><!-- .entry-content -->

		<footer class="entry-footer">
								</footer><!-- .entry-footer -->
		
	<nav class="navigation post-navigation" aria-label="Posts">
		<h2 class="screen-reader-text">Post navigation</h2>
		<div class="nav-links"><div class="nav-previous"><a href="https://allianceuniversal.com/whats-old-is-new-css-tricks/" rel="prev"><span class="nav-subtitle"><i class="fas fa-angle-double-left"></i>Previous:</span> <span class="nav-title">What’s Old Is New | CSS-Tricks</span></a></div><div class="nav-next"><a href="https://allianceuniversal.com/integrating-image-to-text-and-text-to-speech-models-part-2-smashing-magazine/" rel="next"><span class="nav-subtitle">Next:<i class="fas fa-angle-double-right"></i></span> <span class="nav-title">Integrating Image-To-Text And Text-To-Speech Models (Part 2) — Smashing Magazine</span></a></div></div>
	</nav>	</div>
	
<div id="comments" class="comments-area">

		<div id="respond" class="comment-respond">
		<h3 id="reply-title" class="comment-reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/how-to-create-a-javascript-pdf-viewer/#respond" style="display:none;">Cancel reply</a></small></h3><form action="https://allianceuniversal.com/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate><p class="comment-notes"><span id="email-notes">Your email address will not be published.</span> <span class="required-field-message">Required fields are marked <span class="required">*</span></span></p><p class="comment-form-comment"><label for="comment">Comment <span class="required">*</span></label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required></textarea></p><p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" autocomplete="name" required /></p>
<p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email" required /></p>
<p class="comment-form-url"><label for="url">Website</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" autocomplete="url" /></p>
<p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Save my name, email, and website in this browser for the next time I comment.</label></p>
<p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='2377' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
</p></form>	</div><!-- #respond -->
	
</div><!-- #comments -->
</article><!-- #post-2377 -->
            <div class="single-related-posts-section-wrap layout--list">
                <div class="single-related-posts-section">
                    <a href="javascript:void(0);" class="related_post_close">
                        <i class="fas fa-times-circle"></i>
                    </a>
                    <h2 class="newsmatic-block-title"><span>Related News</span></h2><div class="single-related-posts-wrap">                                <article post-id="post-163149" class="post-163149 post type-post status-publish format-standard has-post-thumbnail hentry category-web grow-content-main">
                                                                            <figure class="post-thumb-wrap ">
                                            			<div class="post-thumbnail">
				<img post-id="163149" fifu-featured="1" src="https://i3.wp.com/media2.dev.to/dynamic/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxpq1bon8hp5ylek6bn1.png?ssl=1" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="The New Generation of High-Performance Rust Web Frameworks" title="The New Generation of High-Performance Rust Web Frameworks" title="The New Generation of High-Performance Rust Web Frameworks" decoding="async" />				<span class="thumb-caption"></span>
			</div><!-- .post-thumbnail -->
		                                        </figure>
                                                                        <div class="post-element">
                                        <h2 class="post-title"><a href="https://allianceuniversal.com/the-new-generation-of-high-performance-rust-web-frameworks/">The New Generation of High-Performance Rust Web Frameworks</a></h2>
                                        <div class="post-meta">
                                            <span class="byline"> <span class="author vcard"><a class="url fn n author_name" href="https://allianceuniversal.com/author/bill-wades/">Bill</a></span></span><span class="post-date posted-on published"><a href="https://allianceuniversal.com/the-new-generation-of-high-performance-rust-web-frameworks/" rel="bookmark"><time class="entry-date published updated" datetime="2025-06-12T15:47:56+00:00">31 minutes ago</time></a></span>                                            <a href="https://allianceuniversal.com/the-new-generation-of-high-performance-rust-web-frameworks/#comments"><span class="post-comment">0</span></a>
                                        </div>
                                    </div>
                                </article>
                                                            <article post-id="post-163146" class="post-163146 post type-post status-publish format-standard has-post-thumbnail hentry category-web grow-content-main">
                                                                            <figure class="post-thumb-wrap ">
                                            			<div class="post-thumbnail">
				<img post-id="163146" fifu-featured="1" src="https://i0.wp.com/hackernoon.imgix.net/images/2jqChkrv03exBUgkLrDzIbfM99q2-ij02wko.jpeg?ssl=1" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Credential-Free CI/CD? See How Jenkins, Vault, and Ansible Pull It Off" title="Credential-Free CI/CD? See How Jenkins, Vault, and Ansible Pull It Off" title="Credential-Free CI/CD? See How Jenkins, Vault, and Ansible Pull It Off" decoding="async" />				<span class="thumb-caption"></span>
			</div><!-- .post-thumbnail -->
		                                        </figure>
                                                                        <div class="post-element">
                                        <h2 class="post-title"><a href="https://allianceuniversal.com/credential-free-ci-cd-see-how-jenkins-vault-and-ansible-pull-it-off/">Credential-Free CI/CD? See How Jenkins, Vault, and Ansible Pull It Off</a></h2>
                                        <div class="post-meta">
                                            <span class="byline"> <span class="author vcard"><a class="url fn n author_name" href="https://allianceuniversal.com/author/anton-samoilik/">Anton</a></span></span><span class="post-date posted-on published"><a href="https://allianceuniversal.com/credential-free-ci-cd-see-how-jenkins-vault-and-ansible-pull-it-off/" rel="bookmark"><time class="entry-date published updated" datetime="2025-06-12T15:46:38+00:00">32 minutes ago</time></a></span>                                            <a href="https://allianceuniversal.com/credential-free-ci-cd-see-how-jenkins-vault-and-ansible-pull-it-off/#comments"><span class="post-comment">0</span></a>
                                        </div>
                                    </div>
                                </article>
                                                            <article post-id="post-163102" class="post-163102 post type-post status-publish format-standard has-post-thumbnail hentry category-web grow-content-main">
                                                                            <figure class="post-thumb-wrap ">
                                            			<div class="post-thumbnail">
				<img post-id="163102" fifu-featured="1" src="https://i3.wp.com/codrops-1f606.kxcdn.com/codrops/wp-content/uploads/2025/06/Robin-Payot_DevSpotlight.jpg?x63684&ssl=1" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Developer Spotlight: Robin Payot | Codrops" title="Developer Spotlight: Robin Payot | Codrops" title="Developer Spotlight: Robin Payot | Codrops" decoding="async" />				<span class="thumb-caption"></span>
			</div><!-- .post-thumbnail -->
		                                        </figure>
                                                                        <div class="post-element">
                                        <h2 class="post-title"><a href="https://allianceuniversal.com/developer-spotlight-robin-payot-codrops/">Developer Spotlight: Robin Payot | Codrops</a></h2>
                                        <div class="post-meta">
                                            <span class="byline"> <span class="author vcard"><a class="url fn n author_name" href="https://allianceuniversal.com/author/angela-meeks/">Angela</a></span></span><span class="post-date posted-on published"><a href="https://allianceuniversal.com/developer-spotlight-robin-payot-codrops/" rel="bookmark"><time class="entry-date published updated" datetime="2025-06-12T14:40:19+00:00">2 hours ago</time></a></span>                                            <a href="https://allianceuniversal.com/developer-spotlight-robin-payot-codrops/#comments"><span class="post-comment">0</span></a>
                                        </div>
                                    </div>
                                </article>
                                                            <article post-id="post-163100" class="post-163100 post type-post status-publish format-standard has-post-thumbnail hentry category-web grow-content-main">
                                                                            <figure class="post-thumb-wrap ">
                                            			<div class="post-thumbnail">
				<img post-id="163100" fifu-featured="1" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2025/05/tangram.webp" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Breaking Boundaries: Building a Tangram Puzzle With (S)CSS" title="Breaking Boundaries: Building a Tangram Puzzle With (S)CSS" title="Breaking Boundaries: Building a Tangram Puzzle With (S)CSS" decoding="async" />				<span class="thumb-caption"></span>
			</div><!-- .post-thumbnail -->
		                                        </figure>
                                                                        <div class="post-element">
                                        <h2 class="post-title"><a href="https://allianceuniversal.com/breaking-boundaries-building-a-tangram-puzzle-with-scss/">Breaking Boundaries: Building a Tangram Puzzle With (S)CSS</a></h2>
                                        <div class="post-meta">
                                            <span class="byline"> <span class="author vcard"><a class="url fn n author_name" href="https://allianceuniversal.com/author/anton-samoilik/">Anton</a></span></span><span class="post-date posted-on published"><a href="https://allianceuniversal.com/breaking-boundaries-building-a-tangram-puzzle-with-scss/" rel="bookmark"><time class="entry-date published updated" datetime="2025-06-12T14:39:11+00:00">2 hours ago</time></a></span>                                            <a href="https://allianceuniversal.com/breaking-boundaries-building-a-tangram-puzzle-with-scss/#comments"><span class="post-comment">0</span></a>
                                        </div>
                                    </div>
                                </article>
                            </div>                </div>
            </div>
    						</div>
					</div>
					<div class="secondary-sidebar">
						
<aside id="secondary" class="widget-area">
	<section id="block-1" class="widget widget_block widget_search"><form role="search" method="get" action="https://allianceuniversal.com/" class="wp-block-search__button-outside wp-block-search__text-button wp-block-search"    ><label class="wp-block-search__label" for="wp-block-search__input-1" >Search</label><div class="wp-block-search__inside-wrapper " ><input class="wp-block-search__input" id="wp-block-search__input-1" placeholder="" value="" type="search" name="s" required /><button aria-label="Search" class="wp-block-search__button wp-element-button" type="submit" >Search</button></div></form></section><section id="newsmatic_posts_grid_widget-1" class="widget widget_newsmatic_posts_grid_widget">                <style id="newsmatic_posts_grid_widget-1">
                    #newsmatic_posts_grid_widget-1 figure.post-thumb { padding-bottom: calc( 0.6 * 100% ) }
@media (max-width: 769px){ #newsmatic_posts_grid_widget-1 figure.post-thumb { padding-bottom: calc( 0.6 * 100% ) } }
@media (max-width: 548px){ #newsmatic_posts_grid_widget-1 figure.post-thumb { padding-bottom: calc( 0.6 * 100% ) } }
#newsmatic_posts_grid_widget-1 figure.post-thumb img { border-radius: 0px }
@media (max-width: 769px){ #newsmatic_posts_grid_widget-1 figure.post-thumb img { border-radius: 0px } }
@media (max-width: 548px){ #newsmatic_posts_grid_widget-1 figure.post-thumb img { border-radius: 0px } }
                </style>
            <h2 class="widget-title"><span>Trending News</span></h2>            <div class="posts-wrap posts-grid-wrap feature-post-block layout-one">
                                            <div class="post-item format-standard">
                                <div class="post_thumb_image post-thumb ">
                                    <figure class="post-thumb">
                                                                                    <a href="https://allianceuniversal.com/general-atlantic-follows-apollo-in-halting-early-recruitment-of-bankers/">
                                                <img data-lazyloaded="1" src="data:image/gif;base64,R0lGODdhAQABAPAAAMPDwwAAACwAAAAAAQABAAACAkQBADs=" alt="General Atlantic follows Apollo in halting early recruitment of bankers" title="General Atlantic follows Apollo in halting early recruitment of bankers" theme-height="250" theme-width="400" post-id="163169" fifu-featured="1" data-src="https://wp.fifu.app/allianceuniversal.com/aHR0cHM6Ly93d3cuZnQuY29tL19fb3JpZ2FtaS9zZXJ2aWNlL2ltYWdlL3YyL2ltYWdlcy9yYXcvaHR0cHMlM0ElMkYlMkZkMWUwMGVrNGViYWJtcy5jbG91ZGZyb250Lm5ldCUyRnByb2R1Y3Rpb24lMkY0ODVjMWM5Ny01NmEwLTQyMzEtOWM5ZC0wMTlkNzBkZjY4YmUuanBnP3NvdXJjZT1uZXh0LWFydGljbGUmZml0PXNjYWxlLWRvd24mcXVhbGl0eT1oaWdoZXN0JndpZHRoPTcwMCZkcHI9MQ/64f8dfceccd8/general-atlantic-follows-apollo-in-halting-early-recruitment-of-bankers.webp?w=400&h=250&c=0&p=163169" loading="lazy">
                                            </a>
                                                                            </figure>
                                    <div class="bmm-post-cats-wrap bmm-post-meta-item post-categories"><h5 class="card__content-category cat-item cat-35"><a href="https://allianceuniversal.com/category/finance/">Finance</a></h5></div>                                </div>
                                <div class="post-content-wrap card__content">
                                    <div class="newsmatic-post-title card__content-title post-title">
                                        <a href="https://allianceuniversal.com/general-atlantic-follows-apollo-in-halting-early-recruitment-of-bankers/">General Atlantic follows Apollo in halting early recruitment of bankers</a>
                                    </div>
                                </div>
                            </div>
                                </div>
    </section><section id="block-2" class="widget widget_block"><div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"><h2 class="wp-block-heading">Recent Posts</h2><ul class="wp-block-latest-posts__list wp-block-latest-posts"><li><a class="wp-block-latest-posts__post-title" href="https://allianceuniversal.com/general-atlantic-follows-apollo-in-halting-early-recruitment-of-bankers/">General Atlantic follows Apollo in halting early recruitment of bankers</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://allianceuniversal.com/boeing-stock-sinks-after-fatal-crash-of-air-india-dreamliner-the-same-model-whistleblowers-warned-the-faa-about/">Boeing stock sinks after fatal crash of Air India Dreamliner, the same model whistleblowers warned the FAA about</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://allianceuniversal.com/vertical-aerospace-long-path-to-2030/">Vertical Aerospace: Long Path To 2030</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://allianceuniversal.com/circles-ipo-is-this-crypto-stock-a-game-changer-or-a-trap/">Circle's IPO: Is This Crypto Stock a Game-Changer or a Trap?</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://allianceuniversal.com/russia-dissident-and-navalny-ally-leonid-volkov-sentenced-in-absentia-to-18-years-imprisonment-jurist/">Russia dissident and Navalny ally Leonid Volkov sentenced in absentia to 18 years imprisonment – JURIST</a></li>
</ul></div></div></section><section id="block-3" class="widget widget_block"><div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"><h2 class="wp-block-heading">Archives</h2><ul class="wp-block-archives-list wp-block-archives">	<li><a href='https://allianceuniversal.com/2025/06/'>June 2025</a></li>
	<li><a href='https://allianceuniversal.com/2025/05/'>May 2025</a></li>
	<li><a href='https://allianceuniversal.com/2025/04/'>April 2025</a></li>
	<li><a href='https://allianceuniversal.com/2025/03/'>March 2025</a></li>
	<li><a href='https://allianceuniversal.com/2025/02/'>February 2025</a></li>
	<li><a href='https://allianceuniversal.com/2025/01/'>January 2025</a></li>
	<li><a href='https://allianceuniversal.com/2024/12/'>December 2024</a></li>
	<li><a href='https://allianceuniversal.com/2024/11/'>November 2024</a></li>
	<li><a href='https://allianceuniversal.com/2024/10/'>October 2024</a></li>
	<li><a href='https://allianceuniversal.com/2024/09/'>September 2024</a></li>
</ul></div></div></section></aside><!-- #secondary -->					</div>
				</div>
			</div>
		</main><!-- #main -->
	</div><!-- #theme-content -->
	<footer id="colophon" class="site-footer dark_bk">
			</footer><!-- #colophon -->
	        <div id="newsmatic-scroll-to-top" class="align--right">
                            <span class="icon-holder"><i class="fas fa-angle-up"></i></span>
                    </div><!-- #newsmatic-scroll-to-top -->
    </div><!-- #page -->

<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/newsmatic\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}</script> <div id="grow-wp-data" data-grow='{"content":{"ID":2377,"categories":[{"ID":1}]}}'></div> <script type="litespeed/javascript">const lazyloadRunObserver=()=>{const lazyloadBackgrounds=document.querySelectorAll(`.e-con.e-parent:not(.e-lazyloaded)`);const lazyloadBackgroundObserver=new IntersectionObserver((entries)=>{entries.forEach((entry)=>{if(entry.isIntersecting){let lazyloadBackground=entry.target;if(lazyloadBackground){lazyloadBackground.classList.add('e-lazyloaded')}
lazyloadBackgroundObserver.unobserve(entry.target)}})},{rootMargin:'200px 0px 200px 0px'});lazyloadBackgrounds.forEach((lazyloadBackground)=>{lazyloadBackgroundObserver.observe(lazyloadBackground)})};const events=['DOMContentLiteSpeedLoaded','elementor/lazyload/observe',];events.forEach((event)=>{document.addEventListener(event,lazyloadRunObserver)})</script> <script id="nekit-main-js-extra" type="litespeed/javascript">var frontendData={"_wpnonce":"9455deb05d","ajaxUrl":"https:\/\/allianceuniversal.com\/wp-admin\/admin-ajax.php"}</script> <script id="newsmatic-theme-js-extra" type="litespeed/javascript">var newsmaticObject={"_wpnonce":"799616052d","ajaxUrl":"https:\/\/allianceuniversal.com\/wp-admin\/admin-ajax.php","stt":"1","stickey_header":"","livesearch":"1"}</script> <script id="fifu-json-ld-js-extra" type="litespeed/javascript">var fifuJsonLd={"url":"https:\/\/i2.wp.com\/cms-assets.tutsplus.com\/uploads\/users\/30\/posts\/32505\/preview_image\/pdf_viewer.png?ssl=1"}</script> <script data-grow-initializer="" type="litespeed/javascript">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e)}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTpmM2FjNmQ4Yy0xZWUyLTQwNTctYTViMS1iZTZkYjUwNjc1ZGU=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})()</script><script data-no-optimize="1">!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LazyLoad=e()}(this,function(){"use strict";function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,a=arguments[e];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n])}return t}).apply(this,arguments)}function i(t){return e({},it,t)}function o(t,e){var n,a="LazyLoad::Initialized",i=new t(e);try{n=new CustomEvent(a,{detail:{instance:i}})}catch(t){(n=document.createEvent("CustomEvent")).initCustomEvent(a,!1,!1,{instance:i})}window.dispatchEvent(n)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,bt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,bt,e)}function r(t){return s(t,null),0}function u(t){return null===c(t)}function d(t){return c(t)===vt}function f(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function _(t,e){nt?t.classList.add(e):t.className+=(t.className?" ":"")+e}function v(t,e){nt?t.classList.remove(e):t.className=t.className.replace(new RegExp("(^|\\s+)"+e+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")}function g(t){return t.llTempImage}function b(t,e){!e||(e=e._observer)&&e.unobserve(t)}function p(t,e){t&&(t.loadingCount+=e)}function h(t,e){t&&(t.toLoadCount=e)}function n(t){for(var e,n=[],a=0;e=t.children[a];a+=1)"SOURCE"===e.tagName&&n.push(e);return n}function m(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function E(t){return!!t[st]}function I(t){return t[st]}function y(t){return delete t[st]}function A(e,t){var n;E(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[st]=n)}function k(a,t){var i;E(a)&&(i=I(a),t.forEach(function(t){var e,n;e=a,(t=i[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function L(t,e,n){_(t,e.class_loading),s(t,ut),n&&(p(n,1),f(e.callback_loading,t,n))}function w(t,e,n){n&&t.setAttribute(e,n)}function x(t,e){w(t,ct,l(t,e.data_sizes)),w(t,rt,l(t,e.data_srcset)),w(t,ot,l(t,e.data_src))}function O(t,e,n){var a=l(t,e.data_bg_multi),i=l(t,e.data_bg_multi_hidpi);(a=at&&i?i:a)&&(t.style.backgroundImage=a,n=n,_(t=t,(e=e).class_applied),s(t,ft),n&&(e.unobserve_completed&&b(t,e),f(e.callback_applied,t,n)))}function N(t,e){!e||0<e.loadingCount||0<e.toLoadCount||f(t.callback_finish,e)}function C(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function M(t){return!!t.llEvLisnrs}function z(t){if(M(t)){var e,n,a=t.llEvLisnrs;for(e in a){var i=a[e];n=e,i=i,t.removeEventListener(n,i)}delete t.llEvLisnrs}}function R(t,e,n){var a;delete t.llTempImage,p(n,-1),(a=n)&&--a.toLoadCount,v(t,e.class_loading),e.unobserve_completed&&b(t,n)}function T(o,r,c){var l=g(o)||o;M(l)||function(t,e,n){M(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";C(t,a,e),C(t,"error",n)}(l,function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_loaded),s(e,dt),f(n.callback_loaded,e,a),i||N(n,a),z(l)},function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_error),s(e,_t),f(n.callback_error,e,a),i||N(n,a),z(l)})}function G(t,e,n){var a,i,o,r,c;t.llTempImage=document.createElement("IMG"),T(t,e,n),E(c=t)||(c[st]={backgroundImage:c.style.backgroundImage}),o=n,r=l(a=t,(i=e).data_bg),c=l(a,i.data_bg_hidpi),(r=at&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),L(a,i,o)),O(t,e,n)}function D(t,e,n){var a;T(t,e,n),a=e,e=n,(t=It[(n=t).tagName])&&(t(n,a),L(n,a,e))}function V(t,e,n){var a;a=t,(-1<yt.indexOf(a.tagName)?D:G)(t,e,n)}function F(t,e,n){var a;t.setAttribute("loading","lazy"),T(t,e,n),a=e,(e=It[(n=t).tagName])&&e(n,a),s(t,vt)}function j(t){t.removeAttribute(ot),t.removeAttribute(rt),t.removeAttribute(ct)}function P(t){m(t,function(t){k(t,Et)}),k(t,Et)}function S(t){var e;(e=At[t.tagName])?e(t):E(e=t)&&(t=I(e),e.style.backgroundImage=t.backgroundImage)}function U(t,e){var n;S(t),n=e,u(e=t)||d(e)||(v(e,n.class_entered),v(e,n.class_exited),v(e,n.class_applied),v(e,n.class_loading),v(e,n.class_loaded),v(e,n.class_error)),r(t),y(t)}function $(t,e,n,a){var i;n.cancel_on_exit&&(c(t)!==ut||"IMG"===t.tagName&&(z(t),m(i=t,function(t){j(t)}),j(i),P(t),v(t,n.class_loading),p(a,-1),r(t),f(n.callback_cancel,t,e,a)))}function q(t,e,n,a){var i,o,r=(o=t,0<=pt.indexOf(c(o)));s(t,"entered"),_(t,n.class_entered),v(t,n.class_exited),i=t,o=a,n.unobserve_entered&&b(i,o),f(n.callback_enter,t,e,a),r||V(t,n,a)}function H(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function B(t,i,o){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?q(t.target,t,i,o):(e=t.target,n=t,a=i,t=o,void(u(e)||(_(e,a.class_exited),$(e,n,a,t),f(a.callback_exit,e,n,t))));var e,n,a})}function J(e,n){var t;et&&!H(e)&&(n._observer=new IntersectionObserver(function(t){B(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function K(t){return Array.prototype.slice.call(t)}function Q(t){return t.container.querySelectorAll(t.elements_selector)}function W(t){return c(t)===_t}function X(t,e){return e=t||Q(e),K(e).filter(u)}function Y(e,t){var n;(n=Q(e),K(n).filter(W)).forEach(function(t){v(t,e.class_error),r(t)}),t.update()}function t(t,e){var n,a,t=i(t);this._settings=t,this.loadingCount=0,J(t,this),n=t,a=this,Z&&window.addEventListener("online",function(){Y(n,a)}),this.update(e)}var Z="undefined"!=typeof window,tt=Z&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),et=Z&&"IntersectionObserver"in window,nt=Z&&"classList"in document.createElement("p"),at=Z&&1<window.devicePixelRatio,it={elements_selector:".lazy",container:tt||Z?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"litespeed-loading",class_loaded:"litespeed-loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},ot="src",rt="srcset",ct="sizes",lt="poster",st="llOriginalAttrs",ut="loading",dt="loaded",ft="applied",_t="error",vt="native",gt="data-",bt="ll-status",pt=[ut,dt,ft,_t],ht=[ot],mt=[ot,lt],Et=[ot,rt,ct],It={IMG:function(t,e){m(t,function(t){A(t,Et),x(t,e)}),A(t,Et),x(t,e)},IFRAME:function(t,e){A(t,ht),w(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){A(t,ht),w(t,ot,l(t,e.data_src))}),A(t,mt),w(t,lt,l(t,e.data_poster)),w(t,ot,l(t,e.data_src)),t.load()}},yt=["IMG","IFRAME","VIDEO"],At={IMG:P,IFRAME:function(t){k(t,ht)},VIDEO:function(t){a(t,function(t){k(t,ht)}),k(t,mt),t.load()}},kt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,i=this._settings,o=X(t,i);{if(h(this,o.length),!tt&&et)return H(i)?(e=i,n=this,o.forEach(function(t){-1!==kt.indexOf(t.tagName)&&F(t,e,n)}),void h(n,0)):(t=this._observer,i=o,t.disconnect(),a=t,void i.forEach(function(t){a.observe(t)}));this.loadAll(o)}},destroy:function(){this._observer&&this._observer.disconnect(),Q(this._settings).forEach(function(t){y(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;X(t,n).forEach(function(t){b(t,e),V(t,n,e)})},restoreAll:function(){var e=this._settings;Q(e).forEach(function(t){U(t,e)})}},t.load=function(t,e){e=i(e);V(t,e)},t.resetStatus=function(t){r(t)},Z&&function(t,e){if(e)if(e.length)for(var n,a=0;n=e[a];a+=1)o(t,n);else o(t,e)}(t,window.lazyLoadOptions),t});!function(e,t){"use strict";function a(){t.body.classList.add("litespeed_lazyloaded")}function n(){console.log("[LiteSpeed] Start Lazy Load Images"),d=new LazyLoad({elements_selector:"[data-lazyloaded]",callback_finish:a}),o=function(){d.update()},e.MutationObserver&&new MutationObserver(o).observe(t.documentElement,{childList:!0,subtree:!0,attributes:!0})}var d,o;e.addEventListener?e.addEventListener("load",n,!1):e.attachEvent("onload",n)}(window,document);</script><script data-no-optimize="1">var litespeed_vary=document.cookie.replace(/(?:(?:^|.*;\s*)_lscache_vary\s*\=\s*([^;]*).*$)|^.*$/,"");litespeed_vary||fetch("/wp-content/plugins/litespeed-cache/guest.vary.php",{method:"POST",cache:"no-cache",redirect:"follow"}).then(e=>e.json()).then(e=>{console.log(e),e.hasOwnProperty("reload")&&"yes"==e.reload&&(sessionStorage.setItem("litespeed_docref",document.referrer),window.location.reload(!0))});</script><script data-optimized="1" type="litespeed/javascript" data-src="https://allianceuniversal.com/wp-content/litespeed/js/597bbf2adbe7121c840ea945aefc9393.js?ver=9f171"></script><script>const litespeed_ui_events=["mouseover","click","keydown","wheel","touchmove","touchstart"];var urlCreator=window.URL||window.webkitURL;function litespeed_load_delayed_js_force(){console.log("[LiteSpeed] Start Load JS Delayed"),litespeed_ui_events.forEach(e=>{window.removeEventListener(e,litespeed_load_delayed_js_force,{passive:!0})}),document.querySelectorAll("iframe[data-litespeed-src]").forEach(e=>{e.setAttribute("src",e.getAttribute("data-litespeed-src"))}),"loading"==document.readyState?window.addEventListener("DOMContentLoaded",litespeed_load_delayed_js):litespeed_load_delayed_js()}litespeed_ui_events.forEach(e=>{window.addEventListener(e,litespeed_load_delayed_js_force,{passive:!0})});async function litespeed_load_delayed_js(){let t=[];for(var d in document.querySelectorAll('script[type="litespeed/javascript"]').forEach(e=>{t.push(e)}),t)await new Promise(e=>litespeed_load_one(t[d],e));document.dispatchEvent(new Event("DOMContentLiteSpeedLoaded")),window.dispatchEvent(new Event("DOMContentLiteSpeedLoaded"))}function litespeed_load_one(t,e){console.log("[LiteSpeed] Load ",t);var d=document.createElement("script");d.addEventListener("load",e),d.addEventListener("error",e),t.getAttributeNames().forEach(e=>{"type"!=e&&d.setAttribute("data-src"==e?"src":e,t.getAttribute(e))});let a=!(d.type="text/javascript");!d.src&&t.textContent&&(d.src=litespeed_inline2src(t.textContent),a=!0),t.after(d),t.remove(),a&&e()}function litespeed_inline2src(t){try{var d=urlCreator.createObjectURL(new Blob([t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1")],{type:"text/javascript"}))}catch(e){d="data:text/javascript;base64,"+btoa(t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1"))}return d}</script></body></html>
<!-- Page optimized by LiteSpeed Cache @2025-06-12 16:19:07 -->

<!-- Page cached by LiteSpeed Cache 7.1 on 2025-06-12 16:19:06 -->
<!-- Guest Mode -->
<!-- QUIC.cloud UCSS in queue -->