浅谈实现在线预览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 相关文章推荐
js实时监听文本框状态的方法
Apr 26 Javascript
jquery mobile事件多次绑定示例代码
Sep 13 Javascript
iframe中子父类窗口调用JS的方法及注意事项
Aug 25 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
May 30 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
Jul 01 Javascript
AngularJS入门教程之数据绑定原理详解
Nov 02 Javascript
jquery实现input框获取焦点的简单实例
Jan 26 Javascript
Vue-Router实现页面正在加载特效方法示例
Feb 12 Javascript
详解vue-cli本地环境API代理设置和解决跨域
Sep 05 Javascript
仿淘宝JSsearch搜索下拉深度用法
Jan 15 Javascript
浅谈vue中.vue文件解析流程
Apr 24 Javascript
Vue+axios实现统一接口管理的方法
Jul 23 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中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
JS中的Replace()传入函数时的用法详解
2017/09/11 Javascript
vue跨域解决方法
2017/10/15 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python实现周期性抓取网页内容的方法
2015/11/04 Python
Python中的日期时间处理详解
2016/11/17 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
对Django url的几种使用方式详解
2019/08/06 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
领导班子对照检查剖析材料
2014/10/13 职场文书
校长师德表现自我评价
2015/03/04 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
入党申请书怎么写?
2019/06/21 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android