1.4.13 • Published 5 months ago

fge-pdf-vue3 v1.4.13

Weekly downloads
-
License
MIT
Repository
github
Last release
5 months ago

Fge App Vue3

Vue 3 PDF Viso Pdf baso en Mozilla's PDFJS. Forked from https://github.com/sandanat/vue-pdf-app.

npm (tag)

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

pdf sample

VISOR TEMA DARK

pdf sample

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}" />

:enableInformationFile

  • Description: enableInformationFile Atributo usado para obtener la descripción de los documentos desde el servidor.
  • Type: boolean
  • Required: false
  • Default: false
  • Usage:
<vue-pdf-app :enableInformationFile="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="'****'" />

:disableButtonSignAutomatic

  • Description: disableButtonSignAutomatic usado para desactivar botones para dar valor legal a los documentos si ya cuentan con algún valor legal.
  • Type: boolean
  • Required: false
  • Default: true
  • Usage:
<vue-pdf-app :disableButtonSignAutomatic="true" />

:msSeguridad

  • Description: msSeguridad usado para visualizar valor legal mediante la AGETIC.
  • Type: string
  • Required: false
  • Default: ''
  • Usage:
<vue-pdf-app :msSeguridad="'****'" />

:footerText

  • 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'" />

:footerVisible

  • 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 legend

: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>

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:

  1. toggleTheme

    Type: (): void.

    Description: toggle theme handler

  2. isSidebarHidden

    Type: boolean

    Description: state of a sidebar (visible or hidden). Can be used to manage visibility of custom Attachments, Outline and Thumbnail buttons

  3. 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>
  /* for dark theme */
  .pdf-app.dark {
    --pdf-toolbar-color: black;
  }

  /* for light theme */
  .pdf-app.light {
    --pdf-toolbar-color: white;
  }
</style>

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

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>
1.4.13

5 months ago

1.4.6

6 months ago

1.4.5

6 months ago

1.4.4

6 months ago

1.4.3

7 months ago

1.4.2

7 months ago

1.4.9

6 months ago

1.4.11

6 months ago

1.4.8

6 months ago

1.4.10

6 months ago

1.4.7

6 months ago

1.4.12

6 months ago

1.3.7

7 months ago

1.3.6

7 months ago

1.3.5

7 months ago

1.3.4

8 months ago

1.3.3

8 months ago

1.4.1

7 months ago

1.3.2

8 months ago

1.4.0

7 months ago

1.3.1

8 months ago

1.3.0

8 months ago

1.3.9

7 months ago

1.3.8

7 months ago

1.2.9

8 months ago

1.2.0

9 months ago

1.1.1

9 months ago

1.1.0

9 months ago

1.2.8

9 months ago

1.1.9

9 months ago

1.2.7

9 months ago

1.1.8

9 months ago

1.0.9

9 months ago

1.2.6

9 months ago

1.1.7

9 months ago

1.0.8

9 months ago

1.2.5

9 months ago

1.1.6

9 months ago

1.2.4

9 months ago

1.1.5

9 months ago

1.2.3

9 months ago

1.1.4

9 months ago

1.1.3

9 months ago

1.2.1

9 months ago

1.1.2

9 months ago

1.0.7

10 months ago

1.0.6

10 months ago

1.0.5

10 months ago

1.0.4

10 months ago