import { DeesElement, property, html, customElement, domtools, type TemplateResult, type CSSResult, } from '@design.estate/dees-element'; import { Deferred } from '@push.rocks/smartpromise'; // import type pdfjsTypes from 'pdfjs-dist'; declare global { interface HTMLElementTagNameMap { 'dees-pdf': DeesPdf; } } @customElement('dees-pdf') export class DeesPdf extends DeesElement { // DEMO public static demo = () => html` `; // INSTANCE @property() public pdfUrl: string = 'https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/examples/learning/helloworld.pdf'; constructor() { super(); // you have access to all kinds of things through this. // this.setAttribute('gotIt','true'); } public render(): TemplateResult { return html` `; } public static pdfJsReady: Promise; public static pdfjsLib: any // typeof pdfjsTypes; public async connectedCallback() { super.connectedCallback(); if (!DeesPdf.pdfJsReady) { const pdfJsReadyDeferred = domtools.plugins.smartpromise.defer(); DeesPdf.pdfJsReady = pdfJsReadyDeferred.promise; // @ts-ignore DeesPdf.pdfjsLib = await import('https://cdn.jsdelivr.net/npm/pdfjs-dist@4.0.379/+esm'); DeesPdf.pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@4.0.379/build/pdf.worker.mjs'; pdfJsReadyDeferred.resolve(); } await DeesPdf.pdfJsReady; this.displayContent(); } public async displayContent() { await DeesPdf.pdfJsReady; // Asynchronous download of PDF const loadingTask = DeesPdf.pdfjsLib.getDocument(this.pdfUrl); loadingTask.promise.then( (pdf) => { console.log('PDF loaded'); // Fetch the first page const pageNumber = 1; pdf.getPage(pageNumber).then((page) => { console.log('Page loaded'); const scale = 10; const viewport = page.getViewport({ scale: scale }); // Prepare canvas using PDF page dimensions const canvas: any = this.shadowRoot.querySelector('#pdfcanvas'); const context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; // Render PDF page into canvas context const renderContext = { canvasContext: context, viewport: viewport, }; const renderTask = page.render(renderContext); renderTask.promise.then(function () { console.log('Page rendered'); }); }); }, (reason) => { // PDF loading error console.error(reason); } ); } }