pdfjs解决ie浏览器预览pdf问题

news2024/11/25 2:40:15

pdfjs是一个js库,可以将pdf文件用canvas重新绘制,从而无需借助pdf读取插件就可以直接预览。
目前chrome内核的浏览器已内置pdf读取插件,但ie浏览器还没有。而我们最近在做的一个项目使用对象是医院,使用的浏览器竟然还是ie。所以我们只能把项目用js重写(当然也可以用jQuery的)。
首先模拟ie浏览器就是个挑战。长期做B端项目被惯坏了,早就忘记还有ie这么个天使了。官网已经不提供ie的下载渠道,搜索了一圈,发现用edge模拟是一个比较好的选择。
在windows11中打开ie浏览器的步骤是:

  1. 首先,按 Win + R 打开运行窗口
  2. 接下来,在运行命令框中输入 inetcpl.cpl
  3. 单击 确定 进入 Internet 属性窗口
  4. 选择 程序 选项卡,点击 管理加载项 按钮
  5. 然后,点击窗口底部 了解有关工具栏和扩展的详细信息
    这样就打开了可爱的ie浏览器。

原生js获取xhr的主体方法

function Request(){

    this.httpRequest = function(obj,successfun, errFun){
        var xmlHttp = null;
        //创建 XMLHttpRequest 对象,老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
        if(window.XMLHttpRequest){
            //code for all new browsers()
            xmlHttp = new XMLHttpRequest;
        }else if(window.ActiveXObject){
            //code for IE5 and IE6
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        //判断是否支持请求
        if(xmlHttp == null){
            alert("浏览器不支持xmlHttp");
            return;
        }
        //请求方式, 转换为大写
        var httpMethod = (obj.method || "Get").toUpperCase();
        //数据类型
        var httpDataType = obj.dataType || 'json';
        //url
        var httpUrl = obj.url;
        //异步请求
        var async = true;
        //post请求时参数处理
        if(httpMethod == "POST"){
            //请求体中的参数 post请求参数格式为:param1=test&param2=test2
            var data = obj.data || {};
            var requestData = '';
            for(var key in data){
                requestData = requestData + key + "=" + data[key] + "&";
            }
            if(requestData == ''){
                requestData = '';
            }else{
                requestData = requestData.substring(0, requestData.length - 1);
            }
        }
        //请求接口
        if(httpMethod == 'GET'){
            xmlHttp.open("GET", httpUrl, async);
            xmlHttp.send(null);
        }else if(httpMethod == "POST"){
            xmlHttp.open("POST", httpUrl, async);
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xmlHttp.send(requestData);
        }
        
        //onreadystatechange 是一个事件句柄。它的值 (state_Change) 是一个函数的名称,当 XMLHttpRequest 对象的状态发生改变时,会触发此函数。状态从 0 (uninitialized) 到 4 (complete) 进行变化。仅在状态为 4 时,我们才执行代码
        xmlHttp.onreadystatechange = function(){
            //complete
            if(xmlHttp.readyState == 4){
            	// 此处用了promise替代了请求成功后的回调
                if(xmlHttp.status == 200){
                    var res = JSON.parse(xmlHttp.responseText);
                    // var res = xmlHttp.responseText;
                    if (res && res.code == '200') {
                        //请求成功执行的回调函数
                        typeof successfun === 'function' &&
                        successfun(res);
                    } else {
                        //请求失败的回调函数
                        typeof errFun === 'function' &&
                        errFun(res);
                    }
                    
                } else {
                    var msg = new Error('出错了')
                	//请求失败的回调函数
                    typeof errFun === 'function' &&
                    errFun(msg);
                }
            }
        }
    }
}



var $request = new Request()

数据请求的问题完成了。但是现在pdf文件没有出现在期待的位置,只是在底部出现了一个下载文件的请求提示。查了下,原来是ie没有内置pdf阅读器,所以无法预览,浏览器将pdf文件识别为需要下载。

那么问题来了,解决方法有两个:

1.下载Adobe pdf-reader。
下载地址:https://www.adobe.com/cn/acrobat/pdf-reader.html,还需要再ie浏览器中启用,在管理加载项中修改(管理加载项打开方法见上面那个步骤)
在这里插入图片描述
但这个方法也有一个问题,下载插件对用户是有门槛的,用户很可能不愿意这么麻烦。

2.用pdfjs处理pdf文件。
这样用户不需要额外做任何操作。但pdfjs兼容性有限,只能兼容到ie9,更低版本的浏览器就不行了。
综合评估后还是决定用pdfjs处理。如果还有更低版本的就继续下载pdf阅读器。
高版本的pdfjs已放弃对ie的兼容,需要下载旧版本。在官网选择tags,按照对应指示打包。注意打包旧版本时需要保证node在10以下(我本地的node是16.16.0,怪不得昨天一直报错到崩溃)。
当然也可以找别人已经打好的包,参考地址。
要注意把viewer.js中的defaultUrl清空(这个变量的名称可能不同版本不一样,我当时的变量名是DEFAULT_URL,DEFAULT_URL = ‘compressed.tracemonkey-pldi-09.pdf’)。不清空会报错,报“Missing PDF file”。

再把下载下来的文件地址改写为‘./pdfjs/web/viewer.html?file=’+realUrl。

这样先在chrome发现是正常展示的,没有问题,说明方法写地是对的。但是用ie浏览器打开就是一片黑。昨天崩溃了一天,换了很多个pdfjs版本,今天终于意识到应该看看报了什么错。发现控制台报的错是“附加页针对的是文档模式7,部分控制台api和功能可能无法使用”。针对这个报错,一查发现是因为浏览器设置的默认文档模式是7,导致虽然我的浏览器是ie11,但实际是按照ie7来解析网页,而我的网页是不兼容ie7地,这可不就会报错嘛。
查看了相关文章,发现了应该在头文件加上两句声明。

// 如果安装了 Google Chrome Frame (谷歌浏览器 內嵌框架), 则使用 谷歌浏览器 内核模式,否则使用 最新的 IE 模式(浏览器是哪个版本就用哪个ie模式)
<meta http-equiv="X-UA-Compatible" content="IE=edge chrome=1">
// 双核浏览器兼容,使用 Chromium 内核(极速模式)
<meta name="renderer" content="webkit"/>

自己的html文件和pdfjs的viewer.html都要加上。
还发现了一个宝贝,meta标签声明,可以强制在浏览器中用低版本模式打开网页。

<meta http-equiv="X-UA-Compatible" content="IE=7" /> 

分别变更content中的数字,可以在ie11中分别模拟对应ie版本中的兼容情况。啊啊啊,妈妈再也不用担心我怎样切换ie版本了。
IE模式参考文章。

好了,至此,pdf预览兼容的IE的工作总算完成了。芜湖,为自己鼓掌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

@BeforeEach与@AfterEach

BeforeEach 修饰在方法上&#xff0c;在每一个测试方法&#xff08;所有Test、RepeatedTest、ParameterizedTest或者TestFactory注解的方法&#xff09;之前执行一次。 例如&#xff1a;一个测试类有2个测试方法testA()和testB()&#xff0c;还有一个BeforeEach的方法&#x…

安科瑞ADL400产品功能及参数说明,适用于5G基站计量使用

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 “十四五”以来&#xff0c;重庆新型数字基础设施建设取得明显成效&#xff0c;截至今年6月底&#xff0c;每万人拥有5G基站数24个&#xff0c;5G发展保持在全国第一梯队。 新型数字基础设施包括5G网络、千兆光网、数据中心、工业互联网、…

Mysql高级——存储引擎

存储引擎 1). 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念&#xff0c;为通过认证安全接入的客户端提…

潍坊学院图书馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

潍坊学院图书馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

教师必看,如何巧妙告知学生家长成绩分数?

亲爱的教师们&#xff01;今天博主要跟你们分享一个巧妙的方法&#xff0c;帮助你们与学生家长发布成绩分数时让他们更好的了解孩子的学习情况。是不是觉得很有用&#xff1f;那就跟我一起来看看吧。 我们可以借助一个神奇的工具——易查分。它能把成绩分数以在线查询的形式呈现…

AD22使用笔记+积累库

一、前言 使用AD9习惯了&#xff0c;但是需求逐渐上来了就不够用了&#xff0c;好多快捷的新功能要新版本软件才能用&#xff0c;所以升级使用AD22 目录 1.添加层之后中间层无法布线 2.新增快捷方式CtrlW布线&#xff0c;不用点图标了 二、环境 AD22 三、正文 1.添加层之…

软件设计模式(七):适配器、桥梁、命令、原型模式

前言 这是软件设计模式系列的最后一篇文章&#xff0c;对于23种设计模式荔枝梳理了比较重要的几种&#xff0c;剩下的在实际开发中用的也比较少哈哈哈。在这篇文章中荔枝主要梳理软件设计模式中的适配器模式、桥梁模式、命令模式和原型模式的相关知识。希望能帮助到有需要的小伙…

选择器进阶与表单表格

华子目录 选择器并集选择器后代选择器子代选择器伪类选择器伪元素选择器结构选择器属性选择器相邻选择器 表单&#xff08;form&#xff09;label标签 表格&#xff08;table标签&#xff09; 选择器 下面是我们之前学习过的选择器 *{}&#xff1a;通配符选择器&#xff0c;选…

JDK8新特性--函数式接口--(Consumer的概念理解,模拟练习,企业实战)全流程彻底搞懂

背景&#xff0c;起因是因为在项目开发过程中&#xff0c;发现了一处代码的写法觉得很新奇看不懂&#xff0c;了解后发现是用到了函数式接口的知识。特此学习记录&#xff0c;整体过程梳理在本文。如果你不满足就会写个CURD&#xff0c;业务代码只会new来new去&#xff0c;代码…

Spring 中三种 BeanName 生成器!

无论我们是通过 XML 文件&#xff0c;还是 Java 代码&#xff0c;亦或是包扫描的方式去注册 Bean&#xff0c;都可以不设置 BeanName&#xff0c;而 Spring 均会为之提供默认的 beanName&#xff0c;今天我们就来看看 Spring 中三种处理不同情况的 beanName 生成器。 1. BeanN…

零基础Linux_4(权限和初识操作系统)具体用户分类+rwx+umask+粘滞位

目录 1. 操作系统初识 1.1 操作系统的基本概念 1.2 操作系统的意义 1.3 指令操作的意义 2. shell命令及运行原理 2.1 shell的概念 2.2 shell 的意义 3. Linux权限 3.1 Linux 具体用户的分类 3.2 用户管理 adduser 新用户名(添加普通用户) 用户登陆 - SSH 用户名 u…

视频号挂公众号链接没完全堵死,还能加,最新方法教程,玩私域流量的福音来了

视频号挂公众号链接 视频号挂公众号链接&#xff0c;不限号&#xff0c;不限次数&#xff0c;不需要绑定公众号&#xff0c;不需要10000阅读量 视频号评论区能挂链接&#xff0c;对视频号做公转私的人来说&#xff0c;可以说是大惊喜&#xff0c;对公司来讲放上自己的推广链接…

前缀和实例1 (【模板】前缀和 )

题目&#xff1a; 算法原理&#xff1a; 前缀和算法能快速求出某一个区间内所有元素的和 1 预处理出来一个前缀和数组dp dp[i] dp[i-1]v[i] (v数组由输入的数字组成&#xff09;&#xff0c;即区间[1,i]的所有元素的和区间[1,i-1]所有元素的和v数组中i下标的元素 2 使用前缀…

获取1688店铺详情 API接口(获取卖家昵称、店铺类型、公司信息、店铺标题、店铺主页)

seller_info-获得店铺详情 1688.seller_info进入测试 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,it…

计算机竞赛 大数据商城人流数据分析与可视化 - python 大数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

探索移动应用的自动化测试:如何做出明智的工具选择

引言 随着移动应用的日益普及&#xff0c;其在日常生活和工作中的作用也越来越大。为了确保应用的稳定性和用户体验&#xff0c;自动化测试已经成为了开发流程中不可或缺的一部分。本文将深入探讨如何为移动应用选择合适的自动化测试工具&#xff0c;以及这些工具背后的技术原…

【广州华锐互动】云智慧工厂数字孪生:打造高效、灵活的智能制造新模式

随着工业4.0的到来&#xff0c;数字孪生技术逐渐成为实现工业生产智能化升级的关键。云智慧工厂数字孪生利用先进的数字化技术&#xff0c;创建物理实体的虚拟模型&#xff0c;实现对生产过程的实时监控、优化与管理。 云智慧工厂数字孪生是指通过数字孪生技术&#xff0c;构建…

考研英语笔记:程序员是否勤奋就看他的英语好不好

一位大佬朋友圈写道&#xff1a;看程序员是否勤奋就看他的英语好不好&#xff0c;智商高不高就看他算法好不好。 这句话我当时看到了很触动&#xff0c;默默的记在了心底。 对我来说&#xff0c;算法就免了&#xff0c;但学英语我一直在坚持。我不敢说我是优秀的程序员&#xf…

如何在三星手机上截屏?每一款三星手机的每一种方法,包括S23

无论你是将截图作为保存图片、消息或信息的快速方式&#xff0c;还是作为演示像这篇文章这样有用的操作方法的方式&#xff0c;能够截图都会非常有用。 但并不是所有的手机都以相同的方式进行屏幕截图。事实上&#xff0c;并不是所有的三星手机都能做到这一点。例如&#xff0…

MySql安装包配置

电脑重配过多次&#xff0c;此为mysql安装记录贴&#xff0c;方便查阅 从官网下载的安装包进行本地配置 下载地址 解压下载下来的zip压缩包 解压出来的文件中新增配置my.ini文件 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirD:\\software\\package\\M…