浅谈实现在线预览PDF的几种解决办法


Posted in Javascript onAugust 10, 2020

因客户需要实现PDF的预览处理,在网上找了一些PDF在线预览的解决方案,有的用PDFJS的在线预览方式,有的使用PDFObject的嵌入式显示,有的通过转换JPG/PNG方式实现间接显示的方式,开始是想通过简单的方式,能够使用JS插件实现预览最好,可是在线预览总是有一些不足,如不同浏览器的兼容问题,甚至不同的手机平台中展示的效果也不一样,不过最好还是采用了间接的方式,把PDF转换为图片展示效果,达到客户的要求。

1、在线实现预览的方式

一开始我还是很倾向使用这种方式,希望能采用一个较为好的JS插件的方式,实现PDF的在线预览(通过Web预览),因此在Github上找到排名比较高的PDF插件

浅谈实现在线预览PDF的几种解决办法

一看排名还是很高的,那么采用它应该不错,查看自带的PDF文件,效果还是杠杠的。

浅谈实现在线预览PDF的几种解决办法

不过客户的要求是显示正常的发票PDF文件,换一下文件地址,有部分信息显示不了,找了一下没有看到解决方法,所以效果不达标。

浅谈实现在线预览PDF的几种解决办法

连基本的发票也显示不了,那我这个就不能用它来显示发票PDF文件了。

最后,测试了使用PDFObject(https://pdfobject.com/ )的方式实现在线嵌入PDF显示的方式,这个JS插件也是不错的,同样可以在GitHub上可以找到。

它的使用也是很简单的,如下代码所示。

<script src="/js/pdfobject.js"></script>

<script>PDFObject.embed("/pdf/sample-3pp.pdf", "#example1");</script>

如果需要设置预览窗口的大小,通过设置样式即可。

<style>
.pdfobject-container { height: 500px;}
.pdfobject { border: 1px solid #666; }
</style>

浅谈实现在线预览PDF的几种解决办法

显示的效果是正常的了,不过我在苹果手机打开Safari浏览器测试发现,不能正常显示。

浅谈实现在线预览PDF的几种解决办法

因此也不能使用来进行预览显示。

在实际的测试中,发现安卓手机的浏览器对于预览PDF也是支持不一,有些直接下载PDF,不支持预览显示。

为了避免这些问题,最好找了一个折中的方案,把PDF转换为图片进行显示,图片在不同的浏览器中显示可是没有问题的。

2、PDF转换图片进行显示

把PDF转换为图片也有很多控件处理,例如Aspose.Pdf、Spire.Pdf、 pdfiumviewer 等等,不同的第三方类库使用的方法有所差异,不过思路都很类似。

本来倾向于使用Aspose.Pdf的,不过发现转换后的发票信息还是缺失了某些中文字符或者乱码,导致不能正常显示。

后来寻找Spire.Pdf 版本以及对应的绿色版本,终于能够转换为正确的格式了,因此也就使用这个第三方控件进行转换图片使用了。

至于在线预览,我们在第一次请求PDF预览文件的时候,生成对应的图片文件,后面直接返回路径即可。

实现的预览效果如下所示。

浅谈实现在线预览PDF的几种解决办法

由于我们是在asp.net MVC的项目上进行显示的,因此需要修改控制器的处理逻辑,对图片的生成进行判断处理即可。

控制器后台的实现代码如下所示。

//判断是否存在PDF生成的图片文件,
        //生成的jpg文件名为附件的ID
        string pdfjpgPath = string.Format("/GenerateFiles/pdf/{0}.jpg", info.ID);
        string pdfjpg = Server.MapPath(pdfjpgPath);

        //PDF文件路径,相对目录即可
        string pdfPath = @"/Content/Template/fapiao.pdf";
        string pdfRealPath = Server.MapPath(pdfPath);

        //如果不存在,则生成,否则返回已生成的文件
        if(!FileUtil.IsExistFile(pdfjpg))
        {          
          //破解
          ModifyInMemory_Spire.ActivateMemoryPatching();
          PdfDocument doc = new PdfDocument(pdfRealPath);
          var image = doc.SaveAsImage(0, Spire.Pdf.Graphics.PdfImageType.Bitmap, 300, 300);
          FileUtil.BytesToFile(ImageHelper.ImageToBytes(image), pdfjpg);
        }
        //存储一个路径
        info.SavePath = pdfjpgPath;//修改使用这个属性返回使用

最后返回对应的Json信息即可

//序列号返回对象信息
        string result = JsonConvert.SerializeObject(info, Formatting.Indented);
        return Content(result);

我们在页面视图中,通过ajax请求处理即可实现图片的动态显示了。

//刷新列表
  var ID = '';
  function Refresh() {
    var filename = $("#WHC_FileName").val();
    //获取或生成对应的PDF文件,根据路径显示
    $.getJSON("/PdfView/FindByFileName?r=" + Math.random() + "&name=" + filename, function (info) {
      if (info != '') {
        //获取图片路径,设置显示
        $("#imgfapiao").attr("src", info.SavePath);
      }
    });
  }

最后实现了图片的预览展示。

浅谈实现在线预览PDF的几种解决办法

上面就是我的一个解决思路,如果您有更好的方式解决PDF在线预览问题,欢迎彼此交流。希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 面向对象思想 附源码
Jul 07 Javascript
深入认识javascript中的eval函数
Nov 02 Javascript
JQuery读取XML文件数据并显示的实现代码
Dec 16 Javascript
微博@符号的用户名提示效果。(想@到谁?)
Nov 05 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
Jan 23 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
May 11 Javascript
Javascript冒泡排序算法详解
Dec 03 Javascript
jQuery满意度星级评价插件特效代码分享
Aug 19 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
Nov 16 Javascript
js实现索引图片切换效果
Nov 21 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
VUE脚手架具体使用方法
May 20 Javascript
如何利用JavaScript编写更好的条件语句详解
Aug 10 #Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
Aug 10 #Javascript
js实现计算器功能
Aug 10 #Javascript
js实现盒子拖拽动画效果
Aug 09 #Javascript
js实现盒子移动动画效果
Aug 09 #Javascript
js实现弹窗效果
Aug 09 #Javascript
js实现表格数据搜索
Aug 09 #Javascript
You might like
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
js 验证身份证信息有效性
2014/03/28 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
2016/05/04 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
js实现抽奖效果
2017/03/27 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
ES6模板字符串和标签模板的应用实例分析
2019/06/25 Javascript
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
为什么说python适合写爬虫
2020/06/11 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
法务专员岗位职责
2014/01/02 职场文书
入股协议书范本
2014/04/14 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
病媒生物防治方案
2014/05/13 职场文书
文明城市创建标语
2014/06/16 职场文书
碧霞祠导游词
2015/02/09 职场文书
整改通知书格式
2015/04/22 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
详解Python 3.10 中的新功能和变化
2021/04/28 Python
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技