前端 使用 pdf.js加载PDF文件

一、定义承载pdf的容器

html 复制代码
<template>
    <div>
        <div id="pdfContainer"></div>
    </div>
</template>

二、加载pdf

javascript 复制代码
<script lang="ts" setup>

import pdf from './components/230402643.pdf'

import { getDocument } from 'pdfjs-dist'
import * as pdfjsLib from 'pdfjs-dist/build/pdf.mjs'
import * as pdfjsWorker from 'pdfjs-dist/build/pdf.worker.mjs'

const pdfLoader = async () => {

    pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker

    const container = document.getElementById('pdfContainer')

    const loadingTask = getDocument(pdf);
    loadingTask.promise.then(doc => {
        // console.log(doc)
        const numPages = doc.numPages
        totalPage.value = doc.numPages
        // console.log('Number of Pages:', numPages) // pdf页数

        let lastPromise // will be used to chain promises
        lastPromise = doc.getMetadata().then(metadata => {
            // console.log('metadata  = ', metadata)
            // console.log('Metadata is:', JSON.stringify(metadata, null, 2))
            if(metadata.metadata) {
                // console.log('All Metadata:', metadata.metadata.getAll())
            }
        })

        const loadPage = (pageNum) => {
            return doc.getPage(pageNum).then(page => {
                // console.log('# Page ' + pageNum)

                const viewport = page.getViewport({ scale: 1.0 })
                // console.log('size = ', viewport.width + 'x' + viewport.height)

                const canvas = document.createElement('canvas');
                const context = canvas.getContext('2d');
                canvas.height = viewport.height;
                canvas.width = viewport.width;
                container.appendChild(canvas);
                page.render({ canvasContext: context, viewport})

                return page.getTextContent().then(content => {
                    const strings = content.items.map(item => {
                        // console.log('content item:', item)
                        return (item as any).str
                    })
                    // console.log('## Text Content:', strings.join(' '))
                    page.cleanup()
                })
            })
        }

        for(let i = 1; i <= numPages; i++) {
            lastPromise = lastPromise.then(loadPage.bind(null, i))
        }
        return lastPromise
    }).catch(err => {
        // console.log('err = ', err)
    })
}
</script>

说明:上述方法是将pdf全文全部加载完成,会存在加载慢的情况。

相关推荐
恋猫de小郭4 小时前
Flutter 多窗口重要优化合并,多窗口性能和实用性大幅提升
android·前端·flutter
StudyAndLife4 小时前
开源一个 API 开放平台门户前端:本地 npm run dev 就能逛接口文档
前端
广州华水科技4 小时前
GNSS变形监测一体机在大坝安全监测中的应用与优势分析
前端
hunteritself5 小时前
夯爆了!Qoder 狂肝 2 小时,293 个测试全绿,Credits 一分没扣
前端·人工智能·chrome·深度学习·机器学习
Hilaku5 小时前
为什么前端应该主动去学数据库?
前端·javascript·程序员
朱 欢 庆5 小时前
el-table 表格组件二次封装
javascript·vue.js·elementui
涛涛ing5 小时前
2026年,你终于可以在 `<textarea>` 里定位任意字符了
前端
三8445 小时前
TLS + Web API 安全 · 05 · JWT 与 OAuth2 攻防
前端·安全
zhongwei2286 小时前
vba将一个文件夹的内容复制到另外一个文件夹的函数,若存在则是否覆盖的参数。复制前检查源文件夹是否存在。若目标文件夹不存在,则新建
前端·vba
怕浪猫7 小时前
分享一个做视频的skill,这条白板视频,每一笔都是代码画的
前端·javascript·面试