Skip to content

Commit 68b6112

Browse files
committed
Fix default theme, add setViewerOptions method
1 parent 2d78dbd commit 68b6112

10 files changed

Lines changed: 175 additions & 148 deletions

README.md

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ Standalone, isolated, drop-in [PDF.js default viewer](https://mozilla.github.io/
1414
- Drop-in, iframe-based PDF.js default viewer for any web app
1515
- Works with same-origin and cross-origin PDF documents
1616
- Configure via attributes (page, zoom, search, pagemode, locale)
17-
- Programmatic access to `PDFViewerApplication` via the `initPromise` public property
18-
- Built-in Paper & Ink default theme, with theme control (automatic/light/dark) and custom CSS injection
1917
- Resource path attributes for PDF.js internals (`worker-src`, `c-map-url`, `icc-url`, `standard-font-data-url`, `wasm-url`, and more)
18+
- Configure `PDFViewerApplicationOptions` via the `setViewerOptions` method
19+
- Access to `PDFViewerApplication` via the `initPromise` property
20+
- Built-in Paper & Ink default theme, with theme control (automatic/light/dark) and custom CSS injection
2021
- Locale override support using PDF.js viewer locales
2122
- Supports all [major browsers](https://caniuse.com/custom-elementsv1) and most [JS frameworks](https://custom-elements-everywhere.com/).
2223

@@ -199,37 +200,10 @@ viewerElement.injectViewerStyles(`
199200

200201
`injectViewerStyles(...)` applies styles immediately when the viewer document is ready, and keeps them for future rebuilds.
201202

202-
Build your own theme with viewer custom variables and inject it via `injectViewerStyles(...)`:
203-
204-
```css
205-
:root {
206-
--main-color: #5755FE;
207-
--toolbar-icon-bg-color: #0200a8;
208-
--field-color: #5755FE;
209-
--separator-color: #5755FE;
210-
--toolbar-border-color: #5755FE;
211-
--field-border-color: #5755FE;
212-
--toolbar-bg-color: rgba(139, 147, 255, .1);
213-
--body-bg-color: rgba(255, 247, 252, .7);
214-
--button-hover-color: rgba(139, 147, 255, .1);
215-
--toolbar-icon-hover-bg-color: #0200a8;
216-
--toggled-btn-color: #0200a8;
217-
--toggled-btn-bg-color: rgba(139, 147, 255, .1);
218-
--toggled-hover-active-btn-color: #5755FE;
219-
--doorhanger-hover-bg-color: rgba(139, 147, 255, .1);
220-
--doorhanger-hover-color: #0200a8;
221-
--dropdown-btn-bg-color: rgba(139, 147, 255, .1);
222-
}
223-
```
224-
225-
## Methods and Public properties
226-
227-
Methods:
203+
## Methods and properties
228204

229205
`injectViewerStyles(styles: string)` - Adds custom CSS to the viewer now (when ready) and for future rebuilds.
230206

231-
Example (`injectViewerStyles`):
232-
233207
```javascript
234208
const viewerElement = document.querySelector('pdfjs-viewer-element')
235209

@@ -239,22 +213,28 @@ await viewerElement.injectViewerStyles(`
239213
`)
240214
```
241215

242-
Public properties:
243-
244216
`initPromise: Promise<InitializationData>` - Resolves after internal viewer is completely loaded and initialized, returning `{ viewerApp }`, that gives a programmatic access to PDF.js viewer app (PDFViewerApplication).
245217

246-
Example (`initPromise`):
247-
248218
```javascript
249219
const viewerElement = document.querySelector('pdfjs-viewer-element')
250220
const { viewerApp } = await viewerElement.initPromise
251221

252222
viewerApp.open({ url: '/sample.pdf' })
253223
```
254224

255-
`iframe: PdfjsViewerElementIframe` - Public reference to the internal `iframe` element. Useful when you need direct access to `contentWindow`/`contentDocument`.
225+
`setViewerOptions(options: Record<string, string | number>): Promise<{ viewerOptions: IframeWindow['PDFViewerApplicationOptions'] }>`
226+
227+
Updates PDF.js viewer options at runtime. Call this method with an object of key-value pairs to set options such as resource paths, rendering settings, or other PDFViewerApplicationOptions. Resolves after the viewer is initialized and returns the `viewerOptions` for testing purpose.
256228

257-
Example (`iframe`):
229+
```javascript
230+
const viewerElement = document.querySelector('pdfjs-viewer-element')
231+
await viewerElement.setViewerOptions({
232+
enableComment: true,
233+
enableSignatureEditor: true
234+
})
235+
```
236+
237+
`iframe: PdfjsViewerElementIframe` - Public reference to the internal `iframe` element. Useful when you need direct access to `contentWindow`/`contentDocument`.
258238

259239
```javascript
260240
const viewerElement = document.querySelector('pdfjs-viewer-element')

demo/comments-enabled.html

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6+
<title>pdfjs-viewer-element | Iframe access demo</title>
7+
<script type="module" src="../dist/pdfjs-viewer-element.js"></script>
8+
<style>
9+
body {
10+
margin: 0;
11+
padding: 0;
12+
}
13+
</style>
14+
</head>
15+
16+
<body>
17+
<pdfjs-viewer-element
18+
src="/public/sample-pdf-with-images.pdf"
19+
style="height: 100dvh">
20+
</pdfjs-viewer-element>
21+
</body>
22+
23+
<script>
24+
document.addEventListener('DOMContentLoaded', async () => {
25+
const viewerElement = document.querySelector('pdfjs-viewer-element')
26+
const { viewerOptions } = await viewerElement.setViewerOptions({
27+
enableComment: true
28+
})
29+
console.log('Viewer options after setting:', viewerOptions.getAll())
30+
})
31+
</script>
32+
</html>

demo/signatures-editor.html

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6+
<title>pdfjs-viewer-element | Iframe access demo</title>
7+
<script type="module" src="../dist/pdfjs-viewer-element.js"></script>
8+
<style>
9+
body {
10+
margin: 0;
11+
padding: 0;
12+
}
13+
</style>
14+
</head>
15+
16+
<body>
17+
<pdfjs-viewer-element
18+
src="/public/sample-pdf-with-images.pdf"
19+
style="height: 100dvh">
20+
</pdfjs-viewer-element>
21+
</body>
22+
23+
<script>
24+
document.addEventListener('DOMContentLoaded', async () => {
25+
const viewerElement = document.querySelector('pdfjs-viewer-element')
26+
const { viewerOptions } = await viewerElement.setViewerOptions({
27+
enableSignatureEditor: true
28+
})
29+
console.log('Viewer options after setting:', viewerOptions.getAll())
30+
})
31+
</script>
32+
</html>

demo/viewer-prebuilt-from-npm-package.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
</head>
1515

1616
<body>
17-
<h1>Deprecated, the latest version does not need the prebuilt!</h1>
17+
<h1>Deprecated, the latest version does not require the prebuilt!</h1>
1818
<pdfjs-viewer-element
1919
src="/public/sample-pdf-with-images.pdf"
2020
style="height: 50dvh">

index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<script type="module" src="./index.js"></script>
1010
</head>
1111
<body style="margin: 0">
12-
<pdfjs-viewer-element
12+
<!-- <pdfjs-viewer-element
1313
src="/fake-file.pdf"
1414
style="height: 600px">
1515
</pdfjs-viewer-element>
@@ -21,7 +21,7 @@
2121
page="2"
2222
style="height: 600px">
2323
</pdfjs-viewer-element>
24-
<button onclick="toggleDownloadButton(document.querySelector('#hideOpenFileViewer'))">Toggle download button</button>
24+
<button onclick="toggleDownloadButton(document.querySelector('#hideOpenFileViewer'))">Toggle download button</button> -->
2525

2626
<pdfjs-viewer-element
2727
id="themedViewer"
@@ -50,10 +50,10 @@
5050
<button onclick="document.querySelector('#themedViewer').setAttribute('src', '/sample-pdf-10MB.pdf')">Load 10MB PDF</button>
5151
<hr>
5252

53-
<pdfjs-viewer-element
53+
<!-- <pdfjs-viewer-element
5454
id="base-viewer"
5555
locale="uk"
5656
style="height: clamp(400px, 80dvh, 600px)">
57-
</pdfjs-viewer-element>
57+
</pdfjs-viewer-element> -->
5858
</body>
5959
</html>

index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const pdfData = Uint8Array.from(atob(
1515

1616
document.addEventListener('DOMContentLoaded', async () => {
1717
const viewerElement = document.querySelector('#base-viewer')
18+
if (!viewerElement) return
1819
const { viewerApp } = await viewerElement.initPromise
1920
viewerApp.open({ data: pdfData })
2021
})

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "pdfjs-viewer-element",
3-
"version": "3.2.0",
3+
"version": "3.2.1",
44
"license": "MIT",
55
"author": {
66
"name": "Oleksandr Shevchuk",
@@ -15,7 +15,7 @@
1515
"pdfjs",
1616
"react-pdf",
1717
"vue-pdf",
18-
"pdfium",
18+
"pdfjs-dist",
1919
"pdf-lib",
2020
"adobe-acrobat",
2121
"pdf-sdk",

src/pdfjs-viewer-element.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export class PdfjsViewerElement extends HTMLElement {
4040
private localeResourceUrl?: string
4141
private localeResourceLink?: HTMLLinkElement
4242
private viewerStyles = new Set<string>()
43+
private optionsToSet: Record<string, string | number> = {}
4344

4445
static get observedAttributes() {
4546
return[
@@ -203,6 +204,10 @@ export class PdfjsViewerElement extends HTMLElement {
203204
viewerOptions?.set('eventBusDispatchToDOM', true)
204205
viewerOptions?.set('localeProperties', { lang: this.getAttribute('locale') || DEFAULTS.locale })
205206
viewerOptions?.set('viewerCssTheme', this.getCssThemeOption())
207+
for (const [key, value] of Object.entries(this.optionsToSet)) {
208+
viewerOptions?.set(key, value)
209+
}
210+
this.optionsToSet = {}
206211
}
207212

208213
private getIframeLocationHash = () => {
@@ -333,6 +338,14 @@ export class PdfjsViewerElement extends HTMLElement {
333338
this.viewerStyles.add(styles)
334339
this.appendRuntimeStyle(styles)
335340
}
341+
342+
public async setViewerOptions(options: Record<string, string | number> = {}) {
343+
this.optionsToSet = options
344+
await this.initPromise
345+
return {
346+
viewerOptions: this.iframe.contentWindow?.PDFViewerApplicationOptions
347+
}
348+
}
336349
}
337350

338351
export interface IframeWindow extends Window {

0 commit comments

Comments
 (0)