A Vue 3 component for rendering PDFs with draggable and resizable element overlays.
npm run dev- Run the demo with Vitenpm run build- Build the library (ESM + types)npm run build:demo- Build the demo todist-demo
| Prop | Type | Default | Description |
|---|---|---|---|
width |
String | '100%' |
Container width |
height |
String | '100%' |
Container height |
initFiles |
Array | [] |
PDF files to load |
initFileNames |
Array | [] |
Names for the PDF files |
initialScale |
Number | 1 |
Initial zoom scale |
showPageFooter |
Boolean | true |
Show page footer with document name and page number |
hideSelectionUI |
Boolean | false |
Hide selection handles and actions UI |
showSelectionHandles |
Boolean | true |
Show resize/move handles on selected elements |
showElementActions |
Boolean | true |
Show action buttons on selected elements |
readOnly |
Boolean | false |
Disable drag, resize, and actions for elements |
ignoreClickOutsideSelectors |
Array | [] |
CSS selectors that keep the selection active when clicking outside the element |
pageCountFormat |
String | '{currentPage} of {totalPages}' |
Format string for page counter |
autoFitZoom |
Boolean | false |
Automatically adjust zoom to fit viewport on window resize |
pdfjsOptions |
Object | {} |
Options passed to PDF.js getDocument (advanced) |
pdfjsOptions is forwarded to PDF.js getDocument(...) and can be used to tune performance.
Example:
<PDFElements
:pdfjs-options="{
disableFontFace: true,
disableRange: true,
disableStream: true,
}"
/>pdf-elements:end-init- Emitted when PDF is loadedpdf-elements:adding-ended- Emitted when interactive placement ends. Payload:{ reason: 'placed', object, docIndex, pageIndex }on success or{ reason: 'cancelled' }when the placement is cancelled.
startAddingElement(templateObject)- Starts interactive placement mode.cancelAdding()- Cancels the current placement session and emitspdf-elements:adding-endedwith{ reason: 'cancelled' }when a session was active.
element-{type}- Custom element rendering (e.g.,element-signature)custom- Fallback for elements without specific typeactions- Custom action buttons
The actions slot receives:
objectonDeleteonDuplicatetoolbarClass(pdf-elements-actions-toolbar)actionClass(pdf-elements-action-btn)actionAttrs({ 'data-pdf-elements-action': 'true' })
Use these hooks to style third-party button components consistently (for example, Nextcloud NcButton) without relying on internal scoped selectors.
Example:
<template #actions="slotProps">
<NcButton
:class="slotProps.actionClass"
v-bind="slotProps.actionAttrs"
type="button"
variant="tertiary"
@click.stop="slotProps.onDuplicate"
>
Duplicate
</NcButton>
</template>Action toolbar and action buttons can be themed via CSS variables and follow host theme tokens by default.
| Variable | Description |
|---|---|
--pdf-elements-toolbar-gap |
Toolbar button gap |
--pdf-elements-toolbar-padding |
Toolbar padding |
--pdf-elements-toolbar-background |
Toolbar background color |
--pdf-elements-toolbar-color |
Toolbar text/icon color |
--pdf-elements-toolbar-border-color |
Toolbar border color |
--pdf-elements-toolbar-border-radius |
Toolbar border radius |
--pdf-elements-toolbar-shadow |
Toolbar shadow |
--pdf-elements-action-btn-border |
Action button border |
--pdf-elements-action-btn-background |
Action button background |
--pdf-elements-action-btn-color |
Action button text/icon color |
--pdf-elements-action-btn-padding |
Action button padding |
--pdf-elements-action-btn-radius |
Action button border radius |
--pdf-elements-action-btn-min-height |
Action button min height |
--pdf-elements-action-btn-min-width |
Action button min width |
--pdf-elements-action-btn-shadow |
Action button shadow |
--pdf-elements-action-btn-hover-background |
Action button hover background |