Fge App Vue3
Vue 3 PDF Viso Pdf baso en Mozilla's PDFJS. Forked from https://github.com/sandanat/vue-pdf-app.
100% PDFJS Funcionalidades:
- zoom
- print
- download
- rotate
- text selection
- search panel
- pdf document password
- thumbnail, outline, attachments, annotation layers
- abrir muchos pdf
- ver valor legal del documento mediante ADSIB o AGETIC
- adicionar valor legar por ADSIB o AGETIC
- personalizar footer
VISOR TEMA LIGHT
VISOR TEMA DARK
Installation
npm install fge-pdf-vue3
Usage
<template>
<fge-pdf-vue3
style="height: 100vh;"
:viewButton="viewButton"
:viewSignature="viewSignature"
:signature="signature"
:page-number="1"
file-name="Custom fileName"
v-model:files="files"
:footer-text="'Copyright © MINISTERIO PÚBLICO DE BOLIVIA'"
:footer-visible="true"
:token="token"
:theme="'light'"
:buttonDeleteFile="buttonDeleteFile"
></fge-pdf-vue3>
</template>
<script>
import FgePdfVue3 from "fge-pdf-vue3";
import "vue3-pdf-app/dist/icons/main.css";
export default {
components: {
FgePdfVue3
},
data(){
// token generado por el servicio de seguridad
const token ="********";
const files = ref([
{
// id del archivo al cual se va dar el valor legal
id: "6359b8a82736f8d11cd61190",
// nombre del archivo
fileName: "prueba-fuego.pdf",
// pdf: puede ser url, base64 o ArrayBuffer, dato solo usado para renderizar en el visor pdf
pdf: "https://www.africau.edu/images/default/sample.pdf",
},
]);
return {
// token requerido para firmar, aprobar o visualizar el valor legal del documento
token,
// listado de archivos que se visualizaran en el visor pdf
files,
// botón para quitar o eliminar un archivo del listado
buttonDeleteFile: false,
// variables para ocultar botones del toolbar
viewButton: {
print: true,
openFile: false,
presentationMode: true,
download: true,
bookmark: true,
files: true,
},
// variables usadas para visualizar el valor legal del documento
viewSignature: {
adsib: true,
agetic: true,
},
// variables usadas para firmar todos los documentos o aprobar el documento actual
signature: {
adsib: true,
agetic: true,
},
// opciones de configuracion para ocultar o visualizar
config: {
toolbar: true,
sidebar: true,
},
scale: "1",
};
}
};
</script>
API
:files
- Type:
{ id:string; fileName:string; pdf: string | ArrayBuffer | TypedArray}[]
- Required:
true
- Default:
[]
- Usage:
<vue-pdf-app files="https://example.com/sample.pdf" />
:signature
- Description:
signature
Atributo usado para visualizar el valor legal documento. - Type:
{ agetic: boolean; adsib: boolean}
- Required:
false
- Default:
{ agetic: false, adsib: false}
- Usage:
<vue-pdf-app :signature="{ agetic: false, adsib: false}" />
:viewSignature
- Description:
viewSignature
Atributo usado visualizar el valor legal de los documentos. - Type:
{ agetic: boolean; adsib: boolean}
- Required:
false
- Default:
{ agetic: false, adsib: false}
- Usage:
<vue-pdf-app :viewSignature="{ agetic: false, adsib: false}" />
:viewButton
- Description:
viewButton
Atributo usado ocultar botones. - Type:
{ print: boolean, openFile: false, presentationMode: false, download: false, bookmark: false, files: false}
- Required:
false
- Default:
{ print: false, openFile: false, presentationMode: false, download: false, bookmark: false, files: false,}
- Usage:
<vue-pdf-app :viewSignature="{ agetic: false, adsib: false}" />
:title
- Description:
true
renames document title to pdf file name. - Type:
boolean
- Required:
false
- Default:
false
- Usage:
<vue-pdf-app :title="true" />
:token
- Description:
token
usado para visualizar y dar valor a los documentos. - Type:
string
- Required:
false
- Default:
''
- Usage:
<vue-pdf-app :token="'****'" />
:msAdsib
- Description:
msAdsib
usado para visualizar y dar valor a los documentos mediante la ADSIB. - Type:
string
- Required:
false
- Default:
''
- Usage:
<vue-pdf-app :msAdsib="'****'" />
:msSeguridad
- Description:
msSeguridad
usado para visualizar valor legal mediante la AGETIC. - Type:
string
- Required:
false
- Default:
''
- Usage:
<vue-pdf-app :msSeguridad="'****'" />
- Description:
footerText
usado para remplazar el texto del footer. - Type:
string
- Required:
false
- Default:
Copyright © FgePdfVue 2023
- Usage:
<vue-pdf-app :footerText="'Copyright © FgePdfVue 2023'" />
- Description:
footerVisible
usado para remplazar el texto del footer. - Type:
boolean
- Required:
false
- Default:
false
- Usage:
<vue-pdf-app :footerVisible="false" />
:toastEnabled
- Description:
toastEnabled
usado para mostrar los mensajes de respuestas cuando se realiza una aprobacion o firma del documento o cuando ocurre algun error. - Type:
boolean
- Required:
false
- Default:
true
- Usage:
<vue-pdf-app :toastEnabled="true" />
:theme.sync
- Type:
"dark" | "light"
- Required:
false
- Usage:
<vue-pdf-app theme="dark" />
<vue-pdf-app :theme="theme" />
<vue-pdf-app :theme.sync="theme" />
:pageScale
- Description: default page scale.
- Type:
number | "page-actual"| "page-width"| "page-height"| "page-fit"| "auto"
- Required:
false
- Usage:
// 20%
<vue-pdf-app page-scale="20" />
<vue-pdf-app :page-scale="20" />
<vue-pdf-app :page-scale="page-actual" />
:pageNumber
- Description: pdfjs stores last viewed page of a file in
window.localStorage.getItem("pdfjs.history")
. Specify the prop to override it. - Type:
number
- Required:
false
- Usage:
<vue-pdf-app :page-number="1" />
:config
- Description: toolbar configuration. Toolbar is available by default. Specify
false
for buttons or whole group of buttons to disable them. - Type:
toolbar config (see below)
- Required:
false
- Default:
toolbar config
- Usage:
<vue-pdf-app :config="config" />
<script>
export default {
data() {
return {
// disable "Previous page" button
config: {
toolbar: {
toolbarViewerLeft: {
previous: false
}
}
},
// disable whole page navigation panel
config2: {
toolbar: {
toolbarViewerLeft: false
}
},
// disable whole panel
config3: {
toolbar: false
}
};
}
};
</script>
Config specification
{
sidebar: {
viewThumbnail: true,
viewOutline: true,
viewAttachments: true,
},
secondaryToolbar: {
secondaryPresentationMode: true,
secondaryOpenFile: true,
secondaryPrint: true,
secondaryDownload: true,
secondaryViewBookmark: true,
firstPage: true,
lastPage: true,
pageRotateCw: true,
pageRotateCcw: true,
cursorSelectTool: true,
cursorHandTool: true,
scrollVertical: true,
scrollHorizontal: true,
scrollWrapped: true,
spreadNone: true,
spreadOdd: true,
spreadEven: true,
documentProperties: true,
},
toolbar: {
toolbarViewerLeft: {
findbar: true,
previous: true,
next: true,
pageNumber: true,
},
toolbarViewerRight: {
presentationMode: true,
openFile: true,
print: true,
download: true,
viewBookmark: true,
},
toolbarViewerMiddle: {
zoomOut: true,
zoomIn: true,
scaleSelectContainer: true,
},
},
errorWrapper: true,
};
:id-config
- Description: If default toolbar UI doesn't suit you it is possible to build custom toolbar. The prop contains elements ID to which to bind functionality. If element ID is specified in this prop appropriate button will be hidden in a default toolbar. May not work with UI framework components. That is because pdfjs internally manages attributes specific to a certain HTML element (for instance pdfjs toggles
disabled
attribute of a button but it won't if a div is used instead of a button). So it is better to use native HTML element specified as recommended in ID config specification below. Four slots are specially designed to build custom toolbar (are situated near a pdf page): viewer-header, viewer-prepend, viewer-append, viewer-footer
(refer slots API). It is also possible to use other slots or elements outside vue-pdf-app. - Type:
ID config (see below)
- Required:
false
- Usage:
<template>
<div>
<button :id="idConfig.zoomOut" type="button">Zoom out</button>
<vue-pdf-app :id-config="idConfig">
<template #viewer-prepend>
<div class="viewer-prepend">
<button :id="idConfig.zoomIn" type="button">Zoom in</button>
</div>
</template>
</vue-pdf-app>
</div>
</template>
<script>
export default {
data() {
return {
idConfig: { zoomIn: "zoomInId", zoomOut: "zoomOutId" }
};
}
};
</script>
ID config specification
{
cursorHandTool?: string; // <button> is recommended
cursorSelectTool?: string; // <button> is recommended
documentProperties?: string; // <button> is recommended
download?: string; // <button> is recommended
findbar?: string; // <div> is recommended
findEntireWord?: string; // <input type="checkbox"> is recommended
findHighlightAll?: string; // <input type="checkbox"> is recommended
findMessage?: string; // <span> is recommended
findInput?: string; // <input type="text"> is recommended
findMatchCase?: string; // <input type="checkbox"> is recommended
findNext?: string; // <button> is recommended
findPrevious?: string; // <button> is recommended
findResultsCount?: string; // <span> is recommended
firstPage?: string; // <button> is recommended
lastPage?: string; // <button> is recommended
nextPage?: string; // <button> is recommended
numPages?: string; // total pages qty. <span> is recommended
openFile?: string; // <button> is recommended
pageNumber?: string; // input for page number. <input type="number"> is recommended
pageRotateCcw?: string; // <button> is recommended
pageRotateCw?: string; // <button> is recommended
presentationMode?: string; // <button> is recommended
previousPage?: string; // <button> is recommended
print?: string; // <button> is recommended
scrollHorizontal?: string; // <button> is recommended
scrollVertical?: string; // <button> is recommended
scrollWrapped?: string; // <button> is recommended
sidebarToggle?: string; // <button> is recommended
spreadEven?: string; // <button> is recommended
spreadNone?: string; // <button> is recommended
spreadOdd?: string; // <button> is recommended
toggleFindbar?: string; // <button> is recommended
viewAttachments?: string; // <button> is recommended
viewBookmark?: string; // <a> tag is recommended
viewOutline?: string; // <button> tag is recommended
viewThumbnail?: string; // <button> tag is recommended
zoomIn?: string; // <button> tag is recommended
zoomOut?: string; // <button> tag is recommended
}
ℹ️ Note that elements must be in HTML document by the time vue-pdf-app is mounting (use v-show
instead of v-if
directive if necessary). Otherwise an error occurs.
@after-created(PDFViewerApplication)
- Description: emitted only once when Pdfjs library is binded to vue component. Can be used to set Pdfjs config before pdf document opening.
- Arguments:
- Usage:
<vue-pdf-app @after-created="afterCreated" />
@open(PDFViewerApplication)
- Description: emitted when pdf is opened but pages are not rendered.
- Arguments:
- Usage:
<vue-pdf-app @open="openHandler" />
@pages-rendered(PDFViewerApplication)
- Description: emitted when pdf document pages are rendered. Can be used to set default pages scale, for instance.
- Arguments:
- Usage:
<vue-pdf-app @pages-rendered="pagesRendered" />
<script>
export default {
methods: {
pagesRendered(pdfApp) {
setTimeout(() => (pdfApp.pdfViewer.currentScaleValue = "page-height"));
}
}
};
</script>
@fileSign(PDFViewerApplication)
- Description: evento que recibe el resultado de un firmado de los documentos, tanto exitoso como fallido.
- Usage:
<fge-pdf-app @fileSign="event" />
<script>
export default {
methods: {
event(pdfApp) {
console.log(pdfApp)
}
}
};
</script>
@fileApprove(PDFViewerApplication)
- Description: evento que recibe el resultado de la aprobación del documento, tanto exitoso como fallido.
- Usage:
<fge-pdf-app @fileApprove="event" />
<script>
export default {
methods: {
event(pdfApp) {
console.log(pdfApp)
}
}
};
</script>
@deleteFile(PDFViewerApplication)
- Description: evento que quita o remove documento del listado del pdf.
- Usage:
<fge-pdf-app @deleteFile="event" />
<script>
export default {
methods: {
event(pdfApp) {
console.log(pdfApp)
}
}
};
</script>
ℹ️ Events are triggered in the following order after-created (once) => open => pages-rendered
Slots
Slot names
- toolbar-left-prepend
- toolbar-left-append
- toolbar-middle-prepend
- toolbar-middle-append
- toolbar-right-prepend
- toolbar-right-append
- toolbar-sidebar-prepend
- toolbar-sidebar-append
- secondary-toolbar-prepend
- secondary-toolbar-append
- footer
- viewer-header: slot before
viewer-prepend
slot. Can be used to build custom toolbar. - viewer-prepend: slot before
viewerContainer
div. Can be used to build custom toolbar. - viewer-append: slot after
viewerContainer
div. Can be used to build custom toolbar. - viewer-footer: slot after
viewer-append
slot. Can be used to build custom toolbar.
Slot props
Each slot has props:
-
toggleTheme
Type: (): void.
Description: toggle theme handler
-
isSidebarHidden
Type: boolean
Description: state of a sidebar (visible or hidden). Can be used to manage visibility of custom Attachments, Outline and Thumbnail buttons
- isFindbarHidden
Type: boolean
Description: state of a findbar (visible or hidden). Can be used to manage visibility of custom findbar
<vue-pdf-app>
<template #toolbar-left-prepend="{ toggleTheme }">
<button @click="toggleTheme" type="button">Toggle theme</button>
</template>
</vue-pdf-app>
Color customization
Colors of the pdf viewer are customized via custom css properties:
<style>
.pdf-app.dark {
--pdf-toolbar-color: black;
}
.pdf-app.light {
--pdf-toolbar-color: white;
}
</style>
Custom css properties specification
Property | Applied to selectors | Description |
---|
--pdf-app-background-color | .pdf-app | Background color for root pdf container |
--pdf-button-hover-font-color |
.pdf-app .toolbarButton:hover
.pdf-app .toolbarButton:focus
.pdf-app .dropdownToolbarButton:hover
.pdf-app .secondaryToolbarButton:hover
.pdf-app .secondaryToolbarButton:focus
| Hover color for buttons of toolbar and secondary toolbar |
--pdf-button-toggled-color |
.pdf-app .toolbarButton.toggled
.pdf-app .splitToolbarButton.toggled > .toolbarButton.toggled
.pdf-app .secondaryToolbarButton.toggled
.pdf-app .outlineItemToggler:hover
.pdf-app .outlineItemToggler:hover + a
.pdf-app .outlineItemToggler:hover ~ .outlineItems
.pdf-app .outlineItem > a:hover
.pdf-app .attachmentsItem > button:hover
|
Background color for toggleable buttons when selected, outline items on hover, attachment items on hover
|
--pdf-dialog-button-color | .pdf-app .dialog .overlayButton |
|
--pdf-dialog-button-font-color | .pdf-app .dialog .overlayButton |
|
--pdf-error-more-info-color | .pdf-app #errorMoreInfo |
|
--pdf-error-more-info-font-color | .pdf-app #errorMoreInfo |
|
--pdf-error-wrapper-color | .pdf-app #errorWrapper |
|
--pdf-find-input-placeholder-font-color | .pdf-app #findInput::placeholder |
|
--pdf-find-message-font-color | .pdf-app #findMsg |
|
--pdf-find-results-count-color | .pdf-app #findResultsCount |
|
--pdf-find-results-count-font-color | .pdf-app #findResultsCount |
|
--pdf-horizontal-toolbar-separator-color | .pdf-app .horizontalToolbarSeparator |
|
--pdf-input-color | .pdf-app .toolbarField |
|
--pdf-input-font-color | .pdf-app .toolbarField |
|
--pdf-loading-bar-color | .pdf-app #loadingBar .progress |
|
--pdf-loading-bar-secondary-color | .pdf-app #loadingBar .progress.indeterminate .glimmer |
|
--pdf-not-found-color | .pdf-app #findInput.notFound |
|
--pdf-overlay-container-color | .pdf-app #overlayContainer | Background color for overlay container of dialogs |
--pdf-overlay-container-dialog-color | .pdf-app #overlayContainer > .container > .dialog |
Background color for document properties, password, print dialogs
|
--pdf-overlay-container-dialog-font-color | .pdf-app #overlayContainer > .container > .dialog |
Font color for document properties, password, print dialogs
|
--pdf-overlay-container-dialog-separator-color | .pdf-app .dialog .separator |
|
--pdf-sidebar-content-color | .pdf-app #sidebarContent |
Background color for sidebar
|
--pdf-split-toolbar-button-separator-color |
.pdf-app .splitToolbarButtonSeparator
.pdf-app .verticalToolbarSeparator
|
|
--pdf-thumbnail-selection-ring-selected-color | .pdf-app .thumbnail.selected > .thumbnailSelectionRing |
Border color for selected thumbnail
|
--pdf-thumbnail-selection-ring-color |
.pdf-app a:focus > .thumbnail > .thumbnailSelectionRing
.pdf-app .thumbnail:hover > .thumbnailSelectionRing
|
Border color for thumbnail on hover and focus
|
--pdf-toolbar-color |
.pdf-app #toolbarContainer
.pdf-app .findbar
.pdf-app .secondaryToolbar
.pdf-app .doorHanger:after
.pdf-app .doorHangerRight:after
.pdf-app .dropdownToolbarButton > select
.pdf-app .dropdownToolbarButton > select > option
|
Background color for toolbar, findbar, secondary toolbar, page scale dropdown
|
--pdf-toolbar-font-color |
.pdf-app .toolbarButton
.pdf-app .dropdownToolbarButton
.pdf-app .secondaryToolbarButton
.pdf-app .dropdownToolbarButton > select
.pdf-app .toolbarLabel
.pdf-app .outlineItem > a
.pdf-app .attachmentsItem > button
|
Font color for toolbar, findbar, secondary toolbar, page scale dropdown, attachments name |
--pdf-toolbar-sidebar-color | .pdf-app #toolbarSidebar |
|
Icons customization
To use default icons import "vue3-pdf-app/dist/icons/main.css";
.
To use custom icons you have to implement icons.css:
.vue-pdf-app-icon::before,
.vue-pdf-app-icon::after {
font-family: "your font family";
}
.vue-pdf-app-icon.zoom-out::before {
content: "icon code";
}
Light/dark themes
Algorithm of theme apply
Toggle theme button is not implemented by default.
It's up to you to decide where to place it.
The button can be implemented with slots:
<vue-pdf-app>
<template #footer="{ toggleTheme }">
<button @click="toggleTheme" type="button">Toggle theme</button>
</template>
</vue-pdf-app>
Localized panel
English is the default language for panel.
Use <link rel="resource" type="application/l10n" href="path-to-localization-file">
in your html for localization.
See localization file examples.
Examples
Lazy loading
PDFJS is a huge package (see the library size table above).
So use lazy loading to split your bundle into small pieces.
<template>
<div id="app">
<vue-pdf-app></vue-pdf-app>
</div>
</template>
<script>
import "vue3-pdf-app/dist/icons/main.css";
import Loader from "./components/Loader.vue";
export default {
name: "App",
components: {
"vue-pdf-app": () => ({
component: new Promise((res) => {
return setTimeout(
() => res(import(/* webpackChunkName: "pdf-viewer" */ "vue-pdf-app")),
4000
);
}),
loading: Loader
})
}
};
</script>
PDFJS interaction
You can interact with pdfjs library when pdf is opened via open
event.
<template>
<div id="app">
<div id="pdf-wrapper">
<vue-pdf-app pdf="/sample.pdf" @open="openHandler"></vue-pdf-app>
</div>
<div id="info">
<h1>PDF info:</h1>
<div v-for="item in info" :key="item.name">
<span>{{ item.name }}: {{ item.value }}</span>
<br />
</div>
</div>
</div>
</template>
<script>
import "vue3-pdf-app/dist/icons/main.css";
import VuePdfApp from "vue3-pdf-app";
export default {
name: "App",
components: {
VuePdfApp
},
data() {
return {
info: []
};
},
methods: {
async openHandler(pdfApp) {
this.info = [];
const info = await pdfApp.pdfDocument
.getMetadata()
.catch(console.error.bind(console));
if (!info) return;
const props = Object.keys(info.info);
props.forEach((prop) => {
const obj = {
name: prop,
value: info.info[prop]
};
this.info.push(obj);
});
}
}
};
</script>