Vue3+TypeScript項目中安裝PDF.js詳細(xì)的步驟
在 Vue 3 + TypeScript 項目中安裝和使用 pdfjs-dist(PDF.js),以下是詳細(xì)的步驟:
1. 安裝 pdfjs-dist
bash
npm install pdfjs-dist # 或者 yarn add pdfjs-dist # 或者 pnpm add pdfjs-dist
2. 安裝類型聲明文件(TypeScript 支持)
bash
npm install @types/pdfjs-dist # 或(新版本可能需要) npm install --save-dev @types/pdfjs-dist
3. 基礎(chǔ)使用示例
選項 1:直接使用(簡單場景)
vue
<template>
<div>
<canvas ref="canvasRef"></canvas>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import * as pdfjsLib from 'pdfjs-dist'
// 設(shè)置 worker
pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.js`
const canvasRef = ref<HTMLCanvasElement | null>(null)
onMounted(async () => {
// 加載 PDF
const loadingTask = pdfjsLib.getDocument('/path/to/your.pdf')
const pdf = await loadingTask.promise
// 獲取第一頁
const page = await pdf.getPage(1)
// 設(shè)置縮放
const scale = 1.5
const viewport = page.getViewport({ scale })
// 渲染到 canvas
const canvas = canvasRef.value
if (!canvas) return
const context = canvas.getContext('2d')
canvas.height = viewport.height
canvas.width = viewport.width
const renderContext = {
canvasContext: context,
viewport: viewport
}
await page.render(renderContext).promise
})
</script>選項 2:使用 Worker(推薦用于生產(chǎn))
vue
<template>
<div>
<canvas ref="canvasRef"></canvas>
<div v-if="pageCount">總頁數(shù): {{ pageCount }}</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import * as pdfjsLib from 'pdfjs-dist'
import type { PDFDocumentProxy } from 'pdfjs-dist/types/src/display/api'
// 使用 worker
pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.js`
// 或者使用本地 worker
// pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
// 'pdfjs-dist/build/pdf.worker.min.js',
// import.meta.url
// ).toString()
const canvasRef = ref<HTMLCanvasElement | null>(null)
const pageCount = ref<number>(0)
// 渲染 PDF 頁面
const renderPage = async (pdf: PDFDocumentProxy, pageNum: number) => {
const page = await pdf.getPage(pageNum)
const scale = 1.5
const viewport = page.getViewport({ scale })
const canvas = canvasRef.value
if (!canvas) return
const context = canvas.getContext('2d')
canvas.height = viewport.height
canvas.width = viewport.width
const renderContext = {
canvasContext: context,
viewport: viewport
}
await page.render(renderContext).promise
}
// 加載 PDF
const loadPDF = async (url: string) => {
try {
const loadingTask = pdfjsLib.getDocument(url)
const pdf = await loadingTask.promise
pageCount.value = pdf.numPages
await renderPage(pdf, 1)
return pdf
} catch (error) {
console.error('Error loading PDF:', error)
throw error
}
}
onMounted(() => {
// 加載 PDF
loadPDF('/path/to/your.pdf')
})
</script>4. 創(chuàng)建可復(fù)用的 PDF 查看器組件
PDFViewer.vue
vue
<template>
<div class="pdf-viewer">
<div class="toolbar">
<button @click="prevPage" :disabled="currentPage <= 1">上一頁</button>
<span>第 {{ currentPage }} 頁 / 共 {{ totalPages }} 頁</span>
<button @click="nextPage" :disabled="currentPage >= totalPages">下一頁</button>
<input
type="number"
v-model.number="inputPage"
@change="goToPage"
min="1"
:max="totalPages"
>
<button @click="zoomIn">放大</button>
<button @click="zoomOut">縮小</button>
</div>
<div class="pdf-container">
<canvas ref="canvasRef"></canvas>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, watch } from 'vue'
import * as pdfjsLib from 'pdfjs-dist'
import type { PDFDocumentProxy } from 'pdfjs-dist/types/src/display/api'
interface Props {
src: string
}
const props = defineProps<Props>()
const canvasRef = ref<HTMLCanvasElement | null>(null)
const currentPage = ref(1)
const totalPages = ref(0)
const inputPage = ref(1)
const scale = ref(1.5)
let pdfInstance: PDFDocumentProxy | null = null
// 配置 worker
pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.js`
// 渲染當(dāng)前頁
const renderCurrentPage = async () => {
if (!pdfInstance || !canvasRef.value) return
const page = await pdfInstance.getPage(currentPage.value)
const viewport = page.getViewport({ scale: scale.value })
const canvas = canvasRef.value
const context = canvas.getContext('2d')
canvas.height = viewport.height
canvas.width = viewport.width
const renderContext = {
canvasContext: context,
viewport: viewport
}
await page.render(renderContext).promise
}
// 加載 PDF
const loadPDF = async () => {
try {
const loadingTask = pdfjsLib.getDocument(props.src)
pdfInstance = await loadingTask.promise
totalPages.value = pdfInstance.numPages
currentPage.value = 1
inputPage.value = 1
await renderCurrentPage()
} catch (error) {
console.error('Failed to load PDF:', error)
}
}
// 導(dǎo)航方法
const prevPage = () => {
if (currentPage.value > 1) {
currentPage.value--
inputPage.value = currentPage.value
}
}
const nextPage = () => {
if (pdfInstance && currentPage.value < pdfInstance.numPages) {
currentPage.value++
inputPage.value = currentPage.value
}
}
const goToPage = () => {
if (pdfInstance) {
const pageNum = Math.max(1, Math.min(inputPage.value, pdfInstance.numPages))
currentPage.value = pageNum
inputPage.value = pageNum
}
}
const zoomIn = () => {
scale.value += 0.25
}
const zoomOut = () => {
scale.value = Math.max(0.5, scale.value - 0.25)
}
// 監(jiān)聽頁面變化
watch(currentPage, renderCurrentPage)
watch(scale, renderCurrentPage)
// 監(jiān)聽 PDF 源變化
watch(() => props.src, loadPDF)
onMounted(loadPDF)
</script>
<style scoped>
.pdf-viewer {
width: 100%;
height: 100%;
}
.toolbar {
display: flex;
gap: 10px;
padding: 10px;
background: #f5f5f5;
align-items: center;
}
.pdf-container {
overflow: auto;
padding: 20px;
}
canvas {
border: 1px solid #ddd;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
</style>5. 使用組件
vue
<template>
<div>
<PDFViewer src="/path/to/document.pdf" />
</div>
</template>
<script setup lang="ts">
import PDFViewer from './components/PDFViewer.vue'
</script>注意事項
Worker 配置:生產(chǎn)環(huán)境中建議使用 worker 提高性能
版本兼容性:確保 pdfjs-dist 和 @types/pdfjs-dist 版本兼容
CDN 或本地:可以選擇使用 CDN 或本地 worker 文件
內(nèi)存管理:大型 PDF 注意內(nèi)存管理,及時清理資源
錯誤處理:添加適當(dāng)?shù)腻e誤處理機(jī)制
這樣你就可以在 Vue 3 + TypeScript 項目中成功使用 PDF.js 了!
總結(jié)
到此這篇關(guān)于Vue3+TypeScript項目中安裝PDF.js詳細(xì)步驟的文章就介紹到這了,更多相關(guān)Vue3+TypeScript安裝PDF.js內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue中pdf.js的使用之pdf顯示、跳轉(zhuǎn)指定頁面及高亮關(guān)鍵詞
- Vue中使用pdf.js實現(xiàn)PDF文檔展示功能實例
- vue3使用pdf.js來預(yù)覽文件的操作步驟(本地文件測試)
- vue如何使用pdf.js實現(xiàn)在線查看pdf文件功能
- Vue使用PDF.js實現(xiàn)瀏覽pdf文件功能
- 使用Vue3+PDF.js實現(xiàn)PDF預(yù)覽功能
- vue使用pdf.js預(yù)覽pdf文件的方法
- Vue 集成 PDF.js 實現(xiàn) PDF 預(yù)覽和添加水印的步驟
- vue實現(xiàn)在線預(yù)覽pdf文件和下載(pdf.js)
- Vue中使用PDF.js的實戰(zhàn)指南
相關(guān)文章
vue實現(xiàn)兄弟組件之間跳轉(zhuǎn)指定tab標(biāo)簽頁
這篇文章主要介紹了vue實現(xiàn)兄弟組件之間跳轉(zhuǎn)指定tab標(biāo)簽頁,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
vue3.0 CLI - 1 - npm 安裝與初始化的入門教程
這篇文章主要介紹了vue3.0 CLI - 1 - npm 安裝與初始化的入門教程,本文通過實例代碼相結(jié)合的形式,給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09
VUE搭建分布式醫(yī)療掛號系統(tǒng)的前臺預(yù)約掛號步驟詳情
這篇文章主要介紹了VUE搭建分布式醫(yī)療掛號系統(tǒng)的前臺預(yù)約掛號步驟詳情,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Vue3使用富文本框(wangeditor)的方法總結(jié)
項目中用到了富文本,選來選去選擇了wangeditor,下面這篇文章主要給大家介紹了關(guān)于Vue3使用富文本框(wangeditor)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01

