存档六月 2017

xlsx.js学习

最近遇到个问题,为了让用户能够快速的上传数据,需要在开发的系统当中使用上传excel文件,一开始很是头疼,各种查资料都是搞不懂是个什么玩意,到底怎么实现也不清楚,经过认真研究后,终于找到了解决的办法,那就是使用了前端xlsx.js这个库。
开始做的时候,根据自己的理解,要进行excel数据的导入操作,那必须先进行文件的上传,然后在进行文件的读取,并把excel文件里面的数据解析出来。可看了xlsx.js的示例,发现它并没有进行上传的操作,而是直接就把文件解析出来了,且可以解析成原生excel格式、json格式还有其他类型格式,我主要用json格式来进行传输,所以主要研究了json格式。
具体实现如下:
1、前端页面中引用xlsx.js文件,xlsx.js文件下载
2、html中添加input标签,这里有两种方式,如果要用直接的选择文件空间,可以直接使用
的形式来进行操作,如果要用其它的按钮或者空间,可以把file空间设置为隐藏,,然后在通过js调用,触发此file控件的click事件即可。
3、监听file空间的change事件,并进行文件读取及解析
这里还用到的是HTML5中的FileReader()方法,此方法具体内容可自行进行百度。
实现的具体代码如下:

var X = XLSX;
var xl = document.getElementById('xlf');
if(xl.addEventListener){
    console.log(222);
    xl.addEventListener('change', function(e){
        var files = e.target.files;
        var f = files[0];
        var reader = new FileReader();
        var result = {};
        reader.onload = function(e) {
            var data = e.target.result;
            var wb = X.read(data, {type: 'binary'});
            wb.SheetNames.forEach(function(sheetName) {
                var roa = X.utils.sheet_to_row_object_array(wb.Sheets[sheetName]);
                if(roa.length > 0){
                    result[sheetName] = roa;
                }
            });
            var res = JSON.stringify(result, 2, 2);
            console.log(11);
            importExcle(result);
        };
        reader.readAsBinaryString(f);
    });
}

importExcle方法可对数据进行处理,如上传到服务器,或者输出到指定地方。

Vue学习

最近有时间学习vue.js,什么是vue.js,就不在此叙述,官网为 vue.js官网
直接进入主题:
1. 使用webpack进行vue.js项目搭建
首先要安装webpack工具,要全局安装:

# 全局安装 webpack
$ npm install webpack -g
# 全局安装 vue-cli
$ npm install --global vue-cli
# 创建一个基于 webpack 模板的新项目
$ vue init webpack my-project
# 安装依赖,走你
$ cd my-project
$ npm install
$ npm run dev

这样,就创建好了一个基本的vue.js的项目。默认端口为8080,在本机上访问http://localhost:8080即可看到主页面。

  1. 使用vue-router插件实现路由功能
    进入到my-project目录下,使用以下命令进行安装vue-router插件安装
    $ npm install vue-router –save-dev
    此处需要添加 —save-dev 的原因,是把此插件包安装到当前目录下的node_modules下,且把相关的安装信息添加到package.json文件的devDependencies字段里,方便包管理。

    (1) 在src目录下,新建routers.js文件,并添加以下内容

export default {
  '/': 'Home',
  '/about': 'About',
  '/svg': 'Svg'
}

(2) src中添加pages目录,用以存放页面文件
(3) 在main.js中代码修改如下

import Vue from 'vue'
import routes from './routes'
const app = new Vue({
  el: '#app',
  data: {
    currentRoute: window.location.pathname
  },
  computed: {
    ViewComponent () {
      const matchingView = routes[this.currentRoute]
      return matchingView
        ? require('./pages/' + matchingView + '.vue')
        : require('./pages/404.vue')
    }
  },
  render (h) {
    return h(this.ViewComponent)
  }
})
window.addEventListener('popstate', () => {
  app.currentRoute = window.location.pathname
})

(4) src中添加layouts目录,用以存放页面综合布局页面。
(5) pages文件夹下新建Home.vue文件,代码如下:

<template>
  <main-layout>
    <p>Welcome home</p>
  </main-layout>
</template>
<script>
  import MainLayout from '../layouts/Main.vue'
  export default {
    components: {
      MainLayout
    }
  }
</script>

(6) layouts目录下新建main.vue文件,代码如下:

<template>
  <div class="container">
    <ul>
      <li>
        <v-link href="/">Home</v-link>
        <v-link href="/about">About</v-link>
        <v-link href="/svg">Svg</v-link>
      </li>
    </ul>
    <slot></slot>
  </div>
</template>
<script>
  import VLink from '../components/VLink.vue'
  export default {
    components: {
      VLink
    }
  }
</script>
<style scoped>
  .container {
    max-width: 700px;
    min-height: 800px;
    margin: 0 auto;
    padding: 15px 30px;
    background: #f9f7f5;
  }
</style>

(7) components目录下新建VLink.vue文件,代码如下:

<template>
  <a
    v-bind:href="href"
    v-bind:class="{ active: isActive }"
    v-on:click="go"
  >
    <slot></slot>
  </a>
</template>
<script>
  import routes from '../routes'
  export default {
    props: {
      href: String,
      required: true
    },
    computed: {
      isActive () {
        return this.href === this.$root.currentRoute
      }
    },
    methods: {
      go (event) {
        event.preventDefault()
        this.$root.currentRoute = this.href
        window.history.pushState(
          null,
          routes[this.href],
          this.href
        )
      }
    }
  }
</script>
<style scoped>
  .active {
    color: cornflowerblue;
  }
</style>

(8) 至此,根目录下运行npm run dev 命令即可项目启动,并自动在浏览器中打开http://localhost:8080页面,即可看到效果,如下:
Vue.js

项目演示地址:http://dw.webshao.com/
github项目地址:https://github.com/Garens/vue

MySQL 5.7.14安装教程

Mysql 5.7.14安装教程

相比之前的mysql版本,5.7版本的mysql,可以说是改变得面目全非,不熟悉的人,安装起来就是完全不知头脑,我也是各种寻求网上教程,才得以解脱。下面就把我的受虐过程分享,让更多得人免受此版本数据库的困扰。

  1. 首先,它是要依赖.net framework的,而且是4.0版本。下面是一个能用的版本链接:
    http://libs.webshao.com/soft/tool/Microsoft.NET.exe

  2. 然后点击msi的安装包,可以看到下面这样的效果:
    MySQL安装1
    此处为保险起见,直接选择full安装,要不然后面步骤就不是一样了。只是说,完全安装的话,就会安装了一些乱七八糟的东西,但此处先不叙说其它安装。

  3. 然后下一步出现这样的界面
    MySQL安装2

  4. 此处要是你直接Next的话,将会出现这样的画面
    MySQL安装3
    所以只能进行execute,先把该装的装上吧!

    后面是一系列的下一步安装,最终会进入到mysql的配置文件配置。那里可以直接添加用户名和密码,也可以后期再进行添加,只是后期的话,没有图形界面,要进入命令模式了。

  5. 安装好后,要进行一些参数的设置,要不然用起来很不舒服。
    首先进行用户名、密码及一系列的设置。如果在配置过程输入过,那可忽略。新版本的MySQL的用户密码不再是password字段,改为了authentication_string字段,当然,设置密码的方法还是一样:
    (1)Cmd进入MySQL:cmd -> mysql –uroot –p
    此处如果无法使用mysql命令,自行环境变量配置。
    MySQL安装4

    如果首次使用,没有设置过用户名密码,则直接回车,设置过,则输入密码进入。
    (2)修改密码和允许外部访问:
    update user set host=”%”,authentication_string=password(‘root’) where user=’root’;
    然后刷新权限:
    FLUSH PRIVILEGES;

    即可用新密码登录,而且其他电脑也能访问了。

    (3)设置最大存储
    寻找到my.ini配置文件,如果在安装目录找不到,那就到C:\ProgramData 目录下面找,记事本打开,在最后添加一下内容:
    [mysqld]
    port=3306
    explicit_defaults_for_timestamp = TRUE
    max_allowed_packet = 64M
    tmp_table_size = 64M
    max_heap_table_size = 64M

    重启服务,单字段存储的内容就可达到64M了,否则数据一大了以后,就会导致崩溃无法添加的现象。

  6. 有的是解压好的安装文件,那就把MySQL添加到系统服务里面
    进入MySQL目录下的bin目录下,
    可先进行初始化
    bin\mysqld –defaults-file=d:\mysql57\my.ini –initialize
    再进行安装服务:
    运行mysqld –install MySQL defaults-file=d:\mysql57\my.ini
    即可安装服务
    MySQL安装5

    最后,提供个MySQL的安装包
    http://libs.webshao.com/soft/tool/mysql-installer-community-5.7.14.0.msi

Webpack学习

Webpack的命令及操作

  1. 首先安装webpack
    Npm install webpack –save-dev

  2. 使用webpack可以打包文件,基本打包方法为:
    webpack hello.js hello.bundle.js
    把hello.js打包为hello.bundle.js

  3. 把相关文件引入到hello.js中,再次打包:
    require(‘./world.js’)
    require(‘./style.css’)

    如果引入了css样式文件,需要安装css-loader,需要把样式也添加到页面当中,需要引入style-loader
    npm install css-loader style-loader –save-dev
    修改require为require(‘style-loader!css-loader!./style.css’)

    或者在打包命令中直接输入
    webpack hello.js hello.boudle.js –module-bind ‘css=style-loader!css-loader’

  4. 自动更新,热加载
    在命令后面添加 –watch 即可实现文件修改后自动编译

  5. webpack的配置文件

module.exports = {
    entry:’./src/script/main.js’,               //需要打包的主文件
    output:{
           path:’./dist/js’,                             //输出路径
           filename:’boudle.js’          //输出文件
    }
}

如果需要定义打包过程的参数,可在npm的package.json文件的script标签中指定,如:
“webpack”:”webpack –config webpack.config.js –progress –display-modules –colors –display-reason” //指定配置文件,看到打包过程,看到打包模块,字是彩色的,打包原因
然后运行npm run webpack 即可。

Entry可以为一个单独的文件或者一个数组,或者对象。
对应的output的filename即可为一个固定文件名或者传入[name],[hash],[chunkhash]

  1. html-webpack-plugin 插件
    (1) 在webpack的配置文件中引入插件;
    var htmlWebpackPlugin = require(‘html-webpack-plugin’);
    (2) 加入plugin参数,内容为:
Plugins:[
    New htmlWebpackPlugin({
        filename:’index-[hash].html’,           //自定义名称
            template: ‘index.html’,              //自定义模板
            inject: ‘head’,                      //自定义存放地方head,body,true,false
            minify: {                            //压缩代码
                removeComments: true,          //删除注释
                collapseWhitespace: true         //删除空格
            }
    })
]

程序员的悲哀

作为一名合格或者不合格的程序员,总会有这样的经历:

人家两三年前就用得滚瓜烂熟的东西,我们在两三年后还以新知识去学习和研究!

程序员讲究的就是与时俱进,不断接受新知识。如果我们连人家两三年前的东西都还不能以新知识去接受,那我们才叫真的落后。所以,以新事物去学习人家三年前的东西并不是一件可耻或者可悲的事情。真正可悲的事,是固步自封,止步不前!
很多人都不会愿意承认自己写的代码有问题,特别是在面对感觉是比自己能力或者等级低的人面前更不愿意承认。然而,久而久之,这样的人会变成什么样的人呢?至少我是不会再去纠正他的错误,甚至不愿意去跟他做同样的东西。在程序界,并没有谁比谁能力高,也没有谁比谁高一等。所谓的高人一等,无非就是多了几年的工作经验,接触的事情多了一点。而真正的技术能力,如果一直都是保持着自己是最棒的的态度,那迟早要被那些不断学习的人超越。因为知识是不断更新换代的,人也如此!
我在学习,我在前行……

Promise学习心得

  • 不知道Promise这个词是什么时候出现的,也有好一段时间接触它了,但是一直对它一知半解,应该是自己的知识未达到理解它的境界,才导致我怎么去看都看不懂的原因。呵呵……我又在乱找原因了!其实是一直都没有心思去认真学习它。今日感觉有些空闲,就特意查了一下相关资料,终于顿悟了这所谓的Promise到底是什么了!
    首先,得先引出学习最受益的文章链接:吕大豹
  • 下面就来总结一下自己对Promise的理解:
    javascript的异步操作,对于刚接触的人或者用得滚瓜烂熟的人,都会一不小心陷入它的回调陷阱中去。于是出现了各种把异步转化为同步的东西,如then.js,async.js等,而这个Promise,其实也相当于这些玩意,只不过是在ES6的规范中,成为了内置的对象了而已。那就好理解了,Promise的最大好处,就是能够处理javascript的异步操作。具体如下:
function test1() {
  var p = new Promise(function (resolve, reject) {
    var num = Math.ceil(Math.random() * 10); //生成1-10的随机数
    if (num <= 5) {
      resolve(num);
    } else {
      reject('数字太大');
    }
  });
  return p;
}
test1().then(function (data) {
  console.log(data);
}).catch(function (data) {
  console.log(data);
});

以上就是一个完整的Promise的使用例子,多次运行,要么输出一个小于等于5的数字,要么输出“数字太大”这一串文字,也就是执行了Promise的resolve方法或者是reject方法,而对应的两个方法,在调用时候是分别进入到then或者catch当中去。这样,就可以轻松处理深层次回调带来的麻烦了。

如果是多个,则可以这样:

function test1(){
  var p = new Promise(function(resolve, reject) {
    var num = Math.ceil(Math.random()*10); //生成1-10的随机数
    if(num <= 5) {
      resolve('test1中的num='+ num);
    } else {
      reject('test1中数字太大');
    }
  });
  return p;
}

function test2() {
  var p = new Promise(function(resolve, reject) {
    var num = Math.ceil(Math.random()*10); //生成1-10的随机数
    if(num >= 5) {
      resolve('test2中的num='+ num);
    } else {
      reject('test2中数字太小');
    }
  });
  return p;
}

function test3() {
  var p = new Promise(function(resolve, reject) {
    var num = Math.ceil(Math.random()*10); //生成1-10的随机数
    if(num === 5) {
      resolve('test3中的num='+ num);
    } else {
      reject('test3中数字不等于5');
    }
  });
  return p;
}

test1().then(function(data) {
  console.log(data);
  return test2();
}).then(function(data) {
  console.log(data);
  return test3();
}).then(function(data) {
  console.log(data);
}).catch(function(data) {
  console.log(data);
});

输出的结果为:

test1中的num=5
test2中的num=6
test3中数字不等于5

当然,如果是test1或者test2就出现reject,则直接进入到catch中,而不会执行以下的代码了。
其中的奥秘,可以自行去体会了……


  • 还有一个有用的玩意,那就shi Promise的all方法,就是把一堆的方法以数组形式放到all当中,然后在then当中会得到方法数组中的结果数组,这样就可以统一处理结果集。其中的意思就是会执行耗时最长的那个方法的那个时间,也就是要等所有方法都执行完了,才会有结果集。也有一个相反的方法,就是race方法,语法相似,是依次得到执行得最快的结果。具体实现方法可以去看大豹的博客,其中的5秒后请求不到图片路径的使用场景值得参考。

print2flash文档在线预览应用(java,.net)

一、背景  


 

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

  开始转换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