Home / Web Development / 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><![CDATA[
]]></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>
<p>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.</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>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"/></p>
<p>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.</p>
</div>
<p>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>.</p>
<p>Once the PDF file has been loaded successfully, we can update the <code class="inline">pdf</code> property of our state object.</p>
<p>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.</p>
<h2>
<span class="sectionnum">4.</span> Rendering a Page</h2>
<p>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.</p>
<p>Accordingly, create a new function called <code class="inline">render()</code> containing the following code:</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>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>
<p>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.</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>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>
<p>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:</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>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>
<p>At this point, we can go ahead and render the 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>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>
<p>Putting it all together, the whole source code looks like this.</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">
</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> 
</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><![CDATA[
]]></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>
<p>If you try opening the web page in a browser, you should now be able to see the first page of your PDF file.</p>
<figure class="post_image"><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>
<p>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. </p>
<p>To fix this, all we need to do is give a fixed width and height to the <code class="inline"></p>
<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"></p>
<div> element, allowing users to scroll both horizontally and vertically.</p>
<p>Add the following code inside the <code class="inline"/> tag 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"><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>
<p>You are, of course, free to change the width and height or even use media queries to make the <code class="inline"></p>
<div> element match your requirements.</p>
<p>Optionally, you can include the following CSS rules to make the <code class="inline"></p>
<div> element seem more distinct:</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>#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>
<p>If you refresh the web page now, you should see something like this on your screen:</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-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>
<p>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.</p>
<p>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.</p>
<p>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:</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>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>
<p>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.</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>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>
<p>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.</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>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 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>
</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>
<p>Our PDF viewer in JavaScript can now display any page of the PDF file.</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-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>
<p>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.</p>
<p>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>.</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>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>
<p>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>.</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>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>
<p>You are free to add upper and lower bounds to the <code class="inline">zoom</code> property, but they are not required.</p>
<p>This is what it looks like when it’s all put together.</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">
</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> 
</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><![CDATA[
]]></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 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>
</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>
</div><div class="newsx-post-sources"></div><div class="newsx-post-navigation newsx-flex-nowrap newsx-s0-nr"><a href="https://scrolldetective.site/introducing-gemma-3-the-developer-guide/" class="prev-post newsx-flex-nowrap" ><span class="newsx-flex"><span class="newsx-svg-icon newsx-inline-flex"><svg fill='currentColor' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'><path d='M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z'></path></svg></span>Previous Article</span><div class="newsx-flex-nowrap"><img width="150" height="150" src="https://scrolldetective.site/wp-content/uploads/2025/04/Introducing-Gemma-3-The-Developer-Guide-150x150.png" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" /><h4>Introducing Gemma 3: The Developer Guide</h4></div></a><span class="newsx-divider"></span><a href="https://scrolldetective.site/25-ridiculously-impressive-html5-canvas-experiments/" class="next-post newsx-flex-nowrap" ><span class="newsx-flex">Next Article<span class="newsx-svg-icon newsx-inline-flex"><svg fill='currentColor' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'><path d='M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z'></path></svg></span></span><div class="newsx-flex-nowrap"><h4>25 ridiculously impressive HTML5 canvas experiments</h4><img width="150" height="150" src="https://scrolldetective.site/wp-content/uploads/2025/04/25-ridiculously-impressive-HTML5-canvas-experiments-150x150.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" decoding="async" loading="lazy" /></div></a></div>
<div class="newsx-related-posts-wrap">


    
    <h4>Related Posts</h4>
    
    <div class="newsx-related-posts newsx-col-3">

    
        <section>
            <a href="https://scrolldetective.site/10-best-ai-code-review-tools-and-how-they-work-sitepoint/"><img width="330" height="220" src="https://scrolldetective.site/wp-content/uploads/2025/04/10-Best-AI-Code-Review-Tools-and-How-They-Work-330x220.png" class="attachment-newsx-330x220 size-newsx-330x220 wp-post-image" alt="" decoding="async" loading="lazy" /></a>
            <h5>
                <a href="https://scrolldetective.site/10-best-ai-code-review-tools-and-how-they-work-sitepoint/">
                    10 Best AI Code Review Tools and How They Work — SitePoint                </a>
            </h5>
            <span class="post-date"></span>
        </section>

    
        <section>
            <a href="https://scrolldetective.site/sustainable-web-design-an-excerpt-a-list-apart/"><img width="330" height="220" src="https://scrolldetective.site/wp-content/uploads/2025/04/Design-for-Safety-An-Excerpt-–-A-List-Apart-330x220.png" class="attachment-newsx-330x220 size-newsx-330x220 wp-post-image" alt="" decoding="async" loading="lazy" /></a>
            <h5>
                <a href="https://scrolldetective.site/sustainable-web-design-an-excerpt-a-list-apart/">
                    Sustainable Web Design, An Excerpt – A List Apart                </a>
            </h5>
            <span class="post-date"></span>
        </section>

    
        <section>
            <a href="https://scrolldetective.site/a-contrarian-view-on-theme-frameworks-smashing-magazine/"><img width="330" height="220" src="https://scrolldetective.site/wp-content/uploads/2025/04/A-Contrarian-View-On-Theme-Frameworks-—-Smashing-Magazine-330x220.jpg" class="attachment-newsx-330x220 size-newsx-330x220 wp-post-image" alt="" decoding="async" loading="lazy" /></a>
            <h5>
                <a href="https://scrolldetective.site/a-contrarian-view-on-theme-frameworks-smashing-magazine/">
                    A Contrarian View On Theme Frameworks — Smashing Magazine                </a>
            </h5>
            <span class="post-date"></span>
        </section>

    
    </div>

</div>

<div class="comments-area" id="comments">	<div id="respond" class="comment-respond">
		<h4 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></h4><form action="https://scrolldetective.site/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</label><textarea name="comment" id="comment" placeholder="Comment" cols="45" rows="8"  maxlength="65525" required="required" spellcheck="false"></textarea></p><p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input placeholder="Your name" 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 placeholder="Your email" 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 placeholder="Your Website" 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='972' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
</p></form>	</div><!-- #respond -->
	</div>
            </article>

        </div><!-- .newsx-single-content-wrap -->
        
    </div><!-- #primary -->

    
<div class="newsx-sidebar widget-area secondary newsx-general-sidebar">
    <section id="block-8" class="widget widget_block widget_search"><form role="search" method="get" action="https://scrolldetective.site/" 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="block-9" class="widget widget_block widget_recent_entries"><ul class="wp-block-latest-posts__list wp-block-latest-posts"><li><a class="wp-block-latest-posts__post-title" href="https://scrolldetective.site/10-best-ai-code-review-tools-and-how-they-work-sitepoint/">10 Best AI Code Review Tools and How They Work — SitePoint</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://scrolldetective.site/sustainable-web-design-an-excerpt-a-list-apart/">Sustainable Web Design, An Excerpt – A List Apart</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://scrolldetective.site/a-contrarian-view-on-theme-frameworks-smashing-magazine/">A Contrarian View On Theme Frameworks — Smashing Magazine</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://scrolldetective.site/site-speed-topography-web-performance-and-site-speed-consultant/">Site-Speed Topography – Web Performance and Site Speed Consultant</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://scrolldetective.site/powering-ai-innovation-digitalocean-bare-metal-gpus-in-eu-data-center/">Powering AI Innovation: DigitalOcean Bare Metal GPUs in EU Data Center</a></li>
</ul></section></div>    
    </div><!-- .newsx-single-inner -->

</div><!-- .newsx-single-wrap -->

    </main>
</div>


    <!-- Site Footer -->
    <footer id="site-footer" class="newsx-site-footer">
        <div class="newsx-bottom-section-wrap newsx-section-wrap" data-section="newsx_section_ft_bottom"><div class="newsx-builder-grid-row newsx-builder-grid-row-full newsx-builder-grid-row-group-stack newsx-container"><div class="newsx-grid-column-1 site-footer-column newsx-flex"><div class="newsx-copyright">Copyright © 2025 Where Scroll Behavior Speaks | Powered by <a href="https://wp-royal-themes.com/themes/item-news-magazine-x-free/?ref=newsx-free-footer-credit" rel="nofollow noopener" target="_blank">News Magazine X</a></div></div></div></div>
<div tabindex="0" id="newsx-back-to-top" class="">
    <span class="newsx-svg-icon newsx-inline-flex"><svg fill='currentColor' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'><path d='M34.9 289.5l-22.2-22.2c-9.4-9.4-9.4-24.6 0-33.9L207 39c9.4-9.4 24.6-9.4 33.9 0l194.3 194.3c9.4 9.4 9.4 24.6 0 33.9L413 289.4c-9.5 9.5-25 9.3-34.3-.4L264 168.6V456c0 13.3-10.7 24-24 24h-32c-13.3 0-24-10.7-24-24V168.6L69.2 289.1c-9.3 9.8-24.8 10-34.3.4z'></path></svg></span></div>    </footer>

	</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\/news-magazine-x\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script type="text/javascript" id="ce4wp_form_submit-js-extra">
/* <![CDATA[ */
var ce4wp_form_submit_data = {"siteUrl":"https:\/\/scrolldetective.site","url":"https:\/\/scrolldetective.site\/wp-admin\/admin-ajax.php","nonce":"1033d053ff","listNonce":"363bf76638","activatedNonce":"2fc8a9f173"};
/* ]]> */
</script>
<script type="text/javascript" src="https://scrolldetective.site/wp-content/plugins/creative-mail-by-constant-contact/assets/js/block/submit.js?ver=1744981248" id="ce4wp_form_submit-js"></script>
<script type="text/javascript" id="custom-script-js-extra">
/* <![CDATA[ */
var wpdata = {"object_id":"972","site_url":"https:\/\/scrolldetective.site"};
/* ]]> */
</script>
<script type="text/javascript" src="https://scrolldetective.site/wp-content/plugins/wp-meta-and-date-remover/assets/js/inspector.js?ver=1.1" id="custom-script-js"></script>
<script type="text/javascript" src="https://scrolldetective.site/wp-content/themes/news-magazine-x/assets/lib/swiper/swiper.min.js?ver=11.0.3" id="newsx-swiper-js"></script>
<script type="text/javascript" src="https://scrolldetective.site/wp-content/themes/news-magazine-x/assets/lib/marquee/marquee.min.js?ver=1.2.1" id="newsx-marquee-js"></script>
<script type="text/javascript" src="https://scrolldetective.site/wp-content/themes/news-magazine-x/assets/lib/tipsy/jquery.tipsy.min.js?ver=1.7.1" id="newsx-tipsy-js"></script>
<script type="text/javascript" id="newsx-main-js-extra">
/* <![CDATA[ */
var NewsxMain = {"ajaxurl":"https:\/\/scrolldetective.site\/wp-admin\/admin-ajax.php","nonce":"d89d41f36c","tablet_bp":"768","mobile_bp":"480","dark_mode":"body.newsx-dark-mode, .site-content, .newsx-offcanvas-widgets-area, .newsx-mobile-menu-container, .search-form, .newsx-ajax-search-results, .newsx-table-of-contents h3:after, .newsx-single-post-media .image-caption,.newsx-site-header .newsx-section-wrap, .newsx-site-footer .newsx-section-wrap, .newsx-desktop-menu .sub-menu, .newsx-preloader-wrap {background-color:#222222;}input, select, textarea {background-color:#272727;}.tipsy-inner {background-color:#383838;color:#fff;}.tipsy-arrow {border-color:#383838;}.newsx-grid-filters-dropdown {background-color:#383838;color:#c4c4c4;}.newsx-newsletter-wrap, .newsx-weather-wrap,.newsx-table-of-contents, .newsx-table-of-contents > div:before,.newsx-s2.newsx-category-list .category-meta,.newsx-s0.newsx-float-sharing:not(.pos-outside) .sharing-icons, .newsx-s0.newsx-float-sharing.pos-outside .newsx-post-sharing,.newsx-offcanvas-widgets-area::-webkit-scrollbar-thumb, .newsx-offcanvas-widgets-area::-webkit-scrollbar-thumb:hover,.header-search-s2.active .search-form, .newsx-ajax-search-results,.newsx-dark-mode-switcher {background-color:#333333 !important;}.header-search-s2 .search-form::after {border-bottom-color:#333333;}.single .newsx-newsletter-wrap {background-color:transparent !important;}.comment-form .form-submit .submit, .post-password-form input[type=\"submit\"], .wpcf7-submit, .wp-block-file__button, .wp-block-loginout .button {background-color:#333333;}@media screen and (max-width:768px) {.newsx-post-meta .newsx-s0.newsx-static-sharing {background:#333333;}}pre, button, input, select, textarea, .newsx-mobile-menu li, .newsx-cta-button, .search-form, .search-field, .newsx-ajax-search-results, .newsx-grid-filters-dropdown, .newsx-prev, .newsx-next, .newsx-load-more, .newsx-category-list li a, .newsx-tabs li, .newsx-social-icon, .newsx-blog-pagination > *, article.entry-comments, .newsx-table-of-contents a, .newsx-post-navigation, .newsx-post-navigation .newsx-divider, .comments-pagination, .newsx-post-author-box, .newsx-newsletter-wrap, .newsx-related-posts-wrap, table, td, th, .widget_block table thead, .widget_block table th, .widget_block table td, .widget_block table tfoot, .wp-block-search__input, :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper), .wp-block-tag-cloud.is-style-outline a, .widget_nav_menu li a, .wp-block-group, .wp-block-code, .wp-block-table thead, .wp-block-table tfoot, .wp-block-table td, .wp-block-table th,.newsx-site-header .newsx-section-wrap, .newsx-site-footer .newsx-section-wrap, .newsx-header-menu-primary .newsx-desktop-menu .sub-menu.newsx-submenu-divider .menu-item:not(:last-child), .newsx-header-menu-secondary .newsx-desktop-menu .sub-menu.newsx-submenu-divider .menu-item:not(:last-child),.newsx-s3.newsx-widget-title-wrap {border-color:#383838;}hr, .wp-block-separator {color:#383838;background-color:#383838;}.newsx-site-header .newsx-top-section-wrap {border-bottom-width:1px;border-bottom-style:solid;}.newsx-table-of-contents a,.header-search-s2.active .search-form .search-field,.newsx-site-footer .newsx-category-list.newsx-s0 li a {border-color:#4a4a4a;}.newsx-s3.newsx-widget-title-wrap {border-bottom-color:#4a4a4a;}body, button, input, select, textarea, .newsx-social-icon, .newsx-cta-button a, .newsx-random-post a, .newsx-blog-pagination > *, .newsx-breadcrumbs a, .newsx-post-sources a, .widget_nav_menu li a, .newsx-grid-view-all a,.newsx-header-menu-secondary a, .newsx-header-weather,.newsx-single-wrap .newsx-post-content,.newsx-date-and-time,.newsx-site-footer {color:#c4c4c4;}.newsx-header-menu-secondary .sub-menu-icon .newsx-svg {fill:#c4c4c4;}.newsx-weather-content .weather-condition, .newsx-weather-content .weather-extra-info, .newsx-grid-date-time, .newsx-grid-author a, .newsx-grid-author a:hover, .newsx-grid-post-meta div:first-child:after, .wp-block-tag-cloud.is-style-outline a, .sharing-header, .newsx-post-meta-inner, .newsx-post-meta-inner a, .newsx-post-author-box .author-job, .newsx-related-posts .post-date, .comment-meta, .comment-meta a, .comment-respond .logged-in-as, .comment-respond .logged-in-as, .comment-respond .comment-notes, .comment-form .comment-form-cookies-consent label, .comment-form textarea::placeholder, .comment-form input::placeholder, .wpcf7-form-control::placeholder, .newsx-newsletter-form .agree-to-terms, .newsx-newsletter-policy, .newsx-archive-page-header .sub-categories span,.search-field::placeholder, .newsx-newsletter-form input::placeholder, .wp-block-search__input::placeholder, .newsx-site-title-tagline .site-description, .newsx-ajax-search-results .search-results-content span,.newsx-s0.newsx-category-list li a,.newsx-site-footer .newsx-post-meta {color:#9e9e9e;}.newsx-static-sharing .sharing-header {color:#9e9e9e !important;}.newsx-static-sharing .sharing-header svg {color:#9e9e9e !important;fill:#9e9e9e !important;}.newsx-svg-icon svg,.newsx-offcanvas-btn svg,.newsx-header-social-icons .newsx-social-icon svg,.newsx-header-search .newsx-search-icon svg,.newsx-random-post svg,.newsx-s0.newsx-static-sharing .sharing-icons .copy-share svg,.newsx-s0.newsx-static-sharing .sharing-icons .print-share svg,.newsx-s0.newsx-float-sharing .sharing-icons .copy-share svg,.newsx-s0.newsx-float-sharing .sharing-icons .print-share svg,.newsx-grid-filters-dropdown-more:hover svg,.newsx-widget .newsx-social-icon svg,.newsx-site-footer .newsx-social-icon svg {fill:#fff;color:#fff;}.newsx-post-format-icon {border-color:#f9f9f9;}.newsx-post-format-icon svg path {color:#f9f9f9;}:where(.newsx-s2, .newsx-s2-sr, .newsx-s2-br) > .newsx-post-sharing .sharing-icons .copy-share {border-color:#555;}:where(.newsx-s2, .newsx-s2-sr, .newsx-s2-br) > .newsx-post-sharing .sharing-icons .copy-share svg {fill:#555;}:where(.newsx-s2, .newsx-s2-sr, .newsx-s2-br).newsx-float-sharing.newsx-original-colors:not(.newsx-s0) .sharing-icons a {background-color:transparent;}.newsx-header-search .newsx-ring-loader div {border-left-color:#fff !important;}a, .newsx-header-menu-primary a,.newsx-grid-filters-dropdown-more:hover {color:#fff;}.newsx-site-title-tagline .site-title a, .newsx-site-title-tagline .site-title a:hover, h1, h1 a, h2, h2 a, h3, h3 a, h4, h4 a, h5, h5 a, h6, h6 a, .newsx-grid-title > :where(div, p, span) a,.newsx-table-of-contents a, .newsx-grid-read-more a, .newsx-weather-content .weather-location, .newsx-weather-content .weather-temp,.newsx-post-meta-inner .newsx-post-author a, .comment-author, .comment .comment-author a, .newsx-post-content + .newsx-static-sharing .sharing-header,.newsx-single-post-media .image-caption, .newsx-newsletter-title svg, .widget_block .wp-block-quote, .widget_block .wp-block-details:not(.has-text-color) summary,.newsx-mobile-menu-toggle, .newsx-ajax-search-results .search-results-content a,.newsx-header-news-ticker a.newsx-news-ticker-title,.newsx-widget .soc-brand, .newsx-widget .newsx-lt-s1 .soc-label1, .newsx-widget .soc-count,.newsx-widget .newsx-social-icon:hover .soc-brand, .newsx-widget .newsx-lt-s1 .newsx-social-icon:hover .soc-label1, .newsx-widget .newsx-social-icon:hover .soc-count,.newsx-heading-widget h3, .newsx-widget-title-text,.newsx-site-footer .newsx-widget :where(h1, h2, h3, h4, h5, h6) a {color:#fff;}"};
/* ]]> */
</script>
<script type="text/javascript" src="https://scrolldetective.site/wp-content/themes/news-magazine-x/assets/js/main.min.js?ver=1.2.1" id="newsx-main-js"></script>
<script type="text/javascript" src="https://scrolldetective.site/wp-includes/js/comment-reply.min.js?ver=6.8" id="comment-reply-js" async="async" data-wp-strategy="async"></script>

</body>
</html><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'933981946bc1cc36',t:'MTc0NTIwMzExNi4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>