|
{% extends "base.html" %} |
|
|
|
{% block title %} |
|
<title>PDF Viewer</title> |
|
{% endblock %} |
|
|
|
{% block head_scripts %} |
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script> |
|
{% endblock %} |
|
|
|
{% block content %} |
|
<div class="pagination-container"> |
|
<div class="pagination"> |
|
<button id="prev" class="pagination-button"> |
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> |
|
<path fill-rule="evenodd" d="M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z"/> |
|
</svg> |
|
Previous |
|
</button> |
|
|
|
<div class="page-input-container"> |
|
<input type="number" id="pageNum" value="{{ page }}" class="page-input" style="padding-right: 30px;"> |
|
<span class="page-input-label">of {{ total_pages }}</span> |
|
</div> |
|
|
|
<button id="next" class="pagination-button"> |
|
Next |
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16"> |
|
<path fill-rule="evenodd" d="M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z"/> |
|
</svg> |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div id="pdf-container"> |
|
<canvas id="pdf-canvas"></canvas> |
|
</div> |
|
{% endblock %} |
|
|
|
{% block body_scripts %} |
|
<script> |
|
pdfjsLib = window['pdfjs-dist/build/pdf']; |
|
pdfjsLib.GlobalWorkerOptions.workerSrc = |
|
'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.worker.min.js'; |
|
|
|
let pdfDoc = null; |
|
let currentPage = {{ page }}; |
|
const urlPath = "{{ url_path }}"; |
|
|
|
pdfjsLib.getDocument(urlPath).promise.then(function(pdf) { |
|
pdfDoc = pdf; |
|
document.getElementById('pageNum').max = pdf.numPages; |
|
document.querySelector('.page-input-label').textContent = `of ${pdf.numPages}`; |
|
renderPage(currentPage); |
|
}); |
|
|
|
function renderPage(num) { |
|
pdfDoc.getPage(num).then(function(page) { |
|
const scale = 1.5; |
|
const viewport = page.getViewport({ scale }); |
|
const canvas = document.getElementById('pdf-canvas'); |
|
const ctx = canvas.getContext('2d'); |
|
|
|
|
|
canvas.height = viewport.height; |
|
canvas.width = viewport.width; |
|
|
|
|
|
page.render({ |
|
canvasContext: ctx, |
|
viewport: viewport |
|
}); |
|
}); |
|
} |
|
|
|
|
|
document.getElementById('prev').addEventListener('click', function() { |
|
if (currentPage <= 1) return; |
|
currentPage--; |
|
document.getElementById('pageNum').value = currentPage; |
|
renderPage(currentPage); |
|
}); |
|
|
|
document.getElementById('next').addEventListener('click', function() { |
|
if (currentPage >= pdfDoc.numPages) return; |
|
currentPage++; |
|
document.getElementById('pageNum').value = currentPage; |
|
renderPage(currentPage); |
|
}); |
|
|
|
document.getElementById('pageNum').addEventListener('change', function() { |
|
const newPage = Math.min(Math.max(1, parseInt(this.value)), pdfDoc.numPages); |
|
currentPage = newPage; |
|
this.value = currentPage; |
|
renderPage(currentPage); |
|
}); |
|
</script> |
|
{% endblock %} |