⑴ 如何创建pdf的buffer,让pdf.js实现预览pdf文件
pdf.js简介
PDF.js 是基于开放的 HTML5 及 javaScript 技术实现的开源产品。简单说就是一个 PDF
解析器。运用HTML5JavaScript(即pdf.js仅使用安全的web语言,不包含任何攻击者可以用的本地代码块)的PDF阅读器pdf.js,直接在标准的HTML页面上载入和渲染PDF文件, 还可以提高安全性(不需要安装第三方插件,安全性由浏览器保证),浏览器所做的安全措施已经为pdf.js提供了安全的运行环境。其对IE和 FireFox浏览器的要求是IE9+, FireFox19+。
在线示例: http://jsbin.com/pdfjs-helloworld-v2/1/edit
, http://jsbin.com/pdfjs-prevnext-v2/1/edit
源码:https://github.com/mozilla/pdf.js
官网:http://mozilla.github.io/pdf.js/
pdf.js VS 传统浏览器读取pdf
一般来说,PDF档案格式都是在浏览器中由外挂程式来描绘,通常是Adobe自己的PDF
reader或来自其他供应商的描绘工具,但这些外挂通常无法充分运用PDF的特点,而且由于含有大量的受信任代码,使得Google
Chrome浏览器必须运用SandBox沙箱原理,来检查PDF描绘工具是否遭到未知病毒感染。
使用adobe,必须在本地安装软件才能使用,而pdf.js不依赖环境、渲染速度快(测试过,确实很快)、安全性高。
pdf.js渲染PDF文件
pdf.js渲染PDF文件的流程:Fetch pdf (url / buffer) ——> canvas ——> 渲染
如果要深入pdf的渲染,需要去研究pdf.js源代码。pdf.js可通过pdf文件的地址或pdf数据流获取pdf,具体实现是调用接口函数 PDFJs.getDoc(url/buffer)将pdf载入html,通过canvas处理, 然后渲染pdf文件。网上给出的都是通过url来获取pdf的例子,而我在做项目的时候,后台(Python)要求是发pdf的数据流给前台,前台接收pdf的buffer,然后通过pdf.js来渲染。当然最初尝试buffer出现了很多问题,具体问题总结如下:
1)如何通过$.ajax接收后台发给前台的buffer数据;
2)如何将buffer传给pdf.js来处理(这里我使用了viewer.js, 所以需要考虑的是如何将buffer传给viewer.js来处理);
3)如何将pdf.js转换成pdf.js可以接收的buffer格式;
(对应问题解决见代码注释)
注:viewer.js是pdf.js的扩展,其将打印、翻页、缩放等功能进行了实现,且界面非常好看。也就是说如果你引入了viewer.js,pdf的渲染和渲染之后的功能界面都已经帮你实现了,你不用自己去写界面。
先从官网:http://mozilla.github.io/pdf.js/ 下载代码,然后使用文件viewer.html
, 我的html就是在viewer.html 的基础上修改的,下面我给出buffer的例子:
<!DOCTYPE html>
<html dir="ltr" mozdisallowselectionprint moznomarginboxes>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="google" content="notranslate">
<title>在线预览</title>
{% load static %}{% get_static_prefix as STATIC_URL %}
<link href="{{STATIC_URL}}css/preview.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="{{STATIC_URL}}pdfjs/web/viewer.css"/>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/compatibility.js"></script>
<link rel="resource" type="application/l10n" href="{{STATIC_URL}}pdfjs/web/locale/locale.properties"/>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/l10n.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/build/pdf.js"></script>
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/debugger.js"></script>
<script src="{{STATIC_URL}}js/jquery-1.8.3.js" type="text/javascript"></script>
<script type="text/javascript">
//convertDataURIToBinary()
//不知道什么原因如果后台直接将pdf的数据流发给前台,得到的是乱码,将数据转换成 Uint8Array始终不成功
//所以就让后台将发送之前的数据流做 了base64编码发给前台,前台再解码得到的数据就不是乱码了。
var BASE64_MARKER = ';base64,';
var preFileId = {{mark}};
//viewer.js全局变量,传入buffer,回答问题2
var DEFAULT_URL
$(document).ready(function(){
$.ajax({
type:"post",
async: false,
//ajax接收pdf数据流,注意dataType值的设置是否有错,如果不指定,jQuery将自动根据HTTP包MIME信息返回
//responseXML或responseText
. 回答问题1
contentType:"application/pdf;charset=utf-8",
url:"{% url netPan.File.views.browserFuf%}",
data:{
id: preFileId
},
success:function(data){
var pdfAsDataUri = data;
//如果引入了viewer.js , 处理方法
var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
DEFAULT_URL = pdfAsArray;
// 只引入了pdf.js, 未引入viewer.js, 处理方法
// var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
// PDFJS.getDocument(pdfAsArray).then(); 自己写pdf的处理函数
}
});
});
function convertDataURIToBinary(dataURI) { //编码转换,回答问题3
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = dataURI.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
//转换成pdf.js能直接解析的Uint8Array类型,见pdf.js-4068
var array = new Uint8Array(new ArrayBuffer(rawLength));
for(i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array;
}
</script>
<!--先设置全局变量DEFAULT_URL 的值,所以要后调入viewer.js -->
<script type="text/javascript" src="{{STATIC_URL}}pdfjs/web/viewer.js"></script>
</head>
<body>
省略内容
</body>
</html>
⑵ 实现在线浏览PDF文件的实用jQuery插件有哪些
在web开发当中我们经常需要进行需要在线浏览PDf内容,在线嵌入动态pdf,传统的解决方法安装客户端PDF阅读器,如果是在谷歌是可以在线浏览的,因为他自身就带了一些插件,以前遇到这样的问题往往是费时又费力,很不好解决,
今天就给大家分享一系列使用javascript实现的pdf插件效果,无需借助第三方插件就可以实现在线浏览功能,非常实用。
PDFObject
PDFobject可以帮助你在页面直接嵌入pdf文件,有时候有些项目需要动态地嵌入PDF文件。PDFObject为此而设计的,他能够快速和容易的嵌入PDF文件,PDFObject使用JavaScript来产生相同的符合标准的 标记,然后插入 到您的HTML元素的选择。您可以填满整个浏览器窗口,或将PDF格式转换成一个 或其他块级元素。
pdf.js
和 Google Chrome 使用的源自 Foxit 的闭源 PDF 浏览插件不同,PDF.js 是基于开放的 HTML5 及 JavaScript 技术实现的开源产品。
pdf.js 是一个主要用于HTML5 平台上在线阅读PDF文档的小插件,基于JavaScript技术编写而成,无需任何本地技术支持。
pdf.js是由Mozilla Labs发布的。他们的目标是创建一个通用的,基于标准的网络平台,能够解析和渲染PDF文件,并最终发布一个PDF阅读器扩展,毫无疑问 pdf.js 将被整合入 Gecko 成为 Firefox 的内嵌 PDF 阅读器,但是具体整合时间表尚未确定
jsPDF
jsPDF 是一个使用Javascript语言生成PDF的开源库。你可以在Firefox插件,服务端脚本或是浏览器脚本中使用它。客户端Safari 和 iPhone Safari 支持得最好,其次是Opera和Windows下的Firefox 3等。IE暂不支持。。
jQuery Media Plugin
jQuery Media Plugin是一款基于jQuery的网页媒体播放器插件,它支持大部分的网络多媒体播放器和多媒体格式,比如:Flash, Windows Media Player, Real Player, Quicktime, MP3,Silverlight, PDF。它根据当前的脚本配置,自动将a标签替换成div,并生成object, embed甚至是iframe代码,至于生成object还是embed,jQuery Media会根据当前平台自动判别,因此兼容性方面非常出色下面这段代码是jQuery Media生成后的。
Google Docs PDF viewer
ZOHO Viewer
Anychart:使用JavaScript导出PDF
下图可以导出为PNG或JPG格式的静态图像或嵌入式静态图像,图表或一个完全互动的功能图
jQuery Document Viewer
Document Viewer是一个jQuery插件,可以让你在网页中直接查看多种文件格式。文档浏览器支持的文件格式:PDF文件,文本文件,代码,图像,音频,视频等。
⑶ 使用jQuery的PDF查看器问题,怎么解决
jquery.media.js 插件实现在线预览PDF文件
代码:
[html]view plain
<!DOCTYPEhtml>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/>
<title>在线预览PDF文档</title>
<linkrel="stylesheet"href="bootstrap-3.3.7/css/bootstrap.min.css">
<scripttype="text/javascript"src="js/jquery.min.js"></script>
<scripttype="text/javascript"src="js/jquery.media.js"></script>
<scripttype="text/javascript">
$(function(){
$('a.media').media({width:800,height:600});
});
</script>
</head>
<body>
<center>
<divclass="panelpanel-primary">
<divclass="panel-heading"align="center">
<h2>预览pdf文件</h2>
</div>
<divclass="panel-body">
<aclass="media"href="yulan.pdf"></a>
</div>
</center>
</body>
</html>
⑷ 濡备綍浣跨敤Node.js鐖鍙栦换镒忕绣椤佃祫婧愬苟杈揿嚭PDF鏂囦欢鍒版湰鍦
闇姹傦细
浣跨敤Node.js鐖鍙栫绣椤佃祫婧愶纴寮绠卞嵆鐢ㄧ殑閰岖疆
灏嗙埇鍙栧埌镄勭绣椤靛唴瀹逛互PDF镙煎纺杈揿嚭
濡傛灉浣犳槸涓钖嶆妧链浜哄憳锛岄偅涔埚彲浠ョ湅鎴戞帴涓嬫潵镄勬枃绔狅纴钖﹀垯锛岃风洿鎺ョЩ姝ュ埌鎴戠殑github浠揿簱锛岀洿鎺ョ湅鏂囨。浣跨敤鍗冲彲
浠揿簱鍦板潃:闄勫甫鏂囨。鍜屾簮镰
链闇姹备娇鐢ㄥ埌镄勬妧链锛歂ode.js鍜宲uppeteer
puppeteer 瀹樼绣鍦板潃: puppeteer鍦板潃
Node.js瀹樼绣鍦板潃:阈炬帴鎻忚堪
Puppeteer鏄璋锋瓕瀹樻柟鍑哄搧镄勪竴涓阃氲繃DevTools鍗忚鎺у埗headless Chrome镄凬ode搴撱傚彲浠ラ氲繃Puppeteer镄勬彁渚涚殑api鐩存帴鎺у埗Chrome妯℃嫙澶ч儴鍒嗙敤鎴锋搷浣沧潵杩涜孶I Test鎴栬呬綔涓虹埇铏璁块梾椤甸溃𨱒ユ敹闆嗘暟鎹銆
鐜澧冨拰瀹夎
Puppeteer链韬渚濊禆6.4浠ヤ笂镄凬ode锛屼絾鏄涓轰简寮傛ヨ秴绾уソ鐢ㄧ殑async/await锛屾帹钻愪娇鐢7.6鐗堟湰浠ヤ笂镄凬ode銆傚彟澶杊eadless Chrome链韬瀵规湇锷″櫒渚濊禆镄勫簱镄勭増链瑕佹眰姣旇缉楂桡纴centos链嶅姟鍣ㄤ緷璧栧亸绋冲畾锛寁6寰堥毦浣跨敤headless Chrome锛屾彁鍗囦緷璧栫増链鍙鑳藉嚭鐜板悇绉嶆湇锷″櫒闂棰桡纸鍖呮嫭涓斾笉闄愪簬镞犳硶浣跨敤ssh锛夛纴链濂戒娇鐢ㄩ珮鐗堟湰链嶅姟鍣ㄣ傦纸寤鸿浣跨敤链鏂扮増链镄凬ode.js锛
灏忚瘯鐗涘垁锛岀埇鍙栦含涓滆祫婧
const puppeteer = require('puppeteer'); // 寮曞叆渚濊禆
(async () => { //浣跨敤async鍑芥暟瀹岀编寮傛
const browser = await puppeteer.launch(); //镓揿紑鏂扮殑娴忚埚櫒
const page = await browser.newPage(); // 镓揿紑鏂扮殑缃戦〉
await page.goto('https://www.jd.com/'); //鍓嶅线閲岄溃 'url' 镄勭绣椤
const result = await page.evaluate(() => { //杩欎釜result鏁扮粍鍖呭惈镓链夌殑锲剧墖src鍦板潃
let arr = []; //杩欎釜绠澶村嚱鏁板唴閮ㄥ啓澶勭悊镄勯昏緫
const imgs = document.querySelectorAll('img');
imgs.forEach(function (item) {
arr.push(item.src)
})
return arr
});
// '姝ゆ椂镄剅esult灏辨槸寰楀埌镄勭埇铏鏁版嵁锛屽彲浠ラ氲繃'fs'妯″潡淇濆瓨'
})()
澶嶅埗杩囧幓 浣跨敤锻戒护琛屽懡浠 ` node 鏂囦欢钖 ` 灏卞彲浠ヨ繍琛岃幏鍙栫埇铏鏁版嵁浜 杩欎釜 puppeteer 镄勫寘 锛屽叾瀹炴槸镟挎垜浠寮钖浜嗗彟涓涓娴忚埚櫒锛岄吨鏂板幓寮钖缃戦〉锛岃幏鍙栧畠浠镄勬暟鎹銆
涓婇溃鍙鐖鍙栦简浜涓滈栭〉镄勫浘鐗囧唴瀹癸纴锅囱炬垜镄勯渶姹傝繘涓姝ユ墿澶э纴闇瑕佺埇鍙栦含涓滈栭〉涓镄勬墍链<a> 镙囩惧瑰簲镄勮烦杞缃戦〉涓镄勬墍链 title镄勬枃瀛楀唴瀹癸纴链钖庢斁鍒颁竴涓鏁扮粍涓銆
鎴戜滑镄刟sync鍑芥暟涓婇溃涓鍏卞垎浜嗕簲姝ワ纴 鍙链 puppeteer.launch() ,browser.newPage(), browser.close() 鏄锲哄畾镄勫啓娉曘
page.goto 鎸囧畾鎴戜滑铡诲摢涓缃戦〉鐖鍙栨暟鎹锛屽彲浠ユ洿鎹㈠唴閮╱rl鍦板潃锛屼篃鍙浠ュ氭¤皟鐢ㄨ繖涓鏂规硶銆
page.evaluate 杩欎釜鍑芥暟锛屽唴閮ㄦ槸澶勭悊鎴戜滑杩涘叆𨱍宠佺埇鍙栫绣椤电殑鏁版嵁阃昏緫
page.goto鍜宲age.evaluate涓や釜鏂规硶锛屽彲浠ュ湪async鍐呴儴璋幂敤澶氭★纴闾f剰锻崇潃鎴戜滑鍙浠ュ厛杩涘叆浜涓灭绣椤碉纴澶勭悊阃昏緫钖庯纴鍐嶆¤皟鐢╬age.goto杩欎釜鍑芥暟
娉ㄦ剰锛屼笂闱㈣繖涓鍒囬昏緫锛岄兘鏄痯uppeteer杩欎釜鍖呭府鎴戜滑鍦ㄧ湅涓嶈佺殑鍦版柟寮钖浜嗗彟澶栦竴涓娴忚埚櫒锛岀劧钖庡勭悊阃昏緫锛屾墍浠ユ渶缁堣佽皟鐢╞rowser.close()鏂规硶鍏抽棴闾d釜娴忚埚櫒銆
杩欐椂鍊欐垜浠瀵逛笂涓绡囩殑浠g爜杩涜屼紭鍖栵纴鐖鍙栧瑰簲镄勮祫婧愩
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.jd.com/');
const hrefArr = await page.evaluate(() => {
let arr = [];
const aNodes = document.querySelectorAll('.cate_menu_lk');
aNodes.forEach(function (item) {
arr.push(item.href)
})
return arr
});
let arr = [];
for (let i = 0; i < hrefArr.length; i++) {
const url = hrefArr[i];
console.log(url) //杩欓噷鍙浠ユ墦鍗
await page.goto(url);
const result = await page.evaluate(() => { //杩欎釜鏂规硶鍐呴儴console.log镞犳晥
return $('title').text(); //杩斿洖姣忎釜鐣岄溃镄则itle鏂囧瓧鍐呭
});
arr.push(result) //姣忔″惊鐜缁欐暟缁勪腑娣诲姞瀵瑰簲镄勫
}
console.log(arr) //寰楀埌瀵瑰簲镄勬暟鎹 鍙浠ラ氲繃Node.js镄 fs 妯″潡淇濆瓨鍒版湰鍦
await browser.close()
})()
涓婇溃链夊ぉ鍧 page.evaluate鍑芥暟鍐呴儴镄刢onsole.log涓嶈兘镓揿嵃锛岃屼笖鍐呴儴涓嶈兘銮峰彇澶栭儴镄勫彉閲,鍙鑳絩eturn杩斿洖锛
浣跨敤镄勯夋嫨鍣ㄥ繀椤诲厛铡诲瑰簲鐣岄溃镄勬带鍒跺彴瀹为獙杩囱兘涓嶈兘阃夋嫨DOM鍐崭娇鐢锛屾瘆濡备含涓沧棤娉曚娇鐢╭uerySelector銆傝繖閲岀敱浜
浜涓灭殑鍒嗙晫闱㈤兘浣跨敤浜唈Query锛屾墍浠ユ垜浠鍙浠ョ敤jQuery锛屾讳箣浠栦滑寮鍙戣兘鐢ㄧ殑阃夋嫨鍣锛屾垜浠閮藉彲浠ョ敤锛屽惁鍒椤氨涓嶅彲浠ャ
鎺ヤ笅𨱒ユ垜浠鐩存帴𨱒ョ埇鍙朜ode.js镄勫畼缃戦栭〉铹跺悗鐩存帴鐢熸垚PDF
镞犺烘偍鏄钖︿简瑙Node.js鍜宲uppeteer镄勭埇铏镄勪汉锻橀兘鍙浠ユ搷浣滐纴璇锋偍涓瀹氢竾鍒嗕粩缁嗛槄璇绘湰鏂囨。骞舵寜椤哄簭镓ц屾疮涓姝
链椤圭洰瀹炵幇闇姹傦细缁欐垜浠涓涓缃戦〉鍦板潃锛岀埇鍙栦粬镄勭绣椤靛唴瀹癸纴铹跺悗杈揿嚭鎴愭垜浠𨱍宠佺殑PDF镙煎纺鏂囨。锛岃锋敞镒忥纴鏄楂樿川閲忕殑PDF鏂囨。
绗涓姝ワ纴瀹夎匩ode.js ,鎺ㄨ崘http://nodejs.cn/download/锛孨ode.js镄勪腑鏂囧畼缃戜笅杞藉瑰簲镄勬搷浣灭郴缁熷寘
绗浜屾ワ纴鍦ㄤ笅杞藉畨瑁呭畬浜哊ode.js钖庯纴 钖锷╳indows锻戒护琛屽伐鍏(windows涓嫔惎锷ㄧ郴缁熸悳绱㈠姛鑳斤纴杈揿叆cmd锛屽洖杞︼纴灏卞嚭𨱒ヤ简)
绗涓夋 闇瑕佹煡鐪嬬幆澧冨彉閲忔槸钖﹀凡缁忚嚜锷ㄩ厤缃,鍦ㄥ懡浠よ屽伐鍏蜂腑杈揿叆 node -v锛屽傛灉鍑虹幇 v10. ***瀛楁碉纴鍒栾存槑鎴愬姛瀹夎匩ode.js
绗锲涙 濡傛灉鎭ㄥ湪绗涓夋ュ彂鐜拌緭鍏node -v杩樻槸娌℃湁鍑虹幇 瀵瑰簲镄勫瓧娈碉纴闾d箞璇锋偍閲嶅惎鐢佃剳鍗冲彲
绗浜旀 镓揿紑链椤圭洰鏂囦欢澶癸纴镓揿紑锻戒护琛屽伐鍏凤纸windows绯荤粺涓鐩存帴鍦ㄦ枃浠剁殑url鍦板潃镙忚緭鍏cmd灏卞彲浠ユ墦寮浜嗭级锛岃緭鍏 npm i cnpm nodemon -g
绗鍏姝 涓嬭浇puppeteer鐖铏鍖咃纴鍦ㄥ畬鎴愮浜旀ュ悗锛屼娇鐢╟npm i puppeteer --save 锻戒护 鍗冲彲涓嬭浇
绗涓冩 瀹屾垚绗鍏姝ヤ笅杞藉悗锛屾墦寮链椤圭洰镄剈rl.js锛屽皢鎭ㄩ渶瑕佺埇铏鐖鍙栫殑缃戦〉鍦板潃镟挎崲涓婂幓(榛樿ゆ槸http://nodejs.cn/)
绗鍏姝 鍦ㄥ懡浠よ屼腑杈揿叆 nodemon index.js 鍗冲彲鐖鍙栧瑰簲镄勫唴瀹癸纴骞朵笖镊锷ㄨ緭鍑哄埌褰揿墠鏂囦欢澶逛笅闱㈢殑index.pdf鏂囦欢涓
TIPS: 链椤圭洰璁捐℃濇兂灏辨槸涓涓缃戦〉涓涓狿DF鏂囦欢锛屾墍浠ユ疮娆$埇鍙栦竴涓鍗旷嫭椤甸溃钖庯纴璇锋妸index.pdf𨰾疯礉鍑哄幓锛岀劧钖庣户缁镟存崲url鍦板潃锛岀户缁鐖鍙栵纴鐢熸垚鏂扮殑PDF鏂囦欢锛屽綋铹讹纴鎭ㄤ篃鍙浠ラ氲繃寰鐜缂栬疟绛夋柟寮忓幓涓娆℃х埇鍙栧氢釜缃戦〉鐢熸垚澶氢釜PDF鏂囦欢銆
瀵瑰簲镀忎含涓滈栭〉杩欐牱镄勫紑钖浜嗗浘鐗囨噿锷犺浇镄勭绣椤碉纴鐖鍙栧埌镄勯儴鍒嗗唴瀹规槸loading鐘舵佺殑鍐呭癸纴瀵逛簬链変竴浜涘弽鐖铏链哄埗镄勭绣椤碉纴鐖铏涔熶细鍑虹幇闂棰桡纴浣嗘槸缁濆ぇ澶氭暟缃戠珯閮芥槸鍙浠ョ殑
const puppeteer = require('puppeteer');
const url = require('./url');
(async () => {
const browser = await puppeteer.launch({ headless: true })
const page = await browser.newPage()
//阃夋嫨瑕佹墦寮镄勭绣椤
await page.goto(url, { waitUntil: 'networkidle0' })
//阃夋嫨浣犺佽緭鍑虹殑闾d釜PDF鏂囦欢璺寰勶纴鎶婄埇鍙栧埌镄勫唴瀹硅緭鍑哄埌PDF涓锛屽繀椤绘槸瀛桦湪镄凯DF锛屽彲浠ユ槸绌哄唴瀹癸纴濡傛灉涓嶆槸绌虹殑鍐呭笔DF锛岄偅涔堜细瑕嗙洊鍐呭
let pdfFilePath = './index.pdf'
//镙规嵁浣犵殑閰岖疆阃夐”锛屾垜浠杩欓噷阃夋嫨A4绾哥殑瑙勬牸杈揿嚭PDF锛屾柟渚挎墦鍗
await page.pdf({
path: pdfFilePath,
format: 'A4',
scale: 1,
printBackground: true,
landscape: false,
displayHeaderFooter: false
});
await browser.close()
})()
鏂囦欢瑙f瀯璁捐
鏁版嵁鍦ㄨ繖涓镞朵唬闱炲父鐝嶈吹锛屾寜镦х绣椤电殑璁捐¢昏緫锛岄夊畾鐗瑰畾镄删ref镄勫湴鍧锛屽彲浠ュ厛鐩存帴銮峰彇瀵瑰簲镄勮祫婧愶纴涔熷彲浠ラ氲繃鍐嶆′娇鐢 page.goto鏂规硶杩涘叆锛屽啀璋幂敤 page.evaluate() 澶勭悊阃昏緫锛屾垨钥呰緭鍑哄瑰簲镄凯DF鏂囦欢锛屽綋铹朵篃鍙浠ヤ竴鍙f皵杈揿嚭澶氢釜PDF鏂囦欢~
杩欓噷灏变笉锅氲繃澶氢粙缁崭简锛屾瘯绔 Node.js 鏄鍙浠ヤ笂澶╃殑锛屾垨璁告湭𨱒ュ畠鐪熺殑浠涔堥兘鑳藉仛銆傝繖涔堜紭璐ㄧ亩鐭镄勬暀绋嬶纴璇锋敹钘
鎴栬呰浆鍙戠粰鎭ㄧ殑链嫔弸锛岃阿璋銆
⑸ 用jquery插件实现pdf文件的在线预览,大概是怎么个思路
其实也就是简单的在浏览器中实现一个打开pdf文件,并有类似预览功能的边框。
其实在中国上经常见到类似的页面,在浏览器中打开pdf文档,可大部分都是由于版权的原因使用了一些很特殊的技术,自然很难模仿了。
即使有直接在浏览器打开的例子,也必须手动点击一下链接然后才能打开pdf文件。如何直接打开,而不用点击链接呢?
本以为自己对js很熟,也就使用js模拟点击,可就是不管用,没办法,只能在中国上继续寻找资料。最终想不到代码却很简单。
最主要的是使用到了一个jquery的插件jquery.media.js,使用这个插件就很容易实现了。
核心代码:
河套西部一次局地大暴雨成因分析 使用jquery.media.js就可以直接把一个连接到pdf文件的链接打
⑹ jquery代码是生成横向pdf
插件描述:jsPDF HTML5是一个客户端解决方案生成pdf文件。适合活动门票、报告、证书,等等。 它将在IE6+,Firefox 3 +,Chrome,Safari 3 +,Opera。IE9下工作
⑺ 解决react项目中PDF的显示与打印问题
最近项目中有这样一个需求:
拿到这个需求,真时一头雾水。因为没有做过类似需求,不知从何下手。在查阅资料的过程中,发现有很多jQuery插件可以实现显示pdf, 但是我们是react单页面应用项目,看来这些插件并不适用,只能另寻其它方法。
后来在 npmjs.com 上找到了 react-pdf-js 组件, 心想显示pdf有望。就迫不及待将 react-pdf-js 依赖 通过 cnpm install react-pdf-js --save-dev 命令安装到项目中,通过 import PDF from 'react-pdf-js' 引入到项目里。将<PDF file={pdfUrl} onDocumentComplete={this.onDocumentComplete} onPageComplete={this.state.page} />插入render里。
在调试过程中发现静态pdf文件可以显示,在线pdf文件不能显示。通过控制的报错信息了解道,react-pdf-js组件要求file文件地址是url或者base64格式, 既然url行不通,就只能往base64上靠了。
一开始我直接将将pdf的在线地址url转换为base64,但是不能显示。后来想明白了,只把url转换成base64格式是没有用的,需要把pdf的文件内容转换成base64才行。接下来就顺理成章,通过从后台获取到的pdf的url地址,再次请求获取到pdf文件。
在做这部分的遇到一个小问题:能请求成功,就是获取不到pdf文件,在这纠结了很久,也不知道该如何解决,把问题描述给我们公司的架构师,我们分析这是跨域问题造成的,他给nginx服务器的配置解决了跨域问题。
这里需要注意请求pdf文件的时候要设置 responseType 为blob, 为什么使用blob类型下面解释,到这我就拿到了pdf文件,将其转化为base64格式。
base64格式的转换,需要时blob格式,将转化为base64格式的pdf,在file={file}, 将其在浏览器上显示出来。实际上最终是以canvas来呈现的PDF。
pdf显示算是告一段落,接下来就是打印了。
在浏览器上,打印分整页打印和指定部分打印。项目需要打印制定部分内容打印,实现打印的方法多种多样,我使用了传统的css控制。通过 @media print 将打印时不需要打印的部分隐藏掉,那么剩下的就是要打印的部分了。
这里有个调试的小技巧:因为只有当调用了浏览器的打印才会调用@media print 里的样式,所以可以将这部分样式放在外面,当将不需要打印的部分都隐藏掉了,再将外部的这些样式去掉,给@media print即可。
调用浏览器的打印使用的 window.print() , 虽然不能兼容所有浏览器,但是常见的高级浏览器都可以兼容,满足了我们的项目需求,这里我就没有继续深挖。
pdf的显示与打印,前前后后遇到了不少问题,以上流水做个总结。