1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-13 22:54:25 +01:00
invoiceninja/resources/js/clients/shared/pdf.js

141 lines
3.7 KiB
JavaScript
Raw Normal View History

/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
class PDF {
constructor(url, canvas) {
this.url = url;
this.canvas = canvas;
2020-06-17 16:52:39 +02:00
this.context = canvas.getContext('2d');
this.currentPage = 1;
this.maxPages = 1;
this.currentScale = 0.75;
2020-06-17 16:52:39 +02:00
this.currentScaleText = document.getElementById('zoom-level');
if (matchMedia('only screen and (max-width: 480px)').matches) {
2020-07-29 16:41:47 +02:00
this.currentScale = 0.5;
}
this.currentScaleText.textContent = this.currentScale * 100 + '%';
}
handlePreviousPage() {
if (this.currentPage == 1) {
return;
}
this.currentPage -= 1;
this.handle();
}
handleNextPage() {
if (this.currentPage == this.maxPages) {
return;
}
this.currentPage += 1;
this.handle();
}
2020-06-17 16:52:39 +02:00
handleZoomChange(zoom = null) {
if (this.currentScale == 0.25 && !zoom) {
return;
}
if (zoom) {
this.currentScale += 0.25;
this.currentScaleText.textContent = this.currentScale * 100 + '%';
return this.handle();
}
this.currentScale -= 0.25;
this.currentScaleText.textContent = this.currentScale * 100 + '%';
return this.handle();
}
prepare() {
2020-06-17 16:52:39 +02:00
let previousPageButton = document
.getElementById('previous-page-button')
.addEventListener('click', () => this.handlePreviousPage());
2020-06-17 16:52:39 +02:00
let nextPageButton = document
.getElementById('next-page-button')
.addEventListener('click', () => this.handleNextPage());
2020-06-17 16:52:39 +02:00
let zoomInButton = document
.getElementById('zoom-in')
.addEventListener('click', () => this.handleZoomChange(true));
2020-06-17 16:52:39 +02:00
let zoomOutButton = document
.getElementById('zoom-out')
.addEventListener('click', () => this.handleZoomChange());
2021-09-20 17:33:45 +02:00
document
.querySelector('meta[name=pdf-url]')
.addEventListener('change', () => {
this.canvas.getContext('2d').clearRect(0, 0, this.canvas.width, this.canvas.height);
this.url = document.querySelector("meta[name='pdf-url']").content;
this.handle();
})
return this;
}
setPagesInViewport() {
let currentPageContainer = document.getElementById(
2020-06-17 16:52:39 +02:00
'current-page-container'
);
let totalPageContainer = document.getElementById(
2020-06-17 16:52:39 +02:00
'total-page-container'
);
let paginationButtonContainer = document.getElementById(
2020-06-17 16:52:39 +02:00
'pagination-button-container'
);
currentPageContainer.innerText = this.currentPage;
totalPageContainer.innerText = this.maxPages;
if (this.maxPages > 1) {
2020-06-17 16:52:39 +02:00
paginationButtonContainer.style.display = 'flex';
}
}
async handle() {
let pdf = await pdfjsLib.getDocument(this.url).promise;
let page = await pdf.getPage(this.currentPage);
this.maxPages = pdf.numPages;
2020-06-17 16:52:39 +02:00
let viewport = await page.getViewport({ scale: this.currentScale });
this.canvas.height = viewport.height;
this.canvas.width = viewport.width;
page.render({
canvasContext: this.context,
2020-06-17 16:52:39 +02:00
viewport,
});
this.setPagesInViewport();
}
}
const url = document.querySelector("meta[name='pdf-url']").content;
2020-06-17 16:52:39 +02:00
const canvas = document.getElementById('pdf-placeholder');
new PDF(url, canvas).prepare().handle();