解决Vue页面中加载PDF,文字不显示的问题

在Vue3项目中,使用pdfjs-dist库预览PDF时,由于缺少字体库可能导致文字不显示。解决方案是将pdfjs-dist的cmaps文件夹复制到src/assets中,并在代码中设置cMapUrl。文章提供了具体的代码示例,包括在onMounted钩子中加载PDF和渲染每一页到canvas。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地址背景:最近在做的vue3项目时,要求在页面中展示pdf,但是我在预览时pdf中的文字是空的。

原因:pdf.js中需要一些字体库的协助,pdf中部分字体如果没有字体库将无法在pdf.js中显示,字体库存放在cmaps文件夹下。

不知道如何在vue3中显示pdf ?请浏览上一篇文章:Vue3预览并打印PDF的两种方法_vue3预览pdf_种①个月亮的博客-优快云博客

下面分别介绍在Vue2和Vue3中如何解决:

一、vue2

二、vue3

使用pdfjs-dist,canvas渲染

安装pdfjs-dist依赖后,在node_modules/pdfjs-dist文件夹下会有一个cmaps文件夹,此文件夹即字体库,将此文件夹拷贝到src/assets中,在页面中使用,如下代码,文字就可正常显示了。

//pdf预览显示
<div>
    <div id="printDom" ref="printDom">
        <div v-for="item in state.numPages" :key="item">
            <canvas :id="`pdfCanvas-${item}`" :ref="`pdfCanvas-${item}`" />
        </div>
    </div>
</div>
 
<script setup>
    import * as pdfjsLib from 'pdfjs-dist' //引入pdfjs-dist
    import Print from '@/assets/js/print'  //引入print.js
    const { proxy } = getCurrentInstance()
    const state = reactive({
        source: '', // 预览pdf文件地址
        pageNum: 0, // 当前页面
        scale: 1, // 缩放比例
        numPages: 0, // 总页数
        pdfCtx: null // pdf对象
    })
    onMounted(()=>{
        pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdf.worker.js'
        const loadingTask = pdfjsLib.getDocument({
            url: pdfUrl,  //这里的pdfUrl即pdf的链接地址
            cMapUrl: '../../../../static/cmaps/',
            cMapPacked: true
        })
        loadingTask.promise.then(pdf => {
            // console.log('页数', pdf.numPages)
            state.numPages = pdf.numPages
            state.pdfCtx = pdf
            nextTick(() => {
                renderPdf()
            })
        })
    })
    const renderPdf = (num = 1) => {
        state.pdfCtx.getPage(num).then(page => {
            const canvas = document.getElementById(`pdfCanvas-${num}`)
            const ctx = canvas.getContext('2d')
            const viewport = page.getViewport(1.6)
            canvas.height = viewport.height
            canvas.width = viewport.width
            page.render({
                canvasContext: ctx,
                viewport: viewport
            })
            if (num < state.numPages) {
                renderPdf(num + 1)
            }
        })
    }
    //打印
    function print(){
        Print(proxy.$refs['printDom'])
    }
</script>

### VuePDF 预览表格显示解决方案 在处理 Vue 项目中的 PDF 文件预览时,如果遇到表格内容无法正常显示的情况,通常是因为默认设置未能正确渲染复杂的布局结构。针对此问题,可以通过调整样式以及优化使用的库来改善。 对于 `vue-pdf` 库,在加载 PDF 文档前应确保其配置能够适应同类型的文档格式和复杂度较高的页面设计[^2]。当发现表格内的数据未被完全展示或丢失部分视觉元素(如边框),可尝试以下方法: #### 方法一:自定义 CSS 调整样式 为了使表格能够在 PDF 渲染过程中保持原有外观,可以在全局或局部范围内引入特定于 `.el-table` 的样式规则,这些规则有助于修正常见的显示错误,比如表头错位、单元格宽度异常等问题。具体做法如下所示[^4]: ```css ::v-deep table { table-layout: auto; } ::v-deep .el-table__header-wrapper .el-table__header, ::v-deep .el-table__body-wrapper .el-table__body { width: 100% !important; } ::v-deep .el-table th>.cell, ::v-deep .el-table td>.cell{ word-break: break-all; overflow-wrap:break-word ; } ``` 以上代码片段主要作用在于确保表格各部分内容按照预期比例分配空间,并允许较长的文字自动换行而是超出边界造成混乱。 #### 方法二:升级依赖版本 有时旧版插件可能存在某些已知缺陷影响到特定场景下的表现形式;因此建议定期查看官方仓库是否有新发布的稳定版本发布,及时更新至最新状态可能会带来更好的兼容性和性能提升。 #### 方法三:选用更强大的第三方工具 考虑到原生方式难以满足所有需求的情况下,考虑采用更为专业的第三方服务提供商所提供的 API 或 SDK 来替代现有的实现逻辑失为一种明智的选择。例如使用 Mozilla 开源项目 PDF.js ,该库提供了更加丰富的功能集和支持范围广泛的特性,包括但限于高质量图像缩放、多语言支持等[^3]。 通过上述措施的应用,应当能在很大程度上缓解乃至彻底解决问题所在——即保证 PDF 内嵌表格及其他重要组成部分均能得到清晰无误地呈现给最终用户。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值