pdf.js-----后端返回utf-8数据流,前端处理数据展示pdf
需求:做项目联调接口时,发现知识库展示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的更多相关文章
- Django:前后端分离后联调给前端传数据
实现前后端分离后,有了下面几点改变: 1.服务器一分为二,前后端分别部署,静态资源放在前端服务器,业务代码放在后的服务器 2.前端服务器需要接收Http请求(一般使用node.js) 3.前端服务器需 ...
- js后端返回一个时间戳,用原生怎么对时间进行格式化?
function fn(time) { var date = new Date(time); var len = time.toString().length; // 时间戳不足13位则在后面加零 i ...
- java实现word转pdf在线预览(前端使用PDF.js;后端使用openoffice、aspose)
背景 之前一直是用户点击下载word文件到本地,然后使用office或者wps打开.需求优化,要实现可以直接在线预览,无需下载到本地然后再打开. 随后开始上网找资料,网上资料一大堆,方案也各有不同,大 ...
- base64编码后的pdf文件前端页面展示--pdf.js的应用
最近在整理项目中用到的插件或者使用心得,感觉还是写成博客,能加深新一层的理解. 我先说一下我的需求:由于java后台编译的文件流在手机端加载速度太慢,所以想着可以在前端解析,放在页面展示给用户. 所以 ...
- PDF.Js的使用—javascript中前端显示pdf文件
PDF.Js的使用—javascript中前端显示pdf文件 写于2018/12/6 起因是一个图片展示页面需要展示pdf格式的文件,所以查了半天决定使用pdf.js,我也不求有多了解它,能实现我想要 ...
- pdf.js跨域加载文件
pdf.js一个基于Html的工具类,熟悉pdf.js的朋友们很清楚,pdf.js帮助我们做了很多事.尤其金融类网站会产生很多的报表.需要在线预览.pdf.js绝对是我们的首选 本地预览 在pdf.j ...
- PDF.js 详情解说
pdf.js资源下载 点我下载 自定义默认加载的pdf资源 在web/view.js中我们可以通过DEFAULT_URL设置默认加载的pdf.通过上面代码我们也可以看出来可以通过后缀名来指定加载的pd ...
- pdf.js使用教程
pdf.js框架的魅力所在,为其为HTML5实现的,无需任何本地支持,而且对浏览器的兼容性也是比较好,要求只有一个:浏览器支持HTML5就好了!(不过对于低版本的IE,就只能节哀了!) 据说IE9以上 ...
- 利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能)
我是在IE11和谷歌上做的测试,都可以显示,把做出的东西记录下来,方便大家还有自己学习! 可以在IIS7服务器上也可以下载Tomcat来做服务器 Tomcat下载地址 http://pan.bai ...
随机推荐
- JavaScript 事件 继承链 元素和结点
继承链: HTMLElement->Element->Node->EventTarget->Object document和body:document代表整个文档,body是指 ...
- 吴裕雄 python 神经网络——TensorFlow图片预处理
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt # 使用'r'会出错,无法解码,只能以2进制形式读 ...
- Laravel Vuejs 实战:开发知乎 (2)用户登录
1.安装一个给用户提示的扩展包: 二选一: https://github.com/laracasts/flash [我选的这个]https://github.com/oanhnn/laravel-fl ...
- rapidxml编写xml文件(er)
一.以rapidxml::node_declaration形式写xml文件第一行 int write(void) { ; rapidxml::xml_document<> doc; rap ...
- make工具简介
在Linux C/C++的开发过程中,当源代码文件较少时,我们可以手动使用gcc或g++进行编译链接,但是当源代码文件较多且依赖变得复杂时,我们就需要一种简单好用的工具来帮助我们管理.于是,make应 ...
- 「SDOI2009」虔诚的墓主人
传送门 Luogu 解题思路 离散化没什么好说 有一种暴力的想法就是枚举每一个坟墓,用一些数据结构维护一下这个店向左,向右,向上,向下的常青树的个数,然后用组合数统计方案. 但是网格图边长就有 \(1 ...
- 使用在线编辑 svg 软件修改 svg 图片
网站需要使用图标字体,但设计师给的图标大小有问题,故使用下面说陈述方法简单修改了一下.使用到的在线编辑软件地址为:https://editor.method.ac/ 问题: 注:至于如何使用图标字体( ...
- php 基础 判断类型
八.PHP中判断类型 is_bool():判断是否是布尔型 is_int().is_integer()和 is_long():判断是否为整型. is_float().is_double()和 is_r ...
- Vue中组件之间的通信方式
vue是数据驱动视图更新的框架, 所以对于vue来说组件间的数据通信非常重要,那么组件之间如何进行数据通信的呢? 本文会介绍组件间通信的8种方式如下图所示, 并介绍在不同的场景下如何选择有效方式实现的 ...
- HDU 1035 Robot Motion(dfs + 模拟)
嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1035 这道题比较简单,但自己一直被卡,原因就是在读入mp这张字符图的时候用了scanf被卡. ...