Admin 元件

Pdf Viewer

參考
內嵌 PDF 檢視器(EmbedPDF)。

安裝

Terminal
pnpm dlx shadcn-vue add @admin/pdf-viewer
import {  AdminPdfViewer,  AdminPdfViewerFullscreen,  AdminPdfViewerPageNav,  AdminPdfViewerPages,  AdminPdfViewerToolbar,  AdminPdfViewerZoom} from '@/components/admin/pdf-viewer'

用法

<script setup lang="ts">import { AdminPdfViewer } from '@/components/admin/pdf-viewer'</script>​<template>  <admin-pdf-viewer class="h-[640px] w-full" src="https://snippet.embedpdf.com/ebook.pdf" /></template>

場景

自訂 toolbar 組合

<script setup lang="ts">import {  AdminPdfViewer,  AdminPdfViewerPageNav,  AdminPdfViewerPages,  AdminPdfViewerToolbar,  AdminPdfViewerZoom} from '@/components/admin/pdf-viewer'</script>​<template>  <admin-pdf-viewer class="h-[640px] w-full" src="https://snippet.embedpdf.com/ebook.pdf">    <admin-pdf-viewer-pages />    <admin-pdf-viewer-toolbar>      <template #left>        <admin-pdf-viewer-page-nav />      </template>      <template #right>        <admin-pdf-viewer-zoom />      </template>    </admin-pdf-viewer-toolbar>  </admin-pdf-viewer></template>

外部控制當前頁

<script setup lang="ts">import { ref } from 'vue'import { AdminButton } from '@/components/admin/button'import { AdminPdfViewer } from '@/components/admin/pdf-viewer'​const page = ref<number | undefined>(1)</script>​<template>  <div class="flex w-full min-w-0 flex-col gap-3">    <div class="flex items-center gap-2">      <admin-button size="small" variant="outline" @click="page = 1">回到首頁</admin-button>      <admin-button size="small" variant="outline" @click="page = (page ?? 1) + 1"        >前進 1 頁</admin-button      >      <span class="text-sm text-text-70">外部當前頁:{{ page }}</span>    </div>    <admin-pdf-viewer      v-model:page="page"      class="h-[560px] w-full"      src="https://snippet.embedpdf.com/ebook.pdf"    />  </div></template>

API 參考

組成

<template>  <admin-pdf-viewer src="...">    <admin-pdf-viewer-pages />    <admin-pdf-viewer-toolbar>      <admin-pdf-viewer-page-nav />      <admin-pdf-viewer-zoom />      <admin-pdf-viewer-fullscreen />    </admin-pdf-viewer-toolbar>  </admin-pdf-viewer></template>

admin-pdf-viewer

Props

名稱型別預設值說明
src*string—PDF 檔案 URL(必填)
defaultPagenumber | undefined1uncontrolled 模式之初始頁碼
defaultZoomnumber | undefined—初始縮放百分比
classClassValue—根元素之自訂 class
pagenumber | undefined——

* 代表必填

Events

名稱Payload說明
errorError載入或渲染發生錯誤時觸發
loadstringPDF 載入完成時觸發,payload 為內部 documentId
update:pagenumber | undefined—
pageChangenumber當前頁碼變更時觸發
zoomChangenumber縮放百分比變更時觸發

Slots

名稱Bindings說明
default{}—

admin-pdf-viewer-toolbar

Props

名稱型別預設值說明
classClassValue—根元素之自訂 class

Slots

名稱Bindings說明
left{}—
right{}—

admin-pdf-viewer-pages

Props

名稱型別預設值說明
classClassValue—根元素之自訂 class

admin-pdf-viewer-fullscreen

Props

名稱型別預設值說明
classunknown——

admin-pdf-viewer-page-nav

Props

名稱型別預設值說明
classunknown——

admin-pdf-viewer-zoom

Props

名稱型別預設值說明
classunknown——

注意事項

  • 不支援 SSR:PDFium 引擎依賴 WebAssembly 與 Web Worker;元件殼不含 <ClientOnly>。Nuxt 請自行以 <ClientOnly> 包覆(可加 #fallback loading);純 CSR 不需處理。見 安裝 · SSR。PDF 內容不會出現於 server-rendered HTML,無法 SEO。
  • 首次掛載需下載 PDFium wasm:載入時間視網路而定,預期延遲約數百毫秒到數秒;下載期間顯示既有 admin-loading 元件。
  • wasm 二進位來源:PDF 解析使用 PDFium WebAssembly,預設由 EmbedPDF 官方 CDN 動態載入。若部署於離線環境、封閉內網,或資安政策禁止外部 CDN,需自行 host .wasm 檔並於 usePdfiumEngine 設定中指定來源(參數名請參考 EmbedPDF 文件)。
  • 父容器需有明確寬度:放大時 PDF 頁面可能比 viewer 寬,內部 viewport 自動水平捲動。若元件包在無寬度約束的 flex item(例如 <div class="flex flex-col gap-3">)內,PDF 寬度會推擠父容器;需在父 wrapper 加 w-full 或 min-w-0 確保 viewer 寬度受控。

更新紀錄

  • fix: 以 preview client 島達標 heap 4096 並固定 portable 殼a0e6e17
  • fix: 修正 toolbar 插槽、縮放預設與頁碼輸入並抽出共用 composable39ef413