如何创建pdf的buffer,让pdf.js实现预览pdf文件

作者&投稿:尾薛 (若有异议请与网页底部的电邮联系)
如何创建pdf的buffer,让pdf.js实现预览pdf文件~

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的例子:






在线预览
{% load static %}{% get_static_prefix as STATIC_URL %}










//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;
}







省略内容

其实也就是简单的在浏览器中实现一个打开pdf文件,并有类似预览功能的边框。

其实在中国上经常见到类似的页面,在浏览器中打开pdf文档,可大部分都是由于版权的原因使用了一些很特殊的技术,自然很难模仿了。
即使有直接在浏览器打开的例子,也必须手动点击一下链接然后才能打开pdf文件。如何直接打开,而不用点击链接呢?
本以为自己对js很熟,也就使用js模拟点击,可就是不管用,没办法,只能在中国上继续寻找资料。最终想不到代码却很简单。
最主要的是使用到了一个jquery的插件jquery.media.js,使用这个插件就很容易实现了。
核心代码:
河套西部一次局地大暴雨成因分析 使用jquery.media.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文静在buffer打不开,没有打印机是不能在这里打开的,楼主试试迅捷pdf虚拟打印机看看能不能将pdf文件在这里打开,要是不能打开也是不能勉强的,不过这个工具是确实蛮好的


...PDF TXT都可以,急用,请发邮箱bukey660@163.com
只有pdf格式,要滴哈,可加 Wo 《刑法罪名精释 对最高人民法院关于罪名司法解释的理解和适用》 作者:周道鸾,张军主编;马东等撰稿 页数:1129 出版社:北京市:人民法院出版社 出版日期:1998 《新刑法条文释义》 作者:刘家琛主编 页数:1068 出版日期:2004 简介:根据全国人大常委会刑法修...

武清区17762218014: 如何创建pdf的buffer,让pdf.js实现预览pdf文件 -
杨赖力百: 纯Java的解决方案: 我们首先想到的自然就是JDK1.4提供的JPS(JavaPrintingService)啦,不过,这东西虽然说支持PDF的Flavor,但是,不管是个人实验还是网上他人的评论,好像根本就是useless,可能如果说你的打印机Driver支持PDF的...

武清区17762218014: PDF格式文件夹怎样建立 -
杨赖力百: 工具:PDF Factory Pro 步骤: 1、下载PDF Factory Pro531.exe ,完成后直接双击打开. 2、安装PDF Factory Pro: 选择 这台计算机上,然后下一步; 3、在产品授权信息界面,这儿只能无条件,我接受,才能进行 安装; 4、如果之前已经安...

武清区17762218014: foxit pdf editor的教程
杨赖力百: 我来回答一下吧: 1.那个大部分是空白的图标,是:创建一个新的PDF文件; 2.那个文档图标,是:打开你电脑中已存在的PDF文件; ========================= 1.按我上面说的方法打开一个PDF文件后,用鼠标圈住一段文字或线段等图...

武清区17762218014: 要建立一个新的PDF文件怎么建立啊 -
杨赖力百: 下面的方法就可以实现新建pdf文件: 安装一个pdf编辑工具在自己的电脑里,完成之后打开,单击文件按钮,找到新建文档功能.然后把准备好的内容拖到弹出的对话框中就可以啦.

武清区17762218014: 如何安装adob PDF printer -
杨赖力百: PDF Factory 提供了创建 Adobe PDF 文件的打印机驱动程序,并且创建 PDF 文件的方法更方便高效,比Adobe Acrobat更稳定.工具:PDF Factory Pro 步骤:1、下载PDF Factory Pro531.exe ,完成后直接双击打开.2、安装PDF Factory Pro...

武清区17762218014: any dwg to pdf converter怎么操作 -
杨赖力百: autocad安装时通常都会安装一个pdf虚拟打印机 可以直接将dwg以“打印”转换的方式 变成pdf文件 如果是单独的dwg文件 可以在网上搜索相应的转换工作 建议安装单独的pdf虚拟打印机(pdffactory、ultra pdf等),可以将任意文档打印/转换成pdf,只要应用程序提供有打印文档的选项.通过这种方法生成的pdf文件可以完美保留文档的版式和内容,而且生成的文件体积小.

武清区17762218014: pdf factory 怎么用 -
杨赖力百: 1、安装 2、用word编辑完文件后,选择打印文件,打印机选项中,选择PDF factory打印,即可生成PDF文件.与word文档一样效果. 附: pdfFactory 是一个无须 Acrobat 创建 Adobe PDF 文件的打印机驱动程序.pdfFactory 提供的创建 PDF ...

武清区17762218014: 请问下byte字节流 怎么生成 pdf -
杨赖力百: byte[] buffer // 我得到的数据,这个数据成功转成pdf的话应该是运单labelbyte []data=org.apache.commons.codec.binary.Base64().decodeBase64(buffer);FileOutputStream...

武清区17762218014: 如何创建pdf中的文本框
杨赖力百: <p>工具-注释和标记-文本框工具,选择后,在界面上点击可创建一个文本框. </p> <p>补充:如我图是有的.</p> <p>可在别的菜单里,特别是“注释”里仔细找一找,你的“工具”左边就是.</p> <p> 注释-注释和标记工具-下拉框-文本框工具 .</p> <p> 会否是版本旧了?</p> <p></p>

武清区17762218014: 如何创建PDF格式文件
杨赖力百: 安装Acrobat,注意不是Reader,然后在打印机列表里就会出现一个虚拟打印机,将文档用这个虚拟打印机打印出来的文件就是PDF格式的了 不谈版权,现在很很多生成PDF的软件 推荐使用adobe acrobat 还有一些就是可以另存为PDF的软件 ,例如现在的office 2007你编辑好的文档直接可以另存为PDF格式的(需要你安装一个PDF的插件)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网