隐藏

FlexPaper+SWFTool+操作类=在线预览PDF

发布:2020/2/18 11:11:09作者:管理员 来源:本站 浏览次数:1196

引言

由于客户有在线预览PDF格式的需求,在网上找了一下解决方案,觉得FlexPaper用起来还是挺方便的,flexpaper是将pdf转换为swf格式的文件预览的,所以flexpaper一般和swftool配合使用,在程序运行时将pdf文件转换为swf格式的文件。

如果flexpaper不满足你的要求,也可以对其进行二次开发,这里推荐两篇文章,希望对您有所帮助:

http://www.cnblogs.com/xcong/archive/2013/06/20/3142155.html

http://www.cnblogs.com/zamlove/archive/2013/05/07/3065079.html

如何使用flexpaper

测试demo项目结构如图

使用的页面代码:

复制代码
 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  2 <!-- saved from url=(0014)about:internet -->  3 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">  4 <head>  5 <title></title>  6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  7 <style type="text/css" media="screen">  8  html, body {  9  height: 100%; 10 } 11 12  body { 13  margin: 0; 14  padding: 0; 15  overflow: auto; 16 } 17 18  #flashContent { 19  display: none; 20 } 21 </style> 22 <!--首先引入相关的js文件--> 23 <script type="text/javascript" src="js/swfobject/swfobject.js"></script> 24 <script type="text/javascript" src="js/flexpaper_flash.js"></script> 25 <!--配置--> 26 <script type="text/javascript"> 27 <!-- For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. --> 28 var swfVersionStr = "10.0.0"; 29 <!-- To use express install, set to playerProductInstall.swf, otherwise the empty string. --> 30 var xiSwfUrlStr = "playerProductInstall.swf"; 31 32 var flashvars = { 33  SwfFile: escape("Paper.swf"), 34  Scale: 0.6, 35  ZoomTransition: "easeOut", 36  ZoomTime: 0.5, 37  ZoomInterval: 0.1, 38  FitPageOnLoad: false, 39  FitWidthOnLoad: true, 40  PrintEnabled: true, 41  FullScreenAsMaxWindow: false, 42  ProgressiveLoading: true, 43  PrintToolsVisible: true, 44  ViewModeToolsVisible: true, 45  ZoomToolsVisible: true, 46  FullScreenVisible: true, 47  NavToolsVisible: true, 48  CursorToolsVisible: true, 49  SearchToolsVisible: true, 50  localeChain: "en_US" 51  }; 52 var params = { 53  } 54  params.quality = "high"; 55  params.bgcolor = "#ffffff"; 56  params.allowscriptaccess = "sameDomain"; 57  params.allowfullscreen = "true"; 58 var attributes = {}; 59  attributes.id = "FlexPaperViewer"; 60  attributes.name = "FlexPaperViewer"; 61  swfobject.embedSWF( 62 "FlexPaperViewer.swf", "flashContent", 63 "650", "500", 64  swfVersionStr, xiSwfUrlStr, 65  flashvars, params, attributes); 66  swfobject.createCSS("#flashContent", "display:block;text-align:left;"); 67 </script> 68 69 </head> 70 <body> 71 <div style="position:absolute;left:10px;top:10px;"> 72 <div id="flashContent"> 73 <p> 74  To view this page ensure that Adobe Flash Player version 75  10.0.0 or greater is installed. 76 </p> 77 <script type="text/javascript"> 78 var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); 79  document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" 80 + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>"); 81 </script> 82 </div> 83 <div id="errNoDocument" style="padding-top:10px;"> 84 Can't see the document? Running FlexPaper from your local directory? Make sure you have added FlexPaper as trusted. You can do that at <a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04a.html#119065">Adobe's website</a>. 85 </div> 86 </div> 87 </body> 88 </html> 
复制代码

效果图

上面的工具栏:打印,全屏等功能可配置。

swftool工具

 操作类(本类来自常用类库,从网上下载的,一搜一大把)

复制代码
 1 using System.Web;  2 using System.Text;  3  4 public static class PSD2swfHelper  5 {  6 /// <summary>  7 /// 转换所有的页,图片质量80%  8 /// </summary>  9 /// <param name="pdfPath">PDF文件地址</param> 10 /// <param name="swfPath">生成后的SWF文件地址</param> 11 public static bool PDF2SWF(string pdfPath, string swfPath) 12  { 13 return PDF2SWF(pdfPath, swfPath, 1, GetPageCount(HttpContext.Current.Server.MapPath(pdfPath)), 80); 14  } 15 16 /// <summary> 17 /// 转换前N页,图片质量80% 18 /// </summary> 19 /// <param name="pdfPath">PDF文件地址</param> 20 /// <param name="swfPath">生成后的SWF文件地址</param> 21 /// <param name="page">页数</param> 22 public static bool PDF2SWF(string pdfPath, string swfPath, int page) 23  { 24 return PDF2SWF(pdfPath, swfPath, 1, page, 80); 25  } 26 27 /// <summary> 28 /// PDF格式转为SWF 29 /// </summary> 30 /// <param name="pdfPath">PDF文件地址</param> 31 /// <param name="swfPath">生成后的SWF文件地址</param> 32 /// <param name="beginpage">转换开始页</param> 33 /// <param name="endpage">转换结束页</param> 34 private static bool PDF2SWF(string pdfPath, string swfPath, int beginpage, int endpage, int photoQuality) 35  { 36 //swftool,首先先安装,然后将安装目录下的东西拷贝到tools目录下 37 string exe = HttpContext.Current.Server.MapPath("~/Bin/tools/pdf2swf.exe"); 38 pdfPath = HttpContext.Current.Server.MapPath(pdfPath); 39 swfPath = HttpContext.Current.Server.MapPath(swfPath); 40 if (!System.IO.File.Exists(exe) || !System.IO.File.Exists(pdfPath) || System.IO.File.Exists(swfPath)) 41  { 42 return false; 43  } 44 StringBuilder sb = new StringBuilder(); 45 sb.Append(" \"" + pdfPath + "\""); 46 sb.Append(" -o \"" + swfPath + "\""); 47 sb.Append(" -s flashversion=9"); 48 if (endpage > GetPageCount(pdfPath)) endpage = GetPageCount(pdfPath); 49 sb.Append(" -p " + "\"" + beginpage + "" + "-" + endpage + "\""); 50 sb.Append(" -j " + photoQuality); 51 string Command = sb.ToString(); 52 System.Diagnostics.Process p = new System.Diagnostics.Process(); 53 p.StartInfo.FileName = exe; 54 p.StartInfo.Arguments = Command; 55 p.StartInfo.WorkingDirectory = HttpContext.Current.Server.MapPath("~/Bin/"); 56 p.StartInfo.UseShellExecute = false; 57 p.StartInfo.RedirectStandardError = true; 58 p.StartInfo.CreateNoWindow = false; 59  p.Start(); 60  p.BeginErrorReadLine(); 61  p.WaitForExit(); 62  p.Close(); 63  p.Dispose(); 64 return true; 65  } 66 67 /// <summary> 68 /// 返回页数 69 /// </summary> 70 /// <param name="pdfPath">PDF文件地址</param> 71 private static int GetPageCount(string pdfPath) 72  { 73 byte[] buffer = System.IO.File.ReadAllBytes(pdfPath); 74 int length = buffer.Length; 75 if (buffer == null) 76 return -1; 77 if (buffer.Length <= 0) 78 return -1; 79 string pdfText = Encoding.Default.GetString(buffer); 80 System.Text.RegularExpressions.Regex rx1 = new System.Text.RegularExpressions.Regex(@"/Type\s*/Page[^s]"); 81 System.Text.RegularExpressions.MatchCollection matches = rx1.Matches(pdfText); 82 return matches.Count; 83  } 84 }
复制代码

然后安装swftool工具,将安装后的目录中的文件拷贝到tools目录下,如图

 

test.asp.cs代码

复制代码
 1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Web;  5 using System.Web.UI;  6 using System.Web.UI.WebControls;  7  8 namespace Wolfy.FlexPaperDemo  9 { 10 public partial class Test : System.Web.UI.Page 11  { 12 protected void Page_Load(object sender, EventArgs e) 13  { 14 //这里需要虚拟路径 15 PSD2swfHelper.PDF2SWF("PDFFile/王牌2_C#_控件查询手册.pdf", "SWFFile/王牌2_C#_控件查询手册.swf"); 16  } 17  } 18 }
复制代码

结果

如何禁用右键中的打印,复制功能

如果pdf保密性强,不让别人复制,打印等该如何?在上面推荐的两篇文章中,他们对其进行了二次开发,禁用了这个功能。非常感谢,那么之后只需将FlexPaperViewer.swf替换就可以了。

原图

替换后的

 

说保密只是相对的,在互联网上,只要能看,别人想盗取还是很容易的事,大不了,一张一张的截图。

总结

互联网,没有绝对安全的,想安全就别放在互联网上显摆,只要想要,总会有办法的。有时候客户的需求真他妈的让人蛋疼。

demo下载:链接:链接:http://pan.baidu.com/s/1hqEpx5a 密码:gupg

swftools-2013-04-09-1007下载:链接:http://pan.baidu.com/s/1c0CvBDA 密码:v38r

  • 博客地址:http://www.cnblogs.com/wolf-sun/
    博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。