需求:做项目联调接口时,发现知识库展示pdf未果,经与后端人员沟通,发现以下问题:

1.接口返回的是utf-8数据流,但是前端调用的是base64解析方法;

导致功能有误;

方案一:将后端返回的utf-8数据流改为经base64解析的数据流。    ========新思路:尝试缓加载,但是未能实现。

测试结果:安卓系统可以正常使用,但是ios当时存在闪退的问题,且base64若处理一个2M的文件,解析后体积将近为4M,对小文件还是用,大文件很容易造成系统运行内存不够,跳出App。

方案二:用iframe静态展示base64文件流。

测试结果:ios可正常使用,但是安卓系统对iframe存在兼容性问题。

<iframe  ng-src="{{pdfPath}}"  style="width:100%;height:800px;"> </iframe>

方案三:将后端数据流退回到utf-8,修改解析后端返回数据流的方法。------解决问题。

     <div style="width: 100%;"  ng-style="{height: screenHeight-160 + 'px'}">
<div id="pdf-containerTF" style="width: 100%; height: 100%;border-radius: 10px; box-shadow: 0 0 10px #3268d2; background: #ffffff;padding: 0 5px;margin-top:5px;">
<ion-scroll delegate-handle="pdfScroll" zooming="true" direction="xy" style="width: 100%; height: 100%;" scrollbar-y="false" scrollbar-x="false" min-zoom="1">
<div id="pdf-popTF" style="width: 100%; height: 100%;border-radius: 10px; background: #ffffff;position: absolute;padding: 0px;">
</div>
</ion-scroll>
</div>
</div>
 $scope.getFileData=function () {
var params={
fileId:$scope.fileId
}
$ionicLoading.show({});
yxxPdfHttp.post(QUERY_SERVICE_FILE_DATA,params, function (data) {
if(data){
$ionicLoading.hide({});
$scope.fileDataObj.fileTitle=$scope.fileTitle;
showPdfFileM(data);
$rootScope.isRefresh = true;
}else{
$ionicLoading.hide({});
alert({type: '', title: '温馨提示', msg: "请求发生异常"});
}
}, function (data) {
$ionicLoading.hide({});
alert({type:'',title: '错误',msg:'服务器繁忙,请稍后重试!'});
});
}

  

封装专用于请求数据流的ajax请求
//封装接收pdf的ajax
.factory('yxxPdfHttp', ["$http", "$rootScope", "$timeout", function ($http, $rootScope, $timeout) {
var url = "";
return {
post: function (method, params, success, error, config) {
// console.log(params)
var head = {
accepts: '*/*',
Authorization: 'Bearer ' + $rootScope.Authorization
};
if (method == QUERY_LOGIN_TOKEN) {
head = {
accepts: '*/*'
};
}
var asflag = true;
if (config) {
if ('async' in config) {
asflag = config.async;
}
}
$.ajax({
type: "post",
url: serverPath + method,
contentType: 'application/json',
// responseType:'multipart/form-data',
mimeType: 'text/plain; charset=x-user-defined',
dataType: 'text',
headers: head,
timeout: 180000,
async: asflag,
data: JSON.stringify(params),
success: function (data, status, xhr) {
// success(JSON.parse(data));
success(data);
// console.log(data);
},
complete: function (request, textStatus) {
if (textStatus == 'timeout') {
alert({ type: 'error', title: '温馨提示', msg: "请求超时" });
$timeout(function () { $rootScope.$apply() })
}
},
error: function (request, data, exception) {
error(request.responseJSON);
console.log(request);
console.log(data);
if (request.readyState == 0 && request.status == 0) {
console.log(request.readyState);
console.log(request.status);
} else if (request && request.status != 200) {
//在非登录页token 失效调原生方法回到登录页
if (request.status == 401) {
if (window.webkit) {
window.webkit.messageHandlers.authfailed.postMessage({
params: {
code: false
}
})
} else {
nativeObj.backLogin("88");
}
} else {
var message = '';
if (request.responseJSON) {
message = request.responseJSON.message;
} else if (request.responseText) {
message = JSON.parse(request.responseText).message;
} else {
message = '请求异常';
}
alert({ type: '', title: request.status + ':' + method + ':' + request.getResponseHeader('request_id'), msg: message });
}
} else {
alert({ type: 'error', title: '错误', msg: "系统异常请联系管理员。" });
}
$timeout(function () { $rootScope.$apply() })
} });
}
};
}])

  

修改封装解析utf-8的方法
var showPdfFileM = function (pdf) {
// var DEFAULT_URL = "";//注意,删除的变量在这里重新定义
// var PDFData = "";
var rawLength = pdf.length;
//转换成pdf.js能直接解析的Uint8Array类型,见pdf.js-4068
var array = new Uint8Array(new ArrayBuffer(rawLength));
for (i = 0; i < rawLength; i++) {
array[i] =pdf.charCodeAt(i) & 0xff;
}
// DEFAULT_URL = array; // var data = char2buf(window.atob(pdf));
var data = array;
pdfjsLib.getDocument({
data: data,
cMapUrl: 'lib/pdf.js/web/cmaps/',
cMapPacked: true
}).then(function (pdfDoc_) {
pdfDoc = pdfDoc_;
count = pdfDoc.numPages;
//绘制所有的页面
renderAllTF();
});

pdf.js-----后端返回utf-8数据流,前端处理数据展示pdf的更多相关文章

  1. Django:前后端分离后联调给前端传数据

    实现前后端分离后,有了下面几点改变: 1.服务器一分为二,前后端分别部署,静态资源放在前端服务器,业务代码放在后的服务器 2.前端服务器需要接收Http请求(一般使用node.js) 3.前端服务器需 ...

  2. js后端返回一个时间戳,用原生怎么对时间进行格式化?

    function fn(time) { var date = new Date(time); var len = time.toString().length; // 时间戳不足13位则在后面加零 i ...

  3. java实现word转pdf在线预览(前端使用PDF.js;后端使用openoffice、aspose)

    背景 之前一直是用户点击下载word文件到本地,然后使用office或者wps打开.需求优化,要实现可以直接在线预览,无需下载到本地然后再打开. 随后开始上网找资料,网上资料一大堆,方案也各有不同,大 ...

  4. base64编码后的pdf文件前端页面展示--pdf.js的应用

    最近在整理项目中用到的插件或者使用心得,感觉还是写成博客,能加深新一层的理解. 我先说一下我的需求:由于java后台编译的文件流在手机端加载速度太慢,所以想着可以在前端解析,放在页面展示给用户. 所以 ...

  5. PDF.Js的使用—javascript中前端显示pdf文件

    PDF.Js的使用—javascript中前端显示pdf文件 写于2018/12/6 起因是一个图片展示页面需要展示pdf格式的文件,所以查了半天决定使用pdf.js,我也不求有多了解它,能实现我想要 ...

  6. pdf.js跨域加载文件

    pdf.js一个基于Html的工具类,熟悉pdf.js的朋友们很清楚,pdf.js帮助我们做了很多事.尤其金融类网站会产生很多的报表.需要在线预览.pdf.js绝对是我们的首选 本地预览 在pdf.j ...

  7. PDF.js 详情解说

    pdf.js资源下载 点我下载 自定义默认加载的pdf资源 在web/view.js中我们可以通过DEFAULT_URL设置默认加载的pdf.通过上面代码我们也可以看出来可以通过后缀名来指定加载的pd ...

  8. pdf.js使用教程

    pdf.js框架的魅力所在,为其为HTML5实现的,无需任何本地支持,而且对浏览器的兼容性也是比较好,要求只有一个:浏览器支持HTML5就好了!(不过对于低版本的IE,就只能节哀了!) 据说IE9以上 ...

  9. 利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能)

    我是在IE11和谷歌上做的测试,都可以显示,把做出的东西记录下来,方便大家还有自己学习! 可以在IIS7服务器上也可以下载Tomcat来做服务器 Tomcat下载地址   http://pan.bai ...

随机推荐

  1. 激活windows系统

    1.下载KMS 2.如图所示,双击KMSpico看是否正常运行 3.双击KMSpico正常后出现以下界面 4.点击红色按钮 5.等自动退出就是激活成功,大概半年需要激活一次

  2. Bug搬运工-CSCvn51483:AP datasheet should contain info if the AP contains or not temperature sensor

    目前在老一些的思科AP上,应该都没有温度传感器的功能(例如AP1600,wave 1 AP1700...),但是在思科官方没有明确的文档去说明这个问题. 在Outdoor AP(室外AP,例如AP15 ...

  3. 【PAT甲级】1075 PAT Judge (25 分)

    题意: 输入三个正整数N,K,M(N<=10000,K<=5,M<=100000),接着输入一行K个正整数表示该题满分,接着输入M行数据,每行包括学生的ID(五位整数1~N),题号和 ...

  4. Scrapy模拟登陆

    1. 为什么需要模拟登陆? #获取cookie,能够爬取登陆后的页面 2. 回顾: requests是如何模拟登陆的? #1.直接携带cookies请求页面 #2.找接口发送post请求存储cooki ...

  5. ASP.NET Core中的依赖注入【上】

    此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 ASP.NET Core支持DI软件设计模式,其是一种为了 ...

  6. 广度优先搜索(BFS)与深度优先搜索(DFS)的对比及优缺点

    深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他 ...

  7. 关于React Native init 项目时候速度太慢的解决方法

    因为init项目的时候需要下载资源,但又因为react native的网站被墙所以下载很慢,解决方法就是换成淘宝的NPM镜像 我是直接使用了命令去替换了NPM $ npm install -g cnp ...

  8. HTML去除多余空白区域的方法

    在head标记中添加html,body{height:100%;}即可. 实例如下 <head><style>html,body{height:90%;}</style& ...

  9. 记录我对'我们有成熟的时间复杂度为O(n)的算法得到数组中任意第k大的数'的误解

    这篇博客记录我对剑指offer第2版"面试题39:数组中出现次数超过一半的数字"题解1的一句话的一个小误解,以及汇总一下涉及partition算法的相关题目. 在剑指offer第2 ...

  10. ROS学习资源

    1.ROS机器人操作系统自主学习实践环境 https://www.shiyanlou.com/courses/854 2.ROS官方网站 http://wiki.ros.org/ ROS中文官方网站 ...