浅谈实现在线预览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 相关文章推荐
jQuery中removeProp()方法用法实例
Jan 05 Javascript
解析javascript瀑布流原理实现图片滚动加载
Mar 10 Javascript
JS转换HTML转义符的方法
Aug 24 Javascript
webuploader模态框ueditor显示问题解决方法
Dec 27 Javascript
原生js实现密码输入框值的显示隐藏
Jul 17 Javascript
webpack2.0配置postcss-loader的方法
Aug 17 Javascript
vue mint-ui学习笔记之picker的使用
Oct 11 Javascript
使用ajax的post同步执行(实现方法)
Dec 21 Javascript
javascript将json格式数组下载为excel表格的方法
Dec 22 Javascript
微信小程序scroll-x失效的完美解决方法
Jul 18 Javascript
Node.js API详解之 util模块用法实例分析
May 09 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
Nov 04 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 数组的一个悲剧?
2011/05/11 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
Vue 换肤的示例实践
2018/01/23 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
关于Python如何避免循环导入问题详解
2017/09/14 Python
python图书管理系统
2020/04/05 Python
详解多线程Django程序耗尽数据库连接的问题
2018/10/08 Python
python sort、sort_index方法代码实例
2019/03/28 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
设计部经理的岗位职责
2013/11/16 职场文书
新浪微博实习心得体会
2014/01/27 职场文书
企业读书活动总结
2014/06/30 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
寒山寺导游词
2015/02/03 职场文书
公司门卫岗位职责
2015/04/13 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
杨善洲观后感
2015/06/04 职场文书
运动会广播稿300字
2015/08/19 职场文书