- 浏览: 149903 次
- 性别:
- 来自: 北京
文章分类
最新评论
在使用swftools工具作转换时,最需要注意的是对转换过程中的输入流的处理和出错流的处理。不然,若对流入流(转换过程中会产生的输入流信息有类似如下:NOTICE processing PDF page 10 (595x842:0:0) (move:0:0)等等的打印时提示信息)处理,那么,转换不能进行下去,线程会堵塞,而不对出错流进行处理,那么当遇到有加密和损坏的文件转换时,也会导致线程的堵塞。对于输入流和出错流的处理,简单处理如下:
- //注意destPath最后必须带文件分隔符
- //这个用来转换的swfTool工具,一但待转换的文件有不可识别的字符在里面时,它就会堵塞在那里。这个情况要处理掉
- public String PDF2SWF(String sourcePath, String destPath,String fileName) throws Exception {
- // 目标路径不存在则建立目标路径
- File dest = new File(destPath);
- if (!dest.exists()) {
- dest.mkdirs();
- }
- // 源文件不存在则返回
- File source = new File(sourcePath);
- if (!source.exists()) {
- log.info("pdf转换swf失败,源文件不存在!");
- throw new Exception();
- }
- //因为下面进行系统调用,这样就会把系统执行的操作新开启一个线程(在此linux也叫进程),所以它和主扫描程序是独立运行,所以下次还会扫描这个转换中的文件,所以这里要将它设置为不可读,
- source.setReadable(false);
- FileConvertUtil fileConvertUtil = new FileConvertUtil();
- fileName = fileConvertUtil.getFileName(fileName);//获取文件名
- String outputFile = destPath + fileName + ".swf";
- log.debug("开始调用swftools转换pdf文件:" + outputFile);
- List<String> command = new ArrayList<String>();
- command.add(ProjectInit.swftoolsPath);//从配置文件里读取
- command.add("-z");
- // command.add("-B");
- // command.add("rfxview.swf");
- command.add("-s");
- command.add("flashversion=9");
- command.add("-s");
- command.add("poly2bitmap");//加入poly2bitmap的目的是为了防止出现大文件或图形过多的文件转换时的出错,没有生成swf文件的异常
- //windows平台下
- // command.add("languagedir=C:/xpdf/chinese-simplified/");
- command.add(sourcePath);
- command.add("-o");
- command.add(outputFile);
- ProcessBuilder processBuilder = new ProcessBuilder();
- processBuilder.command(command);
- Process process = processBuilder.start();
- dealWith(process);//处理输入流和出错流
- try {
- process.waitFor();//等待子进程的结束,子进程就是系统调用文件转换这个新进程
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- log.debug("转换完成!");
- return outputFile;
- }
- private void dealWith(final Process pro){
- // 下面是处理堵塞的情况
- try {
- new Thread(){
- public void run(){
- BufferedReader br1 = new BufferedReader(new InputStreamReader(pro.getInputStream()));
- String text;
- try {
- while ( (text = br1.readLine()) != null) {
- System.out.println(text);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }.start();
- } catch (Exception e) {
- e.printStackTrace();
- }
- try {
- new Thread(){
- public void run(){
- BufferedReader br2 = new BufferedReader(new InputStreamReader(pro.getErrorStream()));//这定不要忘记处理出理时产生的信息,不然会堵塞不前的
- String text;
- try {
- while( (text = br2.readLine()) != null){
- System.err.println(text);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }.start();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
//注意destPath最后必须带文件分隔符 //这个用来转换的swfTool工具,一但待转换的文件有不可识别的字符在里面时,它就会堵塞在那里。这个情况要处理掉 public String PDF2SWF(String sourcePath, String destPath,String fileName) throws Exception { // 目标路径不存在则建立目标路径 File dest = new File(destPath); if (!dest.exists()) { dest.mkdirs(); } // 源文件不存在则返回 File source = new File(sourcePath); if (!source.exists()) { log.info("pdf转换swf失败,源文件不存在!"); throw new Exception(); } //因为下面进行系统调用,这样就会把系统执行的操作新开启一个线程(在此linux也叫进程),所以它和主扫描程序是独立运行,所以下次还会扫描这个转换中的文件,所以这里要将它设置为不可读, source.setReadable(false); FileConvertUtil fileConvertUtil = new FileConvertUtil(); fileName = fileConvertUtil.getFileName(fileName);//获取文件名 String outputFile = destPath + fileName + ".swf"; log.debug("开始调用swftools转换pdf文件:" + outputFile); List<String> command = new ArrayList<String>(); command.add(ProjectInit.swftoolsPath);//从配置文件里读取 command.add("-z"); // command.add("-B"); // command.add("rfxview.swf"); command.add("-s"); command.add("flashversion=9"); command.add("-s"); command.add("poly2bitmap");//加入poly2bitmap的目的是为了防止出现大文件或图形过多的文件转换时的出错,没有生成swf文件的异常 //windows平台下 // command.add("languagedir=C:/xpdf/chinese-simplified/"); command.add(sourcePath); command.add("-o"); command.add(outputFile); ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command(command); Process process = processBuilder.start(); dealWith(process);//处理输入流和出错流 try { process.waitFor();//等待子进程的结束,子进程就是系统调用文件转换这个新进程 } catch (InterruptedException e) { e.printStackTrace(); } log.debug("转换完成!"); return outputFile; } private void dealWith(final Process pro){ // 下面是处理堵塞的情况 try { new Thread(){ public void run(){ BufferedReader br1 = new BufferedReader(new InputStreamReader(pro.getInputStream())); String text; try { while ( (text = br1.readLine()) != null) { System.out.println(text); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } catch (Exception e) { e.printStackTrace(); } try { new Thread(){ public void run(){ BufferedReader br2 = new BufferedReader(new InputStreamReader(pro.getErrorStream()));//这定不要忘记处理出理时产生的信息,不然会堵塞不前的 String text; try { while( (text = br2.readLine()) != null){ System.err.println(text); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } catch (Exception e) { e.printStackTrace(); } }
但是这里还是有问题的,因为这里调用process.start方法就开启一个线程进文件进行转换,而若还没开启转换,而线程切换,将文件转换的线程交这里对输入流的线程,那么由br1.readLine()读入的数据就是为null,所以这里的对输入流的处理也就起不了作用就会跳出while循环,而这时又将cpu的使用权交给swftools转换时,那么由于它的流入流和出错流没有线程来处理,所以它又会堵塞。因此使用下面的方式来做可以避免这个问题:
- //注意destPath最后必须带文件分隔符
- //这个用来转换的swfTool工具,一但待转换的文件有不可识别的字符在里面时,它就会堵塞在那里。这个情况要处理掉
- public String PDF2SWF(String sourcePath, String destPath,String fileName) throws Exception {
- // 目标路径不存在则建立目标路径
- File dest = new File(destPath);
- if (!dest.exists()) {
- dest.mkdirs();
- }
- // 源文件不存在则返回
- File source = new File(sourcePath);
- if (!source.exists()) {
- log.info("pdf转换swf失败,源文件不存在!");
- throw new Exception();
- }
- //因为下面进行系统调用,这样就会把系统执行的操作新开启一个线程(在此linux也叫进程),所以它和主扫描程序是独立运行,所以下次还会扫描这个转换中的文件,所以这里要将它设置为不可读,
- source.setReadable(false);
- FileConvertUtil fileConvertUtil = new FileConvertUtil();
- fileName = fileConvertUtil.getFileName(fileName);//获取文件名
- String outputFile = destPath + fileName + ".swf";
- log.debug("开始调用swftools转换pdf文件:" + outputFile);
- List<String> command = new ArrayList<String>();
- command.add(ProjectInit.swftoolsPath);//从配置文件里读取
- command.add("-z");
- // command.add("-B");
- // command.add("rfxview.swf");
- command.add("-s");
- command.add("flashversion=9");
- command.add("-s");
- command.add("poly2bitmap");//加入poly2bitmap的目的是为了防止出现大文件或图形过多的文件转换时的出错,没有生成swf文件的异常
- //windows平台下
- // command.add("languagedir=C:/xpdf/chinese-simplified/");
- command.add(sourcePath);
- command.add("-o");
- command.add(outputFile);
- ProcessBuilder processBuilder = new ProcessBuilder();
- processBuilder.command(command);
- Process process = processBuilder.start();
- // dealWith(process);//改用下面的方式来处理:
- InputStreamWathThread inputWathThread = new InputStreamWathThread(process);
- inputWathThread.start();
- ErrorInputStreamWathThread errorInputWathThread = new ErrorInputStreamWathThread(process);
- errorInputWathThread.start();
- try {
- process.waitFor();//等待子进程的结束,子进程就是系统调用文件转换这个新进程
- inputWathThread.setOver(true);//转换完,停止流的处理
- errorInputWathThread.setOver(true);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- log.debug("转换完成");
- return outputFile;
- }
//注意destPath最后必须带文件分隔符 //这个用来转换的swfTool工具,一但待转换的文件有不可识别的字符在里面时,它就会堵塞在那里。这个情况要处理掉 public String PDF2SWF(String sourcePath, String destPath,String fileName) throws Exception { // 目标路径不存在则建立目标路径 File dest = new File(destPath); if (!dest.exists()) { dest.mkdirs(); } // 源文件不存在则返回 File source = new File(sourcePath); if (!source.exists()) { log.info("pdf转换swf失败,源文件不存在!"); throw new Exception(); } //因为下面进行系统调用,这样就会把系统执行的操作新开启一个线程(在此linux也叫进程),所以它和主扫描程序是独立运行,所以下次还会扫描这个转换中的文件,所以这里要将它设置为不可读, source.setReadable(false); FileConvertUtil fileConvertUtil = new FileConvertUtil(); fileName = fileConvertUtil.getFileName(fileName);//获取文件名 String outputFile = destPath + fileName + ".swf"; log.debug("开始调用swftools转换pdf文件:" + outputFile); List<String> command = new ArrayList<String>(); command.add(ProjectInit.swftoolsPath);//从配置文件里读取 command.add("-z"); // command.add("-B"); // command.add("rfxview.swf"); command.add("-s"); command.add("flashversion=9"); command.add("-s"); command.add("poly2bitmap");//加入poly2bitmap的目的是为了防止出现大文件或图形过多的文件转换时的出错,没有生成swf文件的异常 //windows平台下 // command.add("languagedir=C:/xpdf/chinese-simplified/"); command.add(sourcePath); command.add("-o"); command.add(outputFile); ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command(command); Process process = processBuilder.start(); // dealWith(process);//改用下面的方式来处理: InputStreamWathThread inputWathThread = new InputStreamWathThread(process); inputWathThread.start(); ErrorInputStreamWathThread errorInputWathThread = new ErrorInputStreamWathThread(process); errorInputWathThread.start(); try { process.waitFor();//等待子进程的结束,子进程就是系统调用文件转换这个新进程 inputWathThread.setOver(true);//转换完,停止流的处理 errorInputWathThread.setOver(true); } catch (InterruptedException e) { e.printStackTrace(); } log.debug("转换完成"); return outputFile; }
这里将流入流和出错流作为一个监视线程,两个条件作为跳出循环的判断:
1 输入流处理类:
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import org.apache.log4j.Logger;
- //这个类主要用来处理一个系统调用而新创建一个线程或进程执行期间所产生的输入流的处理
- public class InputStreamWathThread extends Thread {
- private Process process = null;
- private boolean over = false;
- private Logger logger = Logger.getLogger(getClass());
- public InputStreamWathThread(Process p) {
- process = p;
- over = false;
- }
- public void run() {
- try {
- if (process == null) {
- logger.info("process为null,无法处理文件转换");
- return;
- }
- //对输入流,可能是一个回车之类的输入
- BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
- while (true) {
- if (process == null || over) {
- logger.info("处理完成");
- break;
- }
- String temp;
- while ((temp = br.readLine()) != null) {
- // logger.info("输入流信息:" + temp);//如这些信息:NOTICE processing PDF page 10 (595x842:0:0) (move:0:0)等等的打印时提示信息
- ;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- logger.info("发生异常" + e.getMessage());
- }
- }
- public void setOver(boolean over) {
- this.over = over;
- }
- }
import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.log4j.Logger; //这个类主要用来处理一个系统调用而新创建一个线程或进程执行期间所产生的输入流的处理 public class InputStreamWathThread extends Thread { private Process process = null; private boolean over = false; private Logger logger = Logger.getLogger(getClass()); public InputStreamWathThread(Process p) { process = p; over = false; } public void run() { try { if (process == null) { logger.info("process为null,无法处理文件转换"); return; } //对输入流,可能是一个回车之类的输入 BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); while (true) { if (process == null || over) { logger.info("处理完成"); break; } String temp; while ((temp = br.readLine()) != null) { // logger.info("输入流信息:" + temp);//如这些信息:NOTICE processing PDF page 10 (595x842:0:0) (move:0:0)等等的打印时提示信息 ; } } } catch (Exception e) { e.printStackTrace(); logger.info("发生异常" + e.getMessage()); } } public void setOver(boolean over) { this.over = over; } }
2 出错流处理类:
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import org.apache.log4j.Logger;
- //这个类主要用来处理一个系统调用而新创建一个线程或进程执行期间所产生的出错流的处理
- public class ErrorInputStreamWathThread extends Thread {
- private Process process = null;
- private boolean over = false;
- private Logger logger = Logger.getLogger(getClass());
- public ErrorInputStreamWathThread(Process p) {
- process = p;
- over = false;
- }
- public void run() {
- try {
- if (process == null) {
- logger.info("process为null,无法处理文件转换");
- return;
- }
- //对出错流的处理
- BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream()));
- while (true) {
- if (process == null || over) {
- logger.info("处理完成");
- break;
- }
- String temp;
- while ((temp = br.readLine()) != null) {
- // logger.info("出错流信息:" + temp);
- ;
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- logger.info("发生异常" + e.getMessage());
- }
- }
- public void setOver(boolean over) {
- this.over = over;
- }
- }
import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.log4j.Logger; //这个类主要用来处理一个系统调用而新创建一个线程或进程执行期间所产生的出错流的处理 public class ErrorInputStreamWathThread extends Thread { private Process process = null; private boolean over = false; private Logger logger = Logger.getLogger(getClass()); public ErrorInputStreamWathThread(Process p) { process = p; over = false; } public void run() { try { if (process == null) { logger.info("process为null,无法处理文件转换"); return; } //对出错流的处理 BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream())); while (true) { if (process == null || over) { logger.info("处理完成"); break; } String temp; while ((temp = br.readLine()) != null) { // logger.info("出错流信息:" + temp); ; } } } catch (Exception e) { e.printStackTrace(); logger.info("发生异常" + e.getMessage()); } } public void setOver(boolean over) { this.over = over; } }
这样就可以使用process的执行完毕后通知输入流类和出错流处理类,这样就可以很好的处理调用swftools转换文件而引起的线程堵塞问题。
发表评论
-
HTTP 头部解释
2011-08-04 15:29 1097HTTP 头部解释 ======== ... -
软件破解小记【转】
2011-07-12 16:46 2906最近突然对软件破解起 ... -
Eclipse插件FatJar安装与使用
2010-12-22 16:00 10333今天启动tomcat发现特别慢,得等1分多钟才启动完,这才想起 ... -
IE Icon If you found this page rendered incorrect, please click this button to
2010-12-15 12:20 1023定义 HTTP状态码(H ... -
PING命令中TTL的具体含义
2010-11-25 15:54 6438D:\Documents and Settings\hx> ... -
eclipse 如何批量导入project
2010-11-25 13:13 2649File > Import > General & ... -
【原创】关于JSTL的多数值Split不准确问题及解决方法
2010-05-12 15:41 3725最近项目中需要对数据做拆分处理的问题,于是乎选择用fn:spl ... -
Java中四种XML解析技术
2010-04-26 15:56 774在平时工作中,难免会遇到把 XML 作为数据存储格式。面对 ... -
jstl应用--从HashMap取值-普通类型和泛型取值
2010-03-01 12:49 4833jstl应用--从HashMap取值: 1.普通类型 假设,r ... -
jdom 根据多个属性查询各节点值
2010-02-26 11:11 1527用XPath.selectSingleNode(root,xp ... -
dom4j通过xpath查询xml
2010-02-26 11:05 2724获取Document SAXReader saxRea ... -
Log4j配置,error级别单独文件输出
2010-02-22 12:42 4742Java代码 #用来作界面显示的...只显 ... -
[原创] jstl字符串去重,简洁方便
2010-02-09 12:57 2594最近项目前端表现采用jstl标签,在处理字符串重复时,不能采用 ... -
java 页面url传值中文乱码问题解决
2010-01-27 18:43 3947中文问题,是在应用中常常遇到的问题。 本节讲的是aja ...
相关推荐
xpdf用来处理swftools将转换pdf中文问题
将其他格式字体转换成swf格式.适用于prezi等软件
将文档转换为swf文件,可在线阅读,类是百度文库!
可以把pdf、txt、word、ppt文件转换为swf格式的文件,
swftools pdf文件转换swf 很实用
使用SWFTools工具完成对pdf格式转换为swf格式的文件
swftools PDF等文档转换SWF工具安装版
包含swftoolswindows版linux版 openOffice+swftools实现office文件转换成swf
Aspose转换WORD,EXCEL,PPT,TXT成PDF文件,swftools转成swf,实现FlexPaper在线浏览
将pdf的文件转换成swf的工具,版本是9.0的,可以去他的网站上去下载最新的
SWFTools是一种实用工具与Adobe Flash文件(SWF文件)工作的集合。 该工具集包括用于阅读的SWF文件,结合他们,和他们建立从其他内容(如图像,声音文件,视频或源代码)程序。 SWFTools是在GPL下发布的。 SWFTools ...
由于公司项目需要实现类似百度文库在线查看文档的功能,所以自己写了一个小工具,定时读取数据库,将需要转换的文档转换为pdf,再按页转换为swf,并生成第一页的缩略图,在页面使用jquery media插件显示swf,以下是...
swftools-2011-01-23-1815.exe是一个很好用的工具,轻而易举将pdf转换成为swf文件格式,方便快捷,支持pdf单页和多页转换
swftools
SWFTools 是一组用来处理 Flash 的 swf 文件的工具包,包括: 1 合并工具 swfcombine 2. 抽取工具 swfextract 3. PDF/JPEG/PNG/AVI/TTF/WAV 到 SWF 的转换工具 :pdf2swf, jpeg2swf, png2swf, avi2swf, font2swf,...
swftools、flexpaper等工具包。swftools用于将pdf转换为swf文件,而flexpaper则可以实现对swf文件的播放,从而实现pdf文件的预览。
pdf转swf,在线阅读需要的一个工具,当你要写在线阅读的时候可以用此工具转换。
linux swftools最新版 将pdf转换为swf的工具包
SWFTools是一种实用工具与Adobe Flash文件(SWF文件)工作的集合。 该工具集包括用于阅读的SWF文件,结合他们,和他们建立从其他内容(如图像,声音文件,视频或源代码)程序。 SWFTools是在GPL下发布的。 SWFTools ...