PdfViewerEmbedded
Import
import { PdfViewerEmbedded } from '@pzeta/vue-components'
Esempio Base
src per mantenere la preview autonoma. In produzione passa l'URL del tuo documento (o un Blob recuperato via API). Il viewer si basa sull'<iframe> nativo del browser: il rendering dipende dal viewer PDF integrato del browser e dagli header Content-Type/CORS del documento remoto.Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
src | string | Blob | (required) | URL stringa o Blob del documento PDF da visualizzare. Per i Blob viene generato (e revocato automaticamente) un URL.createObjectURL |
height | string | '100%' | Altezza del viewer (valore CSS, es. '600px', '100%') |
showToolbar | boolean | true | Mostra la toolbar custom con nome file, download e "apri in nuova scheda" |
initialPage | number | 1 | Pagina iniziale (1-based); aggiunta come #page=N all'URL dell'iframe se non contiene già un hash |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
load | { totalPages: number } | Emesso quando l'iframe ha terminato il caricamento. In modalità iframe nativa totalPages vale sempre 0 |
error | - | Emesso quando il caricamento dell'iframe fallisce; viene mostrato lo stato di errore con link "apri in nuova scheda" |
page-change | { page: number } | Dichiarato nei tipi ma non emesso in modalità iframe nativa (il browser gestisce internamente la navigazione tra le pagine) |
Slots
| Slot | Props | Descrizione |
|---|---|---|
toolbar-actions | - | Azioni personalizzate inserite nella toolbar, prima dei pulsanti standard (download / nuova scheda). Visibile solo se showToolbar è true |
empty-state | - | Contenuto mostrato quando src è vuoto/assente. Default: icona PDF + "Nessun documento selezionato" |
Esempi
Senza toolbar
Nasconde la toolbar custom (showToolbar: false) lasciando solo i controlli nativi del viewer del browser.
Empty state personalizzato
Lo slot #empty-state permette di personalizzare il messaggio quando nessun src è fornito: utile nei layout split-view dove il documento viene caricato solo dopo una selezione in lista.
Azioni custom in toolbar
Lo slot #toolbar-actions aggiunge pulsanti propri (stampa, chiudi, condividi) accanto ai controlli standard.
<PdfViewerEmbedded :src="pdfUrl" height="100%">
<template #toolbar-actions>
<button
type="button"
class="inline-flex items-center gap-1 px-2 py-1 text-xs rounded text-slate-600 hover:bg-slate-200"
@click="onChiudi"
>
<i class="pi pi-times text-xs" />
<span class="hidden sm:inline">Chiudi</span>
</button>
</template>
</PdfViewerEmbedded>
Visualizzazione di un Blob
Quando il PDF arriva da un'API (es. download di un allegato) puoi passare direttamente il Blob: il componente crea e revoca automaticamente l'object URL.
<script setup lang="ts">
import { ref } from 'vue'
import { PdfViewerEmbedded } from '@pzeta/vue-components'
const pdfBlob = ref<Blob | null>(null)
async function caricaAllegato(id: number) {
const res = await fetch(`/api/allegati/${id}`)
pdfBlob.value = await res.blob()
}
</script>
<template>
<PdfViewerEmbedded v-if="pdfBlob" :src="pdfBlob" height="600px" />
</template>
TypeScript
import type {
PdfViewerEmbeddedProps,
PdfViewerEmbeddedEmits,
} from '@pzeta/vue-components'
// Props
const props: PdfViewerEmbeddedProps = {
src: 'https://example.com/documento.pdf',
height: '600px',
showToolbar: true,
initialPage: 1,
}
// Handler tipizzati
const onLoad = (payload: { totalPages: number }) => {
console.log('PDF caricato', payload.totalPages)
}
const onError = () => {
console.warn('Impossibile caricare il PDF')
}
Note Comportamento
- Il rendering avviene tramite
<iframe>nativo: aspetto e controlli interni dipendono dal viewer PDF integrato del browser - Con
srcdi tipoBlobviene generato un object URL viaURL.createObjectURL, revocato automaticamente al cambio disrce all'unmount del componente per evitare memory leak - La pagina iniziale è impostata aggiungendo
#page=Nall'URL solo se questo non contiene già un hash; non tutti i viewer onorano l'ancora - Il watch su
srcripristina gli statiloading/errorad ogni cambio sorgente - Documenti remoti richiedono header
Content-Type: application/pdfe una configurazione CORS adeguata per essere visualizzati e scaricati totalPagesè sempre0epage-changenon viene emesso: la modalità iframe nativa non espone questi metadati
Quando usarlo
- Anteprima inline di allegati PDF in layout split-view (lista a sinistra, documento a destra)
- Visualizzazione di fatture, DDT, contratti o report generati lato server
- Pannello documento con download e apertura in nuova scheda integrati
Per casi diversi:
Paginator
Controllo di paginazione standalone con navigazione configurabile, dropdown righe per pagina, report pagina corrente e slot personalizzabili.
PickList
Componente a doppia lista per il trasferimento di elementi da source a target (e viceversa), con pulsanti di spostamento, riordinamento interno e selezione multipla.