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 |