1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-10 21:22:58 +01:00
invoiceninja/resources/js/clients/shared/pdf.js
Benjamin Beganović 01e8afc1f6
PDF preview improvements (#3632)
- Added total page and current page preview
- Added new "Page" translation
- Replaced CDN based assets with local
- Production builds of assets

Co-authored-by: David Bomba <turbo124@gmail.com>
2020-04-17 07:18:07 +10:00

102 lines
2.4 KiB
JavaScript
Vendored

/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
class PDF {
constructor(url, canvas) {
this.url = url;
this.canvas = canvas;
this.context = canvas.getContext("2d");
this.currentPage = 1;
this.maxPages = 1;
}
handlePreviousPage() {
if (this.currentPage == 1) {
return;
}
this.currentPage -= 1;
this.handle();
}
handleNextPage() {
if (this.currentPage == this.maxPages) {
return;
}
this.currentPage += 1;
this.handle();
}
prepare() {
let previousPageButton = document.getElementById(
"previous-page-button"
);
let nextPageButton = document.getElementById("next-page-button");
previousPageButton.addEventListener("click", () =>
this.handlePreviousPage()
);
nextPageButton.addEventListener("click", () => this.handleNextPage());
return this;
}
setPagesInViewport() {
let currentPageContainer = document.getElementById(
"current-page-container"
);
let totalPageContainer = document.getElementById(
"total-page-container"
);
let paginationButtonContainer = document.getElementById(
"pagination-button-container"
);
currentPageContainer.innerText = this.currentPage;
totalPageContainer.innerText = this.maxPages;
if (this.maxPages > 1) {
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;
let viewport = await page.getViewport({ scale: 1 });
this.canvas.height = viewport.height;
this.canvas.width = viewport.width;
page.render({
canvasContext: this.context,
viewport
});
this.setPagesInViewport();
}
}
const url = document.querySelector("meta[name='pdf-url'").content;
const canvas = document.getElementById("pdf-placeholder");
new PDF(url, canvas).prepare().handle();