一、背景  


  前段时间,LZ的boss突然给了出了这样一个需求:将原项目中的所有文章关联的附件TXT、PDF、office相关文件全部以flash的形式在网页上进行展示,便于预览。看似简单的需求,整个研发小组都懵逼的。LZ也没办法只好Google一把,找了好几套解决方案,基本上是调第三方软件的API,像什么flashpaper、print2flash等等。LZ先试了flashpaper,反正是各种问题,不支持64位系统什么的;print2flash在版本4以前也是很多问题,dll调用失败,dll缺失。最终,LZ在官网下载了最新的版本(商业软件,收费的),用起来还是相对来说比较稳定,至今没出现问题。提供的API还是比较丰富的,本篇LZ主要介绍java和.NET的操作。

二、print2flash安装


  这里LZ为了简单实验主要介绍破解版的安装(费了好大的力才找到的),如果商用,还是给钱找别人买吧。

  1)下载print2flash4.如果想使用服务器模式,大概需要600刀,也不是很贵。官网地址http://print2flash.com/

  2)运行print2flashsetup.exe一直下一步就OK。

  3)下载补丁文件。共3个文件p2fServer.exe,print2f4.exe,Print2FlashPrinter4.dll;如果之前已设置了windows服务方式启动,则先需要停止Print2Flash4服务;拷贝p2fServer.exe、print2f4.exe到安装目标文件夹替换原文件,拷贝Print2FlashPrinter4.dll到以下文件夹替换原始文件:C:\Windows\System32\spool\drivers\x64\以及C:\Windows\System32\spool\drivers\x64\3\

  4)注册print2flash4服务。运行print2flash,options->print2flash service configuration,输入Windows密码,没有的话就不用输,勾选Grant access and launch pemmissions to Everyone给EveryOne用户授予权限。点击OK,如果提示successful,Current status显示Installed表示安装成功。

  5)开启print2flash4服务。安装成功后,在windows服务中可以找到print2flash服务。启动该服务。

三、java操作API


  开始前我们需要将print2flash提供的SDK中的P2FConst.java引入:

  1. public class P2FConst
  2. {
  3. // 枚举常量
  4. public static final int MSEXCEL = 0x00000001;
  5. public static final int MSWORD = 0x00000002;
  6. public static final int MSPOWERPOINT = 0x00000004;
  7. public static final int ACROBAT = 0x00000008;
  8.  
  9. public static final int JPEG = 1;
  10. public static final int PNG = 2;
  11.  
  12. public static final int STRETCH = 1;
  13. public static final int TILE = 2;
  14.  
  15. public static final int INTLOGO = 0x00000001;
  16. public static final int INTDRAG = 0x00000002;
  17. public static final int INTSELTEXT = 0x00000004;
  18. public static final int INTZOOMSLIDER = 0x00000008;
  19. public static final int INTZOOMBOX = 0x00000010;
  20. public static final int INTFITWIDTH = 0x00000020;
  21. public static final int INTFITPAGE = 0x00000040;
  22. public static final int INTPREVPAGE = 0x00000080;
  23. public static final int INTGOTOPAGE = 0x00000100;
  24. public static final int INTNEXTPAGE = 0x00000200;
  25. public static final int INTSEARCHBOX = 0x00000400;
  26. public static final int INTSEARCHBUT = 0x00000800;
  27. public static final int INTROTATE = 0x00001000;
  28. public static final int INTPRINT = 0x00002000;
  29. public static final int INTNEWWIND = 0x00004000;
  30. public static final int INTHELP = 0x00008000;
  31. public static final int INTBACKBUTTON = 0x00030000;
  32. public static final int INTBACKBUTTONAUTO = 0x00010000;
  33. public static final int INTFORWARDBUTTON = 0x000C0000;
  34. public static final int INTFORWARDBUTTONAUTO = 0x00040000;
  35. public static final int INTFULLSCREEN = 0x00300000;
  36. public static final int INTFULLSCREENAUTO = 0x00100000;
  37.  
  38. // METADATAPORMAT enumeration constants
  39. public static final int XML = 1;
  40. public static final int TEXT = 2;
  41.  
  42. // OUTPUTFORMAT enumeration constants
  43. public static final int SINGLEFILE = 1;
  44. public static final int SINGLEFILEPERPAGE = 2;
  45. public static final int EXTVIEWER = 4;
  46.  
  47. // PAPER_ORIENTATION enumeration constants
  48. public static final int ORIENT_PORTRAIT = 1;
  49. public static final int ORIENT_LANDSCAPE = 2;
  50.  
  51. // PROTECTION_OPTION enumeration constants
  52. public static final int PROTDISPRINT = 0x00000001;
  53. public static final int PROTDISTEXTCOPY = 0x00000002;
  54. public static final int PROTENAPI = 0x00000004;
  55.  
  56. // ThreeStateFlag enumeration constants
  57. public static final int TSF_NO = 0;
  58. public static final int TSF_YES = 1;
  59. public static final int TSF_AUTO = 2;
  60.  
  61. // TOOLBARIMAGE enumeration constants
  62. public static final int IMGLOGO = 1;
  63. public static final int IMGDRAG = 2;
  64. public static final int IMGSELTEXT = 3;
  65. public static final int IMGZOOMRULER = 4;
  66. public static final int IMGZOOMFOCUSNADLE = 5;
  67. public static final int IMGZOOMNADLE = 6;
  68. public static final int IMGFITWIDTH = 7;
  69. public static final int IMGFITPAGE = 8;
  70. public static final int IMGPREVPAGE = 9;
  71. public static final int IMGNEXTPAGE = 10;
  72. public static final int IMGSEARCHBUT = 11;
  73. public static final int IMGROTATE = 12;
  74. public static final int IMGPRINT = 13;
  75. public static final int IMGNEWWIND = 14;
  76. public static final int IMGHELP = 15;
  77. public static final int IMGMORE = 16;
  78. public static final int IMGTOOLBARBGR = 17;
  79. public static final int IMGBACK = 18;
  80. public static final int IMGFORWARD = 19;
  81. public static final int IMGFULLSCREEN = 20;
  82. public static final int IMGEXITFULLSCREEN = 21;
  83.  
  84. // TEMPLATETYPE enumeration constants
  85. public static final int TEMPLATE_CUSTOM = 1;
  86. public static final int TEMPLATE_ACTIONSCRIPT2 = 2;
  87. public static final int TEMPLATE_ACTIONSCRIPT3 = 3;
  88.  
  89. // WATERMARKANCHOR enumeration constants
  90. public static final int CENTER = 0;
  91. public static final int LEFTCENTER = 1;
  92. public static final int RIGHTCENTER = 2;
  93. public static final int TOPCENTER = 16;
  94. public static final int BOTTOMCENTER = 32;
  95. public static final int LEFTTOP = 17;
  96. public static final int RIGHTTOP = 18;
  97. public static final int LEFTBOTTOM = 33;
  98. public static final int RIGHTBOTTOM = 34;
  99.  
  100. // COMPRESSION_METHOD enumeration constants
  101. public static final int COMPRESSION_METHOD_ZLIB = 0;
  102. public static final int COMPRESSION_METHOD_LZMA = 1;
  103.  
  104. // DOCUMENT_TYPE Enumeration constants
  105. public static final int FLASH = 1;
  106. public static final int HTML5 = 2;
  107.  
  108. // BROWSER_TYPE Enumeration public static final intants
  109. public static final int INTERNET_EXPLORER = 1;
  110. public static final int FIREFOX = 2;
  111. public static final int CHROME = 4;
  112. public static final int OPERA = 8;
  113. public static final int SAFARI = 16;
  114.  
  115. // POWERPOINT_PRINTOUTPUT Enumeration constants
  116. public static final int POWERPOINT_PRINTOUTPUT_AUTO = 0;
  117. public static final int POWERPOINT_PRINTOUTPUT_Slides = 1;
  118. public static final int POWERPOINT_PRINTOUTPUT_TwoSlideHandouts = 2;
  119. public static final int POWERPOINT_PRINTOUTPUT_ThreeSlideHandouts = 3;
  120. public static final int POWERPOINT_PRINTOUTPUT_SixSlideHandouts = 4;
  121. public static final int POWERPOINT_PRINTOUTPUT_NotesPages = 5;
  122. public static final int POWERPOINT_PRINTOUTPUT_Outline = 6;
  123. public static final int POWERPOINT_PRINTOUTPUT_BuildSlides = 7;
  124. public static final int POWERPOINT_PRINTOUTPUT_FourSlideHandouts = 8;
  125. public static final int POWERPOINT_PRINTOUTPUT_NineSlideHandouts = 9;
  126. public static final int POWERPOINT_PRINTOUTPUT_OneSlideHandouts = 10;
  127. }

  开始转换Test.java类:

  1. package print2flash;
  2.  
  3. import java.io.IOException;
  4.  
  5. import com.jacob.activeX.*;
  6. import com.jacob.com.*;
  7.  
  8. public class Test {
  9.  
  10. public static void main(String[] args) throws IOException {
  11. try {
  12. ComThread.InitSTA();//com组件管理,用来初始化com线程,释放线程
  13. ActiveXComponent p2f = new ActiveXComponent("Print2Flash4.Server");//创建print2flash的一个应用,调用print2flash服务
  14. //设置属性值,可根据自己需求修改
  15. ActiveXComponent defProfile = new ActiveXComponent(p2f.getProperty("DefaultProfile").toDispatch());
  16. defProfile.setProperty("InterfaceOptions", P2FConst.INTLOGO | P2FConst.INTZOOMSLIDER | P2FConst.INTPREVPAGE
  17. | P2FConst.INTGOTOPAGE | P2FConst.INTNEXTPAGE);
  18. defProfile.setProperty("ProtectionOptions", P2FConst.PROTDISPRINT | P2FConst.PROTENAPI);
  19. defProfile.setProperty("DocumentType", P2FConst.FLASH | P2FConst.HTML5);
  20. p2f.invoke("ConvertFile", "E:/print2flashTest/test.doc");//方法调用
  21. System.out.println("转换成功!");
  22. } catch (Exception e) {
  23. System.out.println("转换异常: " + e.toString());
  24. } finally {
  25. ComThread.Release();
  26. }
  27. }
  28. }

  注意:这里涉及到java应用调用windows的COM组件,需要用到jacob,没有的同学,可以用LZ提供的链接地址下载(文章最后会一起附上)。

  1)将jacob.jar build path。

  2)将jacob-1.16-M1-x64.dll(根据自己系统情况选择)复制到jre/bin目录(如果没有该dll,会抛出找不到ComThread类异常)

  接下来LZ准备一个test.doc,来进行测试:

  

  test.docx.swf即为生成的flash文件,可嵌入到你需要的网页中。

四、.NET操作API


  .NET的操作相对来说就简单得多了,LZ这里也是只做一个简单的win32控制台演示:

  1)首先新建win32控制台应用程序,增加程序集Interop.Print2Flash4.dll。

  2)在Proogram.cs中写具体业务逻辑:  

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6.  
  7. namespace Test
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. string fs_filename = System.AppDomain.CurrentDomain.BaseDirectory()+"/print2flashTest/test.docx";
  14. string fs_convertedfilename = System.AppDomain.CurrentDomain.BaseDirectory()+"/print2flashTest/swf/test.swf";
  15. Print2Flash4.Server2 p2fServer = new Print2Flash4.Server2();//创建print2flash对象
  16. //设置参数值,可以参考官网SDK文档
  17. p2fServer.ConvertFile(fs_filename, fs_convertedfilename, null, null, null);
  18. }
  19. }
  20. }

  运行结果与java一样。官网SDK还提供了ASP、PHP等脚本语言的操作API,有情趣的同学可以自己尝试一下。

  

五、总结


  print2flash这款软件还是不错的,转换后的效果比较清晰。运用范围差不多就是内容管理系统、文章管理等附件的预览,当然也可以用来控制游客用户不允许文字复制等等。最后附上本文LZ所用到的源代码,补丁,附件的下载地址:

  源代码:https://github.com/LJunChina/JavaResource/tree/master/print2flash

  print2flash4补丁:http://download.csdn.net/detail/qq503665965/9860438

  jacob:http://download.csdn.net/detail/qq503665965/9860441

  SDK:http://download.csdn.net/detail/qq503665965/9860435

  

print2flash文档在线预览应用(java,.net)的更多相关文章

  1. Print2flash在.NET(C#)64位中的使用,即文档在线预览

    转:http://www.cnblogs.com/flowwind/p/3411106.html Print2flash在.NET(C#)中的使用,即文档在线预览   office文档(word,ex ...

  2. Java+FlexPaper+swfTools仿百度文库文档在线预览系统设计与实现

    笔者最近在给客户开发文档管理系统时,客户要求上传到管理系统的文档(包括ppt,word,excel,txt)只能预览不允许下载.笔者想到了百度文库和豆丁网,百度文库和豆丁网的在线预览都是利用flash ...

  3. Java+FlexPaper+swfTools 文档在线预览demo

    1.概述 主要原理 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 2.通过swfTools将pdf文件转换成swf格式的文件 3.通过FlexP ...

  4. Java实现word文档在线预览,读取office文件

    想要实现word或者其他office文件的在线预览,大部分都是用的两种方式,一种是使用openoffice转换之后再通过其他插件预览,还有一种方式就是通过POI读取内容然后预览. 一.使用openof ...

  5. java 实现word文档在线预览

    一.准备工具 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 下载地址:http://www.openoffice.org/download/in ...

  6. asp.net如何实现word文档在线预览

    原文:asp.net如何实现word文档在线预览 实现方式:office文档转html,再在浏览器里面在线浏览 1.首先引入com组件中office库,然后在程序集扩展中引入word的dll 2.将M ...

  7. 文档在线预览开源实现方案二:OpenOffice + pdf.js

    文档在线预览的另一种实现方式采用的技术栈是OpenOffice + pdf.js, office文档转换为pdf的工作依然由OpenOffice的服务来完成,pdf生成后我们不再将其转换为其他文件而是 ...

  8. 文档在线预览开源实现方案一:OpenOffice + SwfTools + FlexPaper

    在文档在线预览方面,项目组之前使用的是Microsoft office web apps, 由于该方案需要按照微软License付费,项目经理要我预研一个文档在线预览的开源实现方案.仔细钻入该需求发现 ...

  9. 最好用的js前端框架、组件、文档在线预览插件

    这里收集的都是个人认为比较好的js框架.组件 js前端ui框架 此处列举出个人认为最好的几个框架(排序即排名),现在好点的框架商用都需要付费,以下几个也不例外,但是由于组件丰富,都可以作为企业应用的完 ...

随机推荐

  1. android项目结构

  2. 09-伪数组 arguments

    arguments代表的是实参.有个讲究的地方是:arguments只在函数中使用. (1)返回函数实参的个数:arguments.length 例子: fn(2,4); fn(2,4,6); fn( ...

  3. oracle:储存过程实现分页

    CREATE OR REPLACE PACKAGE PKG_QUERY IS -- Author : ADMINISTRATOR -- Created : 2016/12/8 星期四 10:28:37 ...

  4. 前端开发必须知道的JS(一) 原型和继承

    原型和闭包是Js语言的难点,此文主要讲原型及原型实现的继承,在(二)中会讲下闭包,希望对大家有所帮助.若有疑问或不正之处,欢迎提出指正和讨论. 一. 原型与构造函数 Js所有的函数都有一个protot ...

  5. raindi python魔法函数(一)之__repr__与__str__

    __repr__和__str__都是python中的特殊方法,都是用来输出实例对象的,如果没有定义这两个方法在打印的时候只会输出实例所在的内存地址 这种方式的输出没有可读性,并不能直观的体现实例.py ...

  6. jade(pug)学习和使用

    由于版权问题,现已改名pug.但无须担心,几乎没什么区别.就算依然使用jade也不会有太大影响. 慢慢迁移过渡即可   # 官网 https://pugjs.org # github https:// ...

  7. composer 安装依赖缓慢,查看 composer 的详细执行日志

    在 windows WSL 上安装 composer 依赖 composer install 发现执行异常缓慢,怀疑没有走国内的镜像,而是直接访问的 github. 需要能看到 composer 的执 ...

  8. python 全栈开发,Day15(递归函数,二分查找法)

    一.递归函数 江湖上流传这这样一句话叫做:人理解循环,神理解递归.所以你可别小看了递归函数,很多人被拦在大神的门槛外这么多年,就是因为没能领悟递归的真谛. 递归函数:在一个函数里执行再调用这个函数本身 ...

  9. 正确停止线程的方式三 使用Thread类中的内置的中断标记位-----------不熟悉

    package charpter10; public class Processor implements Runnable { @Override public void run() { for ( ...

  10. (第4篇)hadoop之魂--mapreduce计算框架,让收集的数据产生价值

    摘要: 通过前面的学习,大家已经了解了HDFS文件系统.有了数据,下一步就要分析计算这些数据,产生价值.接下来我们介绍Mapreduce计算框架,学习数据是怎样被利用的. 博主福利 给大家赠送一套ha ...