前端pdf预览、pdfjs的使用

这篇具有很好参考价值的文章主要介绍了前端pdf预览、pdfjs的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

关于前端预览pdf,最简单的方式是使用window.open() 直接在浏览器的新窗口打开就好,浏览器本身也是提供了非常多的功能
pdf.js,学习,vue基础,前端,pdf,javascript
但是因为客户的某些需求,不能使用浏览器自身的功能。后来又使用了 https://github.com/gjTool/pdfh5,也挺好用的,操作比较简单。使用了一段时间吧,但是还是由于客户的某些需求,最终还是放弃了。

百度查询了一下可以使用 https://github.com/mozilla/pdf.js 来实现功能自定义。

pdfjs

官方文档、examples、API

https://mozilla.github.io/pdf.js/

安装

npm install pdfjs-dist

我的版本是3.0.279,不同版本可能有些不同。如果你是vue2加webpack的项目建议用2.6.347,因为我在老项目中用新版本遇到了各种各样的问题。

加载

<script setup lang="ts">
import { onMounted } from 'vue';
onMounted(async() => {
    const pdfjs = await import('pdfjs-dist/build/pdf.js');
    const pdfjsWorker = await import('pdfjs-dist/build/pdf.worker.entry');
    pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;
    console.log('pdf', pdfjs);
    // 加载pdf文件,本地文件会有跨域问题,使用线上文件
    const url = 'http://....2022-11-07/69c075093c9942dea7dcf86ac691ff9d.pdf';

    pdfjs.getDocument(url)
        .promise.then(pdfDoc => {
            console.log('内容:', pdfDoc, pdfDoc.numPages);
        });
});
</script>

pdf.js,学习,vue基础,前端,pdf,javascript

必须异步加载,不然会报错。解决方案来源于:https://github.com/mozilla/pdf.js/issues/10478

渲染

每个PDF页面都有自己的视口,它定义了以像素为单位的大小(72DPI)和初始旋转。默认情况下,视口缩放为PDF 的原始大小,但这可以通过修改视口来更改。创建视口时,还将创建一个初始变换矩阵,该矩阵考虑了所需的比例、旋转,并变换坐标系(PDF中的 0,0 点记录在左下角,而画布 0,0 在左上角)。

<template>
    <div>
        <div class="tool-bar">
            <div>{{ pdfParams.pageNumber }} / {{ pdfParams.total }}</div>
            <el-button type="primary" :disabled="pdfParams.pageNumber == pdfParams.total" @click="nextPage">下一页
            </el-button>
            <el-button type="primary" :disabled="pdfParams.pageNumber == 1" @click="prevPage">上一页</el-button>
            <el-button type="primary" @click="rotatePage">旋转</el-button>
            <el-button type="primary" :disabled="pdfParams.scale==5" @click="toBig">放大</el-button>
            <el-button type="primary" :disabled="pdfParams.scale==1" @click="toSmall">缩小</el-button>
        </div>
        <canvas id="pdf-render"></canvas>
    </div>
</template>

<script setup lang="ts">
import { onMounted, reactive } from 'vue';

const pdfParams = reactive({
    pageNumber: 1, // 当前页
    total: 0, // 总页数
    scale: 1, // 缩放
    rotate: 0 // 旋转角度
});

// 不要定义为ref或reactive格式,就定义为普通的变量
let pdfDoc = null;

onMounted(async() => {
    const pdfjs = await import('pdfjs-dist/build/pdf.js');
    const pdfjsWorker = await import('pdfjs-dist/build/pdf.worker.entry');
    pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;
    // 加载pdf文件,本地文件会有跨域问题,下面这个地址是不对的,自行更换
    const url = 'http://y2/2022-11-07/69c075093c9942dea7dcf86ac691ff9d.pdf';

    pdfjs.getDocument(url)
        .promise.then(doc => {
            pdfDoc = doc;
            console.log('内容:', doc, doc.numPages);
            pdfParams.total = doc.numPages;
            getPdfPage(1);
        });
});

// 加载pdf的某一页
const getPdfPage = (number) => {
    pdfDoc.getPage(number).then((page) => {
        console.log('page:', page);
        // 获取视图,并设置缩放
        const viewport = page.getViewport(
            {
                scale: pdfParams.scale, // 缩放
                rotation: pdfParams.rotate // 旋转
            });
        console.log('视图:', viewport);
        const outputScale = window.devicePixelRatio || 1;
        // 获取canvas
        const canvas = document.getElementById('pdf-render');
        const context = canvas.getContext('2d');
        // 设置canvas的宽高
        canvas.width = Math.floor(viewport.width * outputScale);
        canvas.height = Math.floor(viewport.height * outputScale);
        canvas.style.width = Math.floor(viewport.width) + 'px';
        canvas.style.height = Math.floor(viewport.height) + 'px';
        // 渲染pdf
        var renderContext = {
            canvasContext: context,
            viewport: viewport
        };
        page.render(renderContext);
    });
};
// 前一页
const prevPage = () => {
    if (pdfParams.pageNumber > 1) {
        pdfParams.pageNumber -= 1;
    } else {
        pdfParams.pageNumber = 1;
    }
    // 重新渲染
    getPdfPage(pdfParams.pageNumber);
};
// 下一页
const nextPage = () => {
    if (pdfParams.pageNumber < pdfParams.total) {
        pdfParams.pageNumber += 1;
    } else {
        pdfParams.pageNumber = pdfParams.total;
    }
    // 重新渲染
    getPdfPage(pdfParams.pageNumber);
};

// 旋转
const rotatePage = () => {
    pdfParams.rotate += 90;
    // 重新渲染
    getPdfPage(pdfParams.pageNumber);
};
// 放大
const toBig = () => {
    if (pdfParams.scale < 5) {
        pdfParams.scale += 0.5;
    } else {
        pdfParams.scale = 5;
    }
    // 重新渲染
    getPdfPage(pdfParams.pageNumber);
};
// 缩小
const toSmall = () => {
    if (pdfParams.scale > 1) {
        pdfParams.scale -= 0.5;
    } else {
        pdfParams.scale = 1;
    }
    // 重新渲染
    getPdfPage(pdfParams.pageNumber);
};
</script>

<style lang="scss" scoped>
.tool-bar {
    position: fixed;
    z-index: 200;
    left: 200px;
}
</style>

效果
pdf.js,学习,vue基础,前端,pdf,javascript

补充

注意:

可以修改的属性如下图:
pdf.js,学习,vue基础,前端,pdf,javascript
1、其他属性都比较好理解,transformviewBox 暂时没有弄明白,不建议修改
2、旋转属性:rotation ,如果使用pdfjs提供的方式进行旋转的话要注意旋转的角度必须是90的整数倍。
3、放大的最大倍数是5被

下载
关于下载的功能我没有写,有需要的可以使用FileSaver.js,基本使用见我的这篇文章:FileSaver.js的简单使用

打印
打印功能有需要的话可以看我的这篇文章:前端使用print.js实现打印文章来源地址https://www.toymoban.com/news/detail-518141.html

到了这里,关于前端pdf预览、pdfjs的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nuxt3项目使用pdfjs-dist预览pdf

    使用的包的源代码是 pdfjs - npm 但是我们实际上项目中使用的是pdfjs打包后的dist文件,也就是pdfjs-dist - npm 所以我们需要使用这个命令 我们可以克隆pdfjs这个包来看源代码,里面有使用的例子,也可以根据源代码自己打包生成你想要的版本的pdfjs-dist,官方文档强调了对于新旧

    2024年02月09日
    浏览(23)
  • 前端(vue)js在线预览PDF、Word、Excel、ppt等office文件

    可选参数 pdf=true,word文档尝试以pdf方式显示,默认false watermark=水印文本,显示文本水印;“img:”+图片url表示图片水印,如:img:https://view.xdocin.com/demo/wm.png saveable=true,是否允许保存源文件,默认false printable=false,是否允许打印,默认true ©able=false,是否允许选择复制内容,

    2024年02月13日
    浏览(55)
  • vue或uniapp使用pdf.js预览

    一、先下载稳定版的pdf.js,可以去官网下载  官网下载地址  或  pdf.js包下载(已配置好,无需修改) 二、下载好的pdf.js文件放在public下静态文件里, uniapp是放在 static下静态文件里 三、使用方式    1. vue项目 注意路径  :src=\\\"`static/pdfjs-1.9/web/viewer.html?file=你的pdf路径  2.

    2024年02月13日
    浏览(28)
  • Vue中使用pdf.js实现在线预览pdf文件流

    以下是在Vue中使用pdf.js实现在线预览pdf文件流的步骤: 在需要使用的组件中,使用以下代码引入pdf.js: 使用pdf.js的 getDocument() 方法加载pdf文件流。可以将文件流作为Blob对象传递给该方法。例如,可以使用axios从服务器获取pdf文件流: 在 loadPdf() 方法中,使用 getDocument() 方法

    2024年02月09日
    浏览(47)
  • JS将PDF转图片,pdfjs的使用

    Hi I’m Shendi 最近做转换工具,需要将pdf转图片,这里记录下来 JS将PDF转图片,pdfjs的使用 A general-purpose, web standards-based platform for parsing and rendering PDFs. 一个通用的、基于web标准的平台,用于解析和呈现PDF。 简单讲就是用来展示pdf的 https://mozilla.github.io/pdf.js/examples/ 这个api文档

    2024年02月11日
    浏览(32)
  • vue2 使用pdf.js 实现pdf预览,并可复制文本

            需求:pdf预览,并且可以选中pdf的内容进行复制。                 在ruoyi的vue前端项目中用到,参考了网上不少文章,因为大部分没给具体的pdf.js版本,导致运行过程中报各种api 错误,经过尝试以下版本可用,故记录一下:         安装依赖:         vue 页面

    2024年01月19日
    浏览(45)
  • pdfjs解决ie浏览器预览pdf问题

    pdfjs是一个js库,可以将pdf文件用canvas重新绘制,从而无需借助pdf读取插件就可以直接预览。 目前chrome内核的浏览器已内置pdf读取插件,但ie浏览器还没有。而我们最近在做的一个项目使用对象是医院,使用的浏览器竟然还是ie。所以我们只能把项目用js重写(当然也可以用j

    2024年02月07日
    浏览(34)
  • 前端使用vue-pdf、pdf-lib、canvas 给PDF文件添加水印,并预览与下载

    原理就是给显示pdf 的容器增加一层水印遮罩层 下载: 通过url获取pdf文件的arrarybuffer文件流 将arraybuffer数据转成pdf文档 添加水印字体(内置/自定义) 为每页pdf添加文字水印 保存pdf文件的unit64Arrary文件流 预览: 创建canvas容器(用于显示水印文字) 创建水印canvas 将水印canv

    2024年01月24日
    浏览(50)
  • vue3 电子书 pdf转图片 pdf实现翻页效果 pdfjs-dist、turn.js电子书翻页效果

    下载 turn.js 这里使用的是  turn4  ,需要下载到本地引入,通过npm下载会报错可以到官网下载,也可以直接在本博客下,已经上传到博客 导入文件之前先创建   vue.config.js 适配一下jquery ,创建好文件以后,把以下代码复制进去 回到vue页面,导入以下文件 参考博客:GitHub -

    2024年02月16日
    浏览(32)
  • 前端实现PDF预览【vue】

    前言:项目中提出这样一个需求,在移动端H5页面预览pdf功能。pdf文件由后端返回的一个地址,前端实现展示预览pdf文件 在此仅提供两种方法: 一、使用iframe标签通过src属性直接展示pdf文件         坑点:兼容比较差,PC端能正常展示,移动端会出现空白的问题 二、使用第

    2024年01月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包