利用patch-package补丁,解决H5预览PDF时电子签章不显示问题

server/2024/10/22 16:33:02/

利用patch-package补丁,解决H5预览PDF电子签章不显示问题

一、问题描述

在生产环境中,遇到了一个紧急的技术问题:用户在移动端H5页面上查看电子票时,PDF文件预览功能正常,但其中的电子签章未能正常显示。这一问题直接影响了用户验证电子票真实性的体验,需要迅速解决。
file

二、问题排查与定位

经过仔细排查,确定了问题的根源:后端返回的PDF文件为Base64格式,前端使用pdf.js-dist库进行渲染时,由于库作者的某些原因,电子签章功能被默认屏蔽。在本地开发环境中,可以通过直接修改源码来解除这一屏蔽,但这种方法无法直接应用到生产环境,因为每次重新安装依赖时,修改的内容都会被覆盖。

三、解决方案设计与实施

为了在生产环境中修复这一问题,同时确保未来更新依赖时修改不会被覆盖,采取以下策略解决此问题:

1、引入patch-package工具:通过npm安装patch-package,这是一个允许开发者在应用npm install命令后,对node_modules中的代码进行补丁修改的npm钩子。使用它,可以安全地对pdf.js-dist库进行必要的修改,并确保这些修改在后续依赖更新时仍能保持。

npm i patch-package // 安装补丁工具

2、配置package.json:在项目的package.json文件中,添加了"postinstall"脚本,用于在每次安装依赖后自动运行patch-package命令,确保补丁被正确应用。

3、创建补丁文件:使用npx patch-package pdfjs-dist命令,手动为pdfjs-dist库创建了补丁文件。执行此命令后,项目根目录下自动生成了一个patches文件夹,其中包含了一个针对pdfjs-dist库的补丁文件,该文件详细记录了在node_modules中对pdf.js-dist库所做的修改。

npx patch-package pdfjs-dist // 在修复node_modules的源码后执行改指令

四、代码实现以及问题截图

<template>
<!-- 查看电子票 -->
<div class="nucleicAcidTestMain"><e-headers class="nucleicAcidTestNav" Transparency>查看电子票</e-headers><div class="pdfList" /><div class="tips">长按可下载电子票</div></div>
</template>
<script>import PDFJS from 'pdfjs-dist';export default {mounted() {this.pdfBase64(url); //url为base64格式的pdf},methods: {// 解码pdfBase64(url) {let base64 = url.replace(new RegExp('data:application/pdf;base64,', 'g'), '').replace(/[\n\r]/g, '');let decodedBase64 = atob(base64); //使用浏览器自带的方法解码this.pdfToCanvas({ data: decodedBase64 });},// pdf转canvas图片async pdfToCanvas(url) {this.canDown = true;let pdfList = document.querySelector('.pdfList');let pdf = await PDFJS.getDocument(url); //返回一个pdf对象let pages = pdf.numPages; //声明一个pages变量等于当前pdf文件的页数for (let i = 1; i <= pages; i++) {//循环页数let canvas = document.createElement('canvas');let page = await pdf.getPage(i); //调用getPage方法传入当前循环的页数,返回一个page对象let scale = 5; //缩放倍数,1表示原始大小(倍数越大越清晰)let viewport = page.getViewport(scale);let context = canvas.getContext('2d'); //创建绘制canvas的对象canvas.height = viewport.height; //定义canvas高和宽canvas.width = viewport.width;canvas.style.width = '100%';let renderContext = { canvasContext: context, viewport: viewport };await page.render(renderContext);const imgUrl = canvas.toDataURL('image/png', 1.0); // canvas转为图片,实现下载const img = document.createElement('img');img.src = imgUrl;img.style.width = '100%';pdfList.appendChild(img);}},returnPage() {this.$router.go(-1);}}};
</script>

file

五、总结

成功解决了移动端H5电子票PDF预览中的电子签章不显示问题。通过引入patch-package工具,可以在生产环境中有效地对第三方库进行补丁修改,但是此种补丁方法要求对应依赖版本,也就是说项目所对应的PDFJS库版本更改后,很可能会导致补丁不生效或者需要重新生成补丁。所有一般采用固定版本号对应补丁。
file
需求考虑项目是否强依赖于库更新。

本文由博客一文多发平台 OpenWrite 发布!


http://www.ppmy.cn/server/65245.html

相关文章

【safari】react在safari浏览器中,遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。如何解决

在safari浏览器中&#xff0c;可能会遇到异步时间差的问题&#xff0c;导致状态没有及时更新到state&#xff0c;引起传参错误。 PS&#xff1a;由于useState是一个普通的函数&#xff0c; 定义为() > void;因此此处不能用await/async替代setTimeout&#xff0c;只能用在返…

前端-04-VScode敲击键盘有键入音效,怎么关闭

目录 问题解决办法 问题 今天正在VScode敲项目&#xff0c;不知道是按了什么快捷键还是什么的&#xff0c;敲击键盘有声音&#xff0c;超级烦人啊&#xff01;&#xff01;于是我上网查了一下&#xff0c;应该是开启了VScode的键入音效&#xff0c;下面是关闭键入音效的办法。…

react 快速入门思维导图

在掌握了react中一下的几个步骤和语法&#xff0c;基本上就可以熟练的使用react了。 1、组件的使用。react创建组件主要是类组件和函数式组件&#xff0c;类组件有生命周期&#xff0c;而函数式组件没有。 2、jsx语法。react主要使用jsx语法&#xff0c;需要使用babel和webpa…

鸿蒙笔记--动画

这一节主要了解一下鸿蒙的动画&#xff0c;动画的引入主要是为了提升用户体验、增加用户反馈和互动感、引导用户操作以及缓解等待带来的不适感。 属性动画: Index.ets Entry Component struct Index {StatewidthSize: number 100StateheightSize: number 40build() {Column…

JVM--双亲委派模型

1.双亲委派模型 定义&#xff1a; 站在Java虚拟机的角度来看&#xff0c;只存在两种不同的类加载器&#xff1a;一种是启动类加载器&#xff08;Bootstrap ClassLoader&#xff09;&#xff0c;这个类加载器使用C语言实现&#xff0c;是虚拟机自身的一部分&#xff1b;另外一种…

Harmony 状态管理 @Local 和 @Param

Harmony 状态管理 Local 和 Param Local 背景 Local 是harmony应用开发中的v2版本中 对标**State**的状态管理修饰器&#xff0c;它解决了 State 对状态变量更改的检测混乱的问题&#xff1a; State 修饰的状态变量 可以是组件内部自己定义的State 修饰的状态 也可以由外部父…

JDK新特性(Lambda表达式,Stream流)

Lambda表达式&#xff1a; Lambda 表达式背后的思想是函数式编程&#xff08;Functional Programming&#xff09;思想。在传统的面向对象编程中&#xff0c;程序主要由对象和对象之间的交互&#xff08;方法调用&#xff09;构成&#xff1b;而在函数式编程中&#xff0c;重点…

河南萌新联赛2024第(一)场:河南农业大学 A D F G H I K

A 造数 题目描述&#xff1a; 给定一个整数 &#x1d45b; &#xff0c;你可以进行以下三种操作 操作1&#xff1a; 1 操作2&#xff1b; 2 操作3&#xff1a; 2 问最少需要多少次操作可以将 0 转为为 &#x1d45b; 。 解题思路 操作1&#xff0c;2&#xff0c;3。操作 3 …