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

1、在线实现预览的方式

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

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

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

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

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

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

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

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

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

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

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

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

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

2、PDF转换图片进行显示

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

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

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

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

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

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

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

                //判断是否存在PDF生成的图片文件,//生成的jpg文件名为附件的IDstring 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= newPdfDocument(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 = '';functionRefresh() {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的几种解决方案相关推荐

  1. WEB在线预览PDF

    这是我在博客园发表的第一篇文章.以后会陆续把在线预览其他格式文档的解决方案发表出来. 解决思路:把pdf转换成html显示. 在线预览pdf我暂时了解3种解决方案,欢迎大家补充. 方案一: 利用pdf ...

  2. html中在线预览pdf文件之pdf在线预览插件

    html中在线预览pdf文件之pdf在线预览插件 最近遇到一个需求,要在html页面查看pdf生成的pdf文件! 翻来覆去找到两种办法 ,最后采用了jquery.media.js插件 方式一 将pdf ...

  3. 网页嵌入pdf、在线预览pdf工具及插件(转)

    摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如下: 代码片段1: 1 <object ty ...

  4. html做在线预览pdf文件,html中在线预览pdf文件之pdf在线预览插件

    html中在线预览pdf文件之pdf在线预览插件 最近遇到一个需求,要在html页面查看pdf生成的pdf文件! 翻来覆去找到两种办法 ,最后采用了jquery.media.js插件 方式一 将pdf ...

  5. android 在线预览pdf文件

    android原生webView不支持预览pdf文件,ios却可以,所以android想要实现在线预览webView要通过其他方法,有以下几种方法: 1.andorid原生自带的pdf管理库,主要提供 ...

  6. html 在线预览pdf功能,html中在线预览pdf文件之pdf在线预览插件

    html中在线预览pdf文件之pdf在线预览插件 最近遇到一个需求,要在html页面查看pdf生成的pdf文件!javascript 翻来覆去找到两种办法 ,最后采用了jquery.media.js插 ...

  7. html5 pdf.js 使用方法,PDF 文件在线预览(pdf.js 使用教程)

    因项目开发需要在线展示 PDF文件,为解决 PDF文件 在浏览器打开后电子签章.电子签名等展示不全且部分浏览器兼容问题特利用pdf.js解决该问题: pdf.js框架为HTML5,无需任何本地支持,兼 ...

  8. html浏览pdf文件,HTML网页在线预览PDF文件

    image.png image.png 今日工作需要,需要在线预览PDF文件,so,做了个研究,下面将网页在线预览pdf的方法做个梳理,大家共同学习成长吧 方法分为三种 1. 方法1-embed标签 ...

  9. #网页中动态嵌入PDF文件/在线预览PDF内容#

    摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如下: 代码片段1: 1 <object ty ...

最新文章

  1. NODEJS项目实践0.4 [domain,pm2,log4js,md5]
  2. 4位快速加法器和4位串行加法器相比_使用混合信号示波器调试串行总线系统
  3. 【机器人操作系统】ROS话题编程
  4. Too many open files故障解决一例
  5. 手机号码归属地批量查询功能
  6. 【2020年领域新星】 Ruibo Liu 达特茅斯学院
  7. [转]关于uboot的main_loop
  8. 【 数理逻辑 二 】逻辑概述、现代逻辑学发展历程和形式系统与形式语言
  9. KEIL5报错error: #67: expected a “}“
  10. php is numeric用法,PHP使用 is_numeric的实例解析
  11. 看完这篇AI算法和笔记,跟面试官扯皮没问题了 | 基于深度学习和传统算法的人体姿态估计
  12. 为什么企业选择局域网即时通讯软件?局域网即时通讯软件哪家好?
  13. Python 列表元组拆分为多个列表
  14. Python标准-模块版本号命名-PEP-396PEP-386
  15. ringbuff | 通用FIFO环形缓冲区实现库
  16. HarmonyOS实战 —基于hi3861芯片鸿蒙2.0的避坑指南
  17. R语言kmeans聚类提示:Warning message:10迭代仍没有聚合
  18. 【陈工笔记】# 微信小程序,初始平台搭建 #
  19. pmp练习题及答案解析
  20. 两套供左撇子人士使用的鼠标指针(带自动安装inf文件)

热门文章

  1. 【Linux Socket 编程入门】06 - 拉个骡子溜溜:UDP编程模型代码分析
  2. 面试别向HR说这六种离职原因
  3. android中textview记录日志,Android中TextView属性全纪录
  4. 试题 历届试题 对局匹配
  5. RSD 99脚本语言拼接屏幕墙实像元显示程序剖析
  6. Servlet 3 HttpServletRequest HttpServletResponse 验证码图片 form表单
  7. vue+uni-app商城实战 | 第一篇:从0到1快捷开发一个商城微信小程序,无缝接入OAuth2实现一键授权登录
  8. 记:应聘深信服科技 C++工程师(南京)
  9. 【ESP32 乐鑫 离线环境搭建】
  10. R语言中用ggplot2做泡泡图