浅谈实现在线预览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 相关文章推荐
从sohu弄下来的flash中展示图片的代码
Apr 27 Javascript
封装的原生javascript弹出层代码
Sep 24 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
Apr 25 Javascript
javascript类型系统 Window对象学习笔记
Jan 07 Javascript
jQuery使用经验小技巧(推荐)
May 31 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
Jun 07 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
Dec 05 Javascript
bootstrap table动态加载数据示例代码
Mar 25 Javascript
Vue.js实现图片的随意拖动方法
Mar 08 Javascript
Vue内部渲染视图的方法
Sep 02 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 Javascript
纯JS开发baguetteBox.js响应式画廊插件
Jun 28 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中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
php输入流php://input使用示例(php发送图片流到服务器)
2013/12/25 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
PHP 实现重载
2021/03/09 PHP
JQuery中getJSON的使用方法
2010/12/13 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
js重写方法的简单实现
2016/07/10 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
python操作字典类型的常用方法(推荐)
2016/05/16 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
Pureology官网:为染色头发打造最好的产品
2019/09/13 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
你所在的项目是如何确定版本号的
2015/12/28 面试题
销售员自我评价怎么写
2013/09/19 职场文书
资深生产主管自我评价
2013/09/22 职场文书
给排水工程师岗位职责
2013/11/21 职场文书
大专生的学习自我评价
2013/12/04 职场文书
领导调研接待方案
2014/02/27 职场文书
工作推荐信范文
2014/05/10 职场文书
计划生育个人总结
2015/03/02 职场文书
导游词之广西漓江
2019/11/02 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL