zoukankan      html  css  js  c++  java
  • FlashPaper 使用经验之谈

    李志海  20101229  QQ:76855049

    CSDN:资源下载地址:http://lizhihai_99.download.csdn.net/

    http://download.csdn.net/source/2947794

    一、目的

    我的这篇文章侧重点是如何很好的应用FlashPaper,不是告诉大家FlashPaper是什么。

    二、FlashPaper介绍(从百科里面摘的)

    FlashPaper 是Macromedia推出的一款电子文档类工具,通过使用本程序,你可以将需要的文档通过简单的设置转换为SWF格式的Flash动画,原文档的排版样式和字体显示不会受到影响,这样做的好处是不论对方的平台和语言版本是什么,都可以自由的观看你所制作的电子文档动画,并可以进行自由的放大,缩小和打印,翻页等操作,对文档的传播非常有好处,而且由于Flash动画的普及性和强大的可调节性,可以让你制作出非常漂亮的专业电子文档!

    三、所需软件

    l  Windows 系列操作系统

    l  FlashPaper2.2 绿色版就行。网上有,或者到我的csdn上下载

    l  Office 2010 建议装最新版本的,我以前装的是2007感觉不是很好。

    l  AdobeReader 最新版本

    四、转化程序

    转化程序是通过cmd调用的FlashPrinter.exe这个命令执行的。转化程序注意几点:

    l  把要转化的文件放入队列,保证程序一个一个的执行转化。

    l  转化完成后让程序延迟一会,再执行下一个

    主要代码如下:

    String tmpOutFile = outFile.getPath().concat(File.separator)

                         .concat(

                                inFile.getName()

                                       .replaceAll("[.]{1}.*$", ".swf"));

                  fileInst = new File(tmpOutFile);

                  List<String> commandArray = new ArrayList<String>();

                  commandArray.add(defaultCommand);

                  commandArray.add(inFile.getPath());

                  commandArray.add("-o");

                  commandArray.add(tmpOutFile);

                  ProcessBuilder pbObj = new ProcessBuilder();

                  pbObj.command(commandArray);

                  Map<String, String> envMap = pbObj.environment();

                  envMap.clear();

                  envMap.putAll(System.getenv());

                  pbObj.directory(outFile);

                  pbObj.redirectErrorStream(true);

                  boolean b = false;

                  Process proObj = null;

                  try {

                      proObj = pbObj.start();

                      final InputStream ins = proObj.getInputStream();

                      final ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

                      Thread th = new Thread() {

                         public void run() {

                             ReadableByteChannel rbcObj = Channels

                                    .newChannel(ins);

                             try {

                                while (rbcObj.read(byteBuffer) != -1) {

                                    byteBuffer.flip();

                                    logger.info(java.nio.charset.Charset

                                           .defaultCharset()

                                           .decode(byteBuffer));

                                    byteBuffer.clear();

                                }

                             } catch (IOException e) {

                                logger.error(e);

                             }

                         }

                      };

                      th.setDaemon(true);

                      th.start();

                      try {

                         proObj.waitFor();

                         b = true;

                      } catch (InterruptedException e) {

                         logger.error(e);

                      }

    // 休息

                      Thread.sleep(30 * 1000);

                  } catch (Exception e) {

                      logger.error("执行出错了");

                      logger.error(e);

                  } finally {

                      if (proObj != null) {

                         proObj.destroy();

                      }

                      ManagerThread.getInstance().doNext(b, resFileConvert);

                  }

    注意:别人有写好的FlashPaper4Java可以参考一下。这个网上也有,或到我的csdn上下载。

    五、进程实护

    用FlashPaper做转化一定要注意进程实护问题。因为FlashPaper用的是打印原理。同一台机器,同一时间只能有一个进程在执行。其它的只能是等待。另外在打印的时候可能会出现“卡纸”问题,需要程序去实时监控。

    我的进程实护程序是用c#写的,每隔一段时间去看进程运行时间是不是超过了你设定的时间,如果超过了,就杀掉。主要代码如下:

    foreach (Process print in Process.GetProcessesByName("FlashPrinter"))

                {

                    if (((TimeSpan)(DateTime.Now - print.StartTime)).TotalMinutes > 3)

                    {

                        print.Kill();

                    }

                }

    进程实护程序用c/s程序写。写完后把它加到启动项里,每次重启机就不用关了。

    六、Flex加载FlashPaper

    上面是说如何把文件转化为 swf的。下面我们来说如何把文件展现出来。我目前用的是方法一。

    方法一:SWFLoader加载,加载完后改变它的大小。

    如果直接用SWFLoader加载的话,加载出的界面很小,不会按父容器的大小去自动变化。所以要给它加一个监听器,加载完后再去改变它的大小。如下:

    <mx:SWFLoader id="swfLoader" width="700" height="520" bottom="10" top="10" left="10" right="10"/>

    Private function init():void{

        swfLoader.addEventListener(Event.INIT, initHandle);  

    }

    private function initHandle(e : Event) : void {  

        swfLoader.getChildAt(0).width=pWidth;

        swfLoader.getChildAt(0).height=pHeight;

    }

    优点:打开多个浏览器都不会影响其正常显示。与方法二的区别

    缺点:文件会有点变形。

    方法一:SWFLoader加载,通过LocationConnction与FlashPaper进行通信,调用其内部方法,改变其大小。

    优点:不能同时打开多个文件,因为LocationConnction通道已经被第一占用了。

    缺点:文件不会变形。

    七、破解FlashPaper的自带的商标

    FlashPaper2.2/Interface文件夹下有DefaultViewer2.swf文件,把其替换成自己的皮肤就可以。

    八、.NET程序(运行在IIS中)会遇到权限问题:

    解决办法是,修改IIS的程序池的运行用户的权限。

    1.把networkservice这个用户加到管理员组

    2.把IIS的运行账户换成你的管理员账户。如下图:



    注明:关于第五和第八条是我的一个网名叫“星”的朋友提供的解决思路,在这里非常感谢他。

    现在我的应用程序很稳定,如果大家按照上面的思路去做会很快的应用起来。我在应用的过程中遇到了很多困难,写这篇文章就是为了让朋友们少走弯路。

  • 相关阅读:
    批处理命令之实现修改环境变量的值
    【hihocoder 1304】搜索一·24点
    【hihocoder 1297】数论四·扩展欧几里德
    【hihocoder 1298】 数论五·欧拉函数
    【hihocoder 1303】模线性方程组
    C语言如何动态分配二维数组
    Istream中的函数
    string 与 char * 转换
    boost 系列 1:boost 直接使用
    glog功能介绍 一分钟 51CTO技术博客
  • 原文地址:https://www.cnblogs.com/zhwl/p/3756474.html
Copyright © 2011-2022 走看看