0、安装环境。可以参考http://www.cnblogs.com/star-studio/archive/2011/12/09/2281807.html 百度关键字 仿百度文库方案
1、借用开源工具flexpaper
2、使用工具类,这个类是前人都已经做好的。在此借用一下!
import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.ConnectException; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; import com.zkhy.fw.core.util.FWLogger; import com.zkhy.web.core.constants.Constants; import com.zkhy.web.core.property.ApplicationConfig; /** * doc docx格式转换 * * @see <a * href="http://www.cnblogs.com/star-studio/archive/2011/12/12/2284417.html">http://www.cnblogs.com/star-studio/archive/2011/12/12/2284417.html</a> */ public class DocConverter { private static FWLogger logger = new FWLogger(); // 环境1:windows 2:linux(涉及pdf2swf路径问题) private static final int SYSTEM_OS = Integer.valueOf(ApplicationConfig.Settings.SystemOs.getValue()); private String fileName; private File pdfFile; private File swfFile; private File docFile; public DocConverter(String fileString) { ini(fileString); } /* 重新设置 file * * @param fileString */ public void setFile(String fileString) { ini(fileString); } /* 初始化 * * @param fileString */ private void ini(String fileString) { fileName = fileString.substring(0, fileString.lastIndexOf(".")); docFile = new File(fileString); pdfFile = new File(fileName + ".pdf"); swfFile = new File(fileName + ".swf"); } /* 转为PDF * * @param file */ private void doc2pdf() throws Exception { if (docFile.exists()) { if (!pdfFile.exists()) { OpenOfficeConnection connection = new SocketOpenOfficeConnection(ApplicationConfig.Settings.OpenOfficeIp.getValue(), Integer.valueOf(ApplicationConfig.Settings.OpenOfficePort.getValue())); try { connection.connect(); DocumentConverter converter = new OpenOfficeDocumentConverter(connection); converter.convert(docFile, pdfFile); // close the connection connection.disconnect(); logger.info("pdf转换成功,PDF输出:" + pdfFile.getPath()); } catch (ConnectException e) { logger.errorText("swf转换异常,openoffice服务未启动!"); throw e; } catch (OpenOfficeException e) { logger.errorText("swf转换器异常,读取转换文件失败"); throw e; } catch (Exception e) { logger.error(e); throw e; } } else { logger.info("已经转换为pdf,不需要再进行转化"); } } else { logger.errorText("swf转换器异常,需要转换的文档不存在,无法转换"); } } /* 转换成swf */ private void pdf2swf() throws Exception { Runtime r = Runtime.getRuntime(); if (!swfFile.exists()) { if (pdfFile.exists()) { if (SYSTEM_OS == Constants.SYSTEM_OS_WINDOWS)// windows环境处理 { try { System.out.println(ApplicationConfig.Settings.Pdf2SwfPath.getValue()); Process p = r.exec(ApplicationConfig.Settings.Pdf2SwfPath.getValue() + " " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9"); logger.info(loadStream(p.getInputStream())); logger.errorText(loadStream(p.getErrorStream())); logger.info(loadStream(p.getInputStream())); if (pdfFile.exists()) { pdfFile.delete(); } if(swfFile.exists())//add by gjf { File contextFile = new File(Constants.swffilesPath.substring(0, Constants.swffilesPath.lastIndexOf(Constants.WEB_SEPARATOR))); if (!contextFile.exists()) { // 创建目录 contextFile.mkdirs(); } File fnew = new File(Constants.swffilesPath); swfFile.renameTo(fnew);//移到项目目录下 swfFile.delete(); logger.info("swf转换成功,文件输出:" + fnew.getPath()); } //end add } catch (Exception e) { logger.error(e); throw e; } } else if (SYSTEM_OS == Constants.SYSTEM_OS_LINUX)// linux环境处理 { try { Process p = r.exec("pdf2swf " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9"); logger.info(loadStream(p.getInputStream())); logger.errorText(loadStream(p.getErrorStream())); logger.info("swf转换成功,文件输出:" + swfFile.getPath()); if (pdfFile.exists()) { pdfFile.delete(); } if(swfFile.exists())//add by gjf 。。。这些是特殊处理,在转换成SWF文件时,文件名和路径中不能有空格,故需要将建好的SWF文件移到TOMCAT目录下。 { File contextFile = new File(Constants.swffilesPath.substring(0, Constants.swffilesPath.lastIndexOf(Constants.WEB_SEPARATOR))); if (!contextFile.exists()) { // 创建目录 contextFile.mkdirs(); } File fnew = new File(Constants.swffilesPath); swfFile.renameTo(fnew);//移到项目目录下 swfFile.delete(); logger.info("swf转换成功,文件输出:" + fnew.getPath()); } } catch (Exception e) { logger.error(e); throw e; } } } else { logger.errorText("pdf不存在,无法转换"); } } else { logger.info("swf已存在不需要转换"); } } static String loadStream(InputStream in) throws IOException { int ptr = 0; in = new BufferedInputStream(in); StringBuffer buffer = new StringBuffer(); while ((ptr = in.read()) != -1) { buffer.append((char) ptr); } return buffer.toString(); } /* 转换主方法 */ public boolean conver() throws Exception { if (swfFile.exists()) { logger.info("swf转换器开始工作,该文件已经转换为swf"); return true; } if (SYSTEM_OS == Constants.SYSTEM_OS_WINDOWS) { logger.debug("swf转换器开始工作,当前设置运行环境windows"); } else if (SYSTEM_OS == Constants.SYSTEM_OS_LINUX) { logger.debug("swf转换器开始工作,当前设置运行环境linux"); } try { doc2pdf(); pdf2swf(); } catch (Exception e) { logger.error(e); throw e; } if (swfFile.exists()) { return true; } else { return false; } } /* 返回文件路径 * * @param s */ public String getSwfPath() { if (swfFile.exists()) { String tempString = swfFile.getPath(); tempString = tempString.replaceAll("\\\\", "/"); return tempString; } else { return ""; } } /* 设置输出路径 */ public void setOutputPath(String outputPath) { if (!outputPath.equals("")) { String realName = fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf(".")); if (outputPath.charAt(outputPath.length()) == '/') { swfFile = new File(outputPath + realName + ".swf"); } else { swfFile = new File(outputPath + realName + ".swf"); } } } }
3、后台调用
在考虑到多用户或者当用户并发操作时,可能会尝试系统响应缓慢,因为要多开转换进程。故这里我采用了一个单例模式,即使用一个队列,每次从来个请求放入队列,后天一个线程监视这个队列,有数据时,就转换。这样的好处,虽然速度慢了,但是减小了服务器的并发压力。
代码如下:
public static Queue<SwfForm> taskQueue = null; //单例 ,SwfForm是根据具体业务,我这里存放的是PPT文件的路径和目标SWF的路径 ///调用处 if (taskQueue == null) { taskQueue = new LinkedList<>(); new fileThread().start(); } if (!taskQueue.offer(swfForm)){// 队列已满 throw new Exception("SWF任务队列已满");// 回滚事务 } //一个内部类,监视线程 class fileThread extends Thread { @Override public void run() { while (true) { if (!taskQueue.isEmpty()) { SwfForm swfForm = taskQueue.poll(); File file = new File(swfForm.getPath()); try { Constants.swffilesPath = ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/") + swfForm.getSwfPath();//为重命名使用。 new DocConverter(file.getPath()).conver(); } catch (Exception e) { taskQueue.offer(swfForm);// 失败后,仍将之前的放入队列 e.printStackTrace(); } } try { Thread.sleep(10000);//休眠 } catch (InterruptedException e) { e.printStackTrace(); } } } }
4、前台代码
showSwf = function(swfFile) { if (!swfFile) { return; } $('#documentViewer').FlexPaperViewer(//div ID { config : { jsDirectory : courseware.swfDirectory,//配置文件路径 SWFFile :swfFile,//要显示的SWF文件 Scale : 0.6, ZoomTransition : 'easeOut', ZoomTime : 0.5, ZoomInterval : 0.2, FitPageOnLoad : true, FitWidthOnLoad : false, FullScreenAsMaxWindow : false, ProgressiveLoading : false, MinZoomSize : 0.2, MaxZoomSize : 5, SearchMatchAll : false, InitViewMode : 'Portrait', RenderingOrder : 'flash', StartAtPage : '', ViewModeToolsVisible : false, ZoomToolsVisible : true, NavToolsVisible : false, CursorToolsVisible : false, SearchToolsVisible : true, WMode : 'window', localeChain: 'zh_CN' }} ); };
5、注意事项
特别注意,这里的文件,只能是PDF ,DOC ,DOCX,PPT,PPTX,xls,xlsx等,千万不能用其它软件更改,我之前就用来WPS改了一个文件,导致我浪费了1个下午的时间。
另外需要注意,文件中,不能有空格。当然这个程序可以处理掉