首页 > 代码库 > 模仿百度文库

模仿百度文库

---恢复内容开始---

方案:

Txt/Word/Excel/PPT=>PDF(OpenOffice+JodConverter)=>SWF(pdf2swf)=>FlexPaper浏览

第一步:

Txt/Word/Excel/PPT=>PDF(OpenOffice+JodConverter)

准备:

1.下载:Apache_OpenOffice_incubating_3.4.1_Win_x86_install_zh-CN.exe

下载地址:http://www.openoffice.org/download/index.html

2:所需jar包:

 

3:源文件

package com.wyh.toPdf;

import java.io.File;
import java.util.Date;
import java.util.regex.Pattern;

import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;

/**
 * 这是一个工具类,主要是为了使Office全部格式的文档转化为pdf文件
 *
 */
public class Office2PDF {

    /**
     * office中.doc格式
     */
    public static final String OFFICE_DOC = "doc";
    /**
     * office中.docx格式
     */
    public static final String OFFICE_DOCX = "docx";
    /**
     * office中.xls格式
     */
    public static final String OFFICE_XLS = "xls";
    /**
     * office中.xlsx格式
     */
    public static final String OFFICE_XLSX = "xlsx";
    /**
     * office中.ppt格式
     */
    public static final String OFFICE_PPT = "ppt";
    /**
     * office中.pptx格式
     */
    public static final String OFFICE_PPTX = "pptx";
    /**
     * pdf格式
     */
    public static final String OFFICE_TO_PDF = "pdf";

    public static void main(String[] args) {
        Office2PDF office2pdf = new Office2PDF();
        office2pdf.openOfficeToPDF("E:\\Workspaces\\MyEclipse2013\\DataTemp\\baiduwenkuModel\\test002." + OFFICE_DOC, "E:\\Workspaces\\MyEclipse2013\\DataTemp\\baiduwenkuModel\\test002_" + new Date().getTime() + "." + OFFICE_TO_PDF);

    }

    /**
     * 使Office全部格式的文档转化为pdf文件
     * 
     * @param inputFilePath  源文件路径,
     * @param outputFilePath  目标文件路径,
     * @return
     */
    public boolean openOfficeToPDF(String inputFilePath, String outputFilePath) {
        return office2pdf(inputFilePath, outputFilePath);
    }

    /**
     * 根据操作系统的名称,获取OpenOffice.org 3的安装目录<br>
     * 如我的OpenOffice安装在:D:/Program Files (x86)/OpenOffice 4<br>
     * 
     * @return OpenOffice.org 3的安装目录
     */
    public String getOfficeHome() {
        String osName = System.getProperty("os.name");
        if (Pattern.matches("Linux.*", osName)) {
            return "/opt/openoffice.org3";
        } else if (Pattern.matches("Windows.*", osName)) {
            return "D:\\Program Files (x86)\\OpenOffice 4";
        } else if (Pattern.matches("Mac.*", osName)) {
            return "/Application/OpenOffice.org.app/Contents";
        }
        return null;
    }

    /**
     * 连接OpenOffice.org 并且启动OpenOffice.org
     * 
     * @return
     */
    public OfficeManager getOfficeManager() {
        DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
        // 获取OpenOffice.org 3的安装目录
        String officeHome = getOfficeHome();
        config.setOfficeHome(officeHome);
        // 启动OpenOffice的服务
        OfficeManager officeManager = config.buildOfficeManager();
        officeManager.start();
        return officeManager;
    }

    /**
     * 转换文件
     * 
     * @param inputFile
     * @param outputFilePath_end
     * @param inputFilePath
     * @param outputFilePath
     * @param converter
     */
    public void converterFile(File inputFile, String outputFilePath_end, String inputFilePath, String outputFilePath, OfficeDocumentConverter converter) {
        File outputFile = new File(outputFilePath_end);
        // 假如目标路径不存在,则新建该路径
        if (!outputFile.getParentFile().exists()) {
            outputFile.getParentFile().mkdirs();
        }
        converter.convert(inputFile, outputFile);
        System.out.println("文件:" + inputFilePath + "\n转换为\n目标文件:" + outputFile + "\n成功!");
    }

    /**
     * 使Office全部格式的文档 转化为pdf文件<br>
     * 
     * @param inputFilePath
     *            源文件路径,如:"E:\\Workspaces\\MyEclipse2013\\DataTemp\\baiduwenkuModel\\test001.docx
     * @param outputFilePath
     *            目标文件路径,如:"E:\\Workspaces\\MyEclipse2013\\DataTemp\\baiduwenkuModel\\test001.pdf"
     * @return
     */
    public boolean office2pdf(String inputFilePath, String outputFilePath) {
        boolean flag = false;
        OfficeManager officeManager = getOfficeManager();
        // 连接OpenOffice
        OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
        long begin_time = new Date().getTime();
        if (null != inputFilePath) {
            File inputFile = new File(inputFilePath);
            // 判断目标文件路径是否为空
            if (null == outputFilePath) {
                // 转换后的文件路径
                String outputFilePath_end = getOutputFilePath(inputFilePath);
                if (inputFile.exists()) {// 找不到源文件, 则返回
                    converterFile(inputFile, outputFilePath_end, inputFilePath, outputFilePath, converter);
                    flag = true;
                }
            } else {
                if (inputFile.exists()) {// 找不到源文件, 则返回
                    converterFile(inputFile, outputFilePath, inputFilePath, outputFilePath, converter);
                    flag = true;
                }
            }
            officeManager.stop();
        } else {
            System.out.println("con‘t find the resource");
        }
        long end_time = new Date().getTime();
        System.out.println("文件转换耗时:[" + (end_time - begin_time) + "]ms");
        return flag;
    }

    /**
     * 获取输出文件
     * 
     * @param inputFilePath
     * @return
     */
    public String getOutputFilePath(String inputFilePath) {
        String outputFilePath = inputFilePath.replaceAll("." + getPostfix(inputFilePath), ".pdf");
        return outputFilePath;
    }

    /**
     * 获取inputFilePath的后缀名,如:"e:/test.pptx"的后缀名为:"pptx"<br>
     * 
     * @param inputFilePath
     * @return
     */
    public String getPostfix(String inputFilePath) {
        return inputFilePath.substring(inputFilePath.lastIndexOf(".") + 1);
    }

}

第二步:PDF(OpenOffice+JodConverter)=>SWF(pdf2swf)

1.下载SWFTools

下载地址:http://www.swftools.org/download.html

我下载的是:swftools-2012-10-15-1307.exe

2.安装SWFTools

3:源码(一下有两种方式)

源码1

 

  1 package com.wyh.toPdf;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.io.InputStreamReader;
  8 import java.util.Date;
  9 
 10 /**
 11  * PDF转SWF工具
 12  *  15  * 
 16  */
 17 public class PDF2SWF {
 18 
 19     /**
 20      * SWTOOLS的安装路径,我的SWFTools安装目录为:"D:\Program Files (x86)\SWFTools"
 21      */
 22     public static final String SWFTOOLS_PATH = "D:\\Program Files (x86)\\SWFTools";
 23     /**
 24      * pdf文件后缀名
 25      */
 26     public static final String FILE_NAME_OF_PDF = "pdf";
 27     /**
 28      * swf文件后缀名
 29      */
 30     public static final String FILE_NAME_OF_SWF = "swf";
 31 
 32     /**
 33      * 获得文件的路径
 34      * 
 35      * @param file
 36      *            文件的路径 ,如:"c:/test/test.swf"
 37      * @return 文件的路径
 38      */
 39     public static String getFilePath(String file) {
 40         String result = file.substring(0, file.lastIndexOf("/"));
 41         if (file.substring(2, 3) == "/") {
 42             result = file.substring(0, file.lastIndexOf("/"));
 43         } else if (file.substring(2, 3) == "\\") {
 44             result = file.substring(0, file.lastIndexOf("\\"));
 45         }
 46         return result;
 47     }
 48 
 49     /**
 50      * 新建一个目录
 51      * 
 52      * @param folderPath
 53      *            新建目录的路径 如:"c:\\newFolder"
 54      */
 55     public static void newFolder(String folderPath) {
 56         try {
 57             File myFolderPath = new File(folderPath.toString());
 58             if (!myFolderPath.exists()) {
 59                 myFolderPath.mkdir();
 60             }
 61         } catch (Exception e) {
 62             System.out.println("新建目录操作出错");
 63             e.printStackTrace();
 64         }
 65     }
 66 
 67     /**
 68      * the exit value of the subprocess represented by this Process object. By
 69      * convention, the value 0 indicates normal termination.
 70      * 
 71      * @param sourcePath
 72      *            pdf文件路径 ,如:"c:/hello.pdf"
 73      * @param destPath
 74      *            swf文件路径,如:"c:/test/test.swf"
 75      * @return 正常情况下返回:0,失败情况返回:1
 76      * @throws IOException
 77      */
 78     public static int convertPDF2SWF(String sourcePath, String destPath) throws IOException {
 79         // 如果目标文件的路径是新的,则新建路径
 80         newFolder(getFilePath(destPath));
 81 
 82         // 源文件不存在则返回
 83         File source = new File(sourcePath);
 84         if (!source.exists()) {
 85             return 0;
 86         }
 87 
 88         // 调用pdf2swf命令进行转换
 89         String command = SWFTOOLS_PATH + "/pdf2swf.exe  -t \"" + sourcePath + "\" -o  \"" + destPath + "\" -s flashversion=9 -s languagedir=D:\\xpdf\\xpdf-chinese-simplified ";
 90         System.out.println("命令操作:" + command + "\n开始转换...");
 91         // 调用外部程序
 92         Process process = Runtime.getRuntime().exec(command);
 93         final InputStream is1 = process.getInputStream();
 94         new Thread(new Runnable() {
 95             public void run() {
 96                 BufferedReader br = new BufferedReader(new InputStreamReader(is1));
 97                 try {
 98                     while (br.readLine() != null)
 99                         ;
100                 } catch (IOException e) {
101                     e.printStackTrace();
102                 }
103             }
104         }).start(); // 启动单独的线程来清空process.getInputStream()的缓冲区
105         InputStream is2 = process.getErrorStream();
106         BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));
107         // 保存输出结果流
108         StringBuilder buf = new StringBuilder();
109         String line = null;
110         while ((line = br2.readLine()) != null)
111             // 循环等待ffmpeg进程结束
112             buf.append(line);
113         while (br2.readLine() != null)
114             ;
115         try {
116             process.waitFor();
117         } catch (InterruptedException e) {
118             e.printStackTrace();
119         }
120         System.out.println("转换结束...");
121         return process.exitValue();
122     }
123 
124     /**
125      * pdf文件转换为swf文件操作
126      * 
127      * @param sourcePath
128      *            pdf文件路径 ,如:"c:/hello.pdf"
129      * @param destPath
130      *            swf文件路径,如:"c:/test/test.swf"
131      */
132     public static void pdf2swf(String sourcePath, String destPath) {
133         long begin_time = new Date().getTime();
134         try {
135             PDF2SWF.convertPDF2SWF(sourcePath, destPath);
136         } catch (Exception ex) {
137             System.out.println("转换过程失败!!");
138         }
139         long end_time = new Date().getTime();
140         System.out.println("转换共耗时 :[" + (end_time - begin_time) + "]ms");
141         System.out.println("转换文件成功!!");
142     }
143 
144     public static void main(String[] args) throws IOException {
145         String sourcePath = "E:\\Workspaces\\MyEclipse2013\\DataTemp\\baiduwenkuModel\\test002." + FILE_NAME_OF_PDF;
146         String destPath = "E:\\Workspaces\\MyEclipse2013\\DataTemp\\baiduwenkuModel\\test002_" + new Date().getTime() + "." + FILE_NAME_OF_SWF;
147         pdf2swf(sourcePath, destPath);
148     }
149 }

3:源码2:

  1 package com.wyh.toPdf;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.IOException;
  6 import java.io.InputStreamReader;
  7 import java.util.ArrayList;
  8 import java.util.Date;
  9 import java.util.List;
 10 
 11  
 12 /**
 13  * @author nlb
 14  * @version 1.0 把pdf,jpeg,font,gif,pgn,wav转化为swf文件
 15  */ 
 16 public class ConvertToSwf { 
 17  
 18     private final String CONVERTFILETYPE = "pdf,jpg,jpeg,font,gif,png,wav"; 
 19     private String swftoolsPath; 
 20     /**
 21      * @param swftoolsPath
 22      *            用于进行把文件转化为swf的工具地址
 23      */ 
 24     public ConvertToSwf(String swftoolsPath) { 
 25         this.swftoolsPath=swftoolsPath; 
 26     } 
 27     /**
 28      * 把文件转化为swf格式支持"pdf,jpg,jpeg,font,gif,png,wav"
 29      * 
 30      * @param sourceFilePath
 31      *            要进行转化为swf文件的地址
 32      * @param swfFilePath
 33      *            转化后的swf的文件地址
 34      * @return
 35      */ 
 36     public boolean convertFileToSwf(String sourceFilePath, String swfFilePath) { 
 37         System.out.println("开始转化文件到swf格式");
 38         if (swftoolsPath == null || swftoolsPath == "") { 
 39            System.out.println("未指定要进行swf转化工具的地址!!!");
 40             return false; 
 41         } 
 42         String filetype = sourceFilePath.substring(sourceFilePath 
 43                 .lastIndexOf(".") + 1); 
 44         // 判读上传文件类型是否符合转换为pdf 
 45        System.out.println("判断文件类型通过");
 46         if (CONVERTFILETYPE.indexOf(filetype.toLowerCase()) == -1) { 
 47             System.out.println("当前文件不符合要转化为SWF的文件类型!!!");
 48             return false; 
 49         } 
 50         File sourceFile = new File(sourceFilePath); 
 51  
 52         if (!sourceFile.exists()) { 
 53             System.out.println("要进行swf的文件不存在!!!");
 54             return false; 
 55         } 
 56         System.out.println("准备转换的文件路径存在");
 57         if (!swftoolsPath.endsWith(File.separator)) { 
 58             swftoolsPath += File.separator; 
 59         } 
 60         StringBuilder commandBuidler = new StringBuilder(swftoolsPath); 
 61         File swfFile = new File(swfFilePath); 
 62         if (!swfFile.getParentFile().exists()) { 
 63             swfFile.getParentFile().mkdirs(); 
 64         } 
 65         if (filetype.toLowerCase().equals("jpg")) { 
 66             filetype = "jpeg"; 
 67         } 
 68         List<String>  command = new   ArrayList<String>();   
 69             command.add(this.swftoolsPath+"\\"+filetype.toLowerCase()+"2swf.exe");//从配置文件里读取     
 70             command.add("-z");     
 71             command.add("-s");     
 72             command.add("flashversion=9");     
 73             command.add("-s");     
 74             command.add("poly2bitmap");//加入poly2bitmap的目的是为了防止出现大文件或图形过多的文件转换时的出错,没有生成swf文件的异常     
 75             command.add(sourceFilePath);     
 76             command.add("-o");     
 77             command.add(swfFilePath);     
 78         try { 
 79             ProcessBuilder processBuilder = new ProcessBuilder();     
 80             processBuilder.command(command);     
 81             Process process = processBuilder.start();     
 82             System.out.println("开始生成swf文件..");
 83             dealWith(process); 
 84             try {     
 85                 process.waitFor();//等待子进程的结束,子进程就是系统调用文件转换这个新进程     
 86             } catch (InterruptedException e) {     
 87                 e.printStackTrace();     
 88             }     
 89             File swf = new File(swfFilePath); 
 90             if (!swf.exists()) { 
 91                 return false; 
 92             } 
 93             System.out.println("转化SWF文件成功!!!");
 94         } catch (IOException e) { 
 95             // TODO Auto-generated catch block 
 96             System.out.println("转化为SWF文件失败!!!");
 97             e.printStackTrace(); 
 98             return false; 
 99         } 
100  
101         return true; 
102     } 
103     public static void main(String[] args) { 
104         ConvertToSwf a=new ConvertToSwf("D:\\Program Files (x86)\\SWFTools"); 
105         long begin_time=new Date().getTime();
106         a.convertFileToSwf("E:\\Workspaces\\MyEclipse2013\\DataTemp\\baiduwenkuModel\\test002.pdf", "E:\\Workspaces\\MyEclipse2013\\DataTemp\\baiduwenkuModel\\test002_001.swf"); 
107         long end_time=new Date().getTime();
108         System.out.println("result:"+(end_time-begin_time));
109     } 
110     private void dealWith(final Process pro){     
111         // 下面是处理堵塞的情况     
112         try {     
113             new Thread(){     
114                 public void run(){     
115                     BufferedReader br1 = new BufferedReader(new InputStreamReader(pro.getInputStream()));     
116                     String text;     
117                     try {     
118                         while ( (text = br1.readLine()) != null) {     
119                             System.out.println(text);     
120                         }     
121                     } catch (IOException e) {     
122                         e.printStackTrace();     
123                     }     
124                 }     
125             }.start();     
126         } catch (Exception e) {     
127             e.printStackTrace();     
128         }     
129         try {     
130             new Thread(){     
131                 public void run(){     
132                     BufferedReader br2 = new BufferedReader(new InputStreamReader(pro.getErrorStream()));//这定不要忘记处理出理时产生的信息,不然会堵塞不前的     
133                     String text;     
134                     try {     
135                         while( (text = br2.readLine()) != null){     
136                             System.err.println(text);     
137                         }     
138                     } catch (IOException e) {     
139                         e.printStackTrace();     
140                     }     
141                 }     
142             }.start();     
143         } catch (Exception e) {     
144             e.printStackTrace();     
145         }     
146     }     
147 } 

最后:

1.下载flexpaper

下载地址:http://code.google.com/p/flexpaper/downloads/list

下载:FlexPaper_2.0.2.zip

2.然后解压,需要的文件如下:

上面是我重新组合的,你也可以把解压缩文件夹整个的拷贝到WebRoot下面。

不过路径在设置的时候,就需要注意啦.....

3.新建一个jsp文件

index.jsp

1 <%@ page contentType="text/html; charset=utf-8"%>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
     <head>
         <title>showWenKU</title>
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
         <script type="text/javascript"
             src="${pageContext.request.contextPath}/flexpaper/swfobject/swfobject.js"></script>
         <script type="text/javascript"
             src="${pageContext.request.contextPath}/flexpaper/flexpaper_flash.js"></script>
 
         <script type="text/javascript"> 
             <!-- For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. --> 
             var swfVersionStr = "9.0.124";
             <!-- To use express install, set to playerProductInstall.swf, otherwise the empty string. -->
             var xiSwfUrlStr = "${expressInstallSwf}";
             var flashvars = { 
                   SwfFile : escape("${pageContext.request.contextPath}/flexpaper/swf/test_1352107155307_1352172932517.swf?v1.4.0final"),
                   Scale : 0.8, //放大因子,是一个0以上的数(带小数 1 = 100%) 。
                   ZoomTransition : "easeOut",//光学变焦过渡,默认值是easeOut,可取值: easenone, easeout, linear, easeoutquad
                   ZoomTime : 0.5, //时间过渡让变焦达到新的放大因子,值为0或更大的数。
                     ZoomInterval : 0.1,//区间的滑动缩放。放大因子缺省值是0.1。如同在工具栏上使用滑动条按钮的效果。
                     FitPageOnLoad : true, //(布尔) 适合初始页大小(依高度而定)的装载页。如同在工具栏上使用fit-page按钮的效果。
                     FitWidthOnLoad : true, // (布尔)适合初始页宽度大小的装载页。如同在工具栏上使用fit-width按钮的效果。
                     PrintEnabled : true,   //是否支持打印
                     FullScreenAsMaxWindow :false,  //是否支持全屏
                   ProgressiveLoading : false,  //是否支持延迟加载
                   SearchMatchAll : true,//设置为true时,单击搜索所有符合条件的地方高亮显示
                   PrintToolsVisible : false,
                     ViewModeToolsVisible : true,//(布尔)显示或隐藏视图模式与工具栏
                     ZoomToolsVisible : true,//(布尔) 从工具栏显示或隐藏变焦工具
                     FullScreenVisible : true,//(布尔)以最大化方式打开一个新浏览器窗口。
                     NavToolsVisible : true,//(布尔)显示或隐藏导航工具
                     CursorToolsVisible : false,//(布尔) 显示或隐藏光标工具
                     SearchToolsVisible : true,
                     localeChain: "en_US" //语言
                   };
              var params = {
                 
                 }
             params.quality = "high";
             params.bgcolor = "#ffffff";
             params.allowscriptaccess = "sameDomain";
             params.allowfullscreen = "true";
             var attributes = {};
             attributes.id = "FlexPaperViewer";
             attributes.name = "FlexPaperViewer";
             swfobject.embedSWF(
                 "${pageContext.request.contextPath}/flexpaper/swf/FlexPaperViewer.swf", "flashContent", 
                 "800", "532", 
                 swfVersionStr, xiSwfUrlStr, 
                 flashvars, params, attributes);
             swfobject.createCSS("#flashContent", "display:block;text-align:left;");
         </script>
 
     </head>
     <body>
         <div id="flashContent" ></div>
     </body>
 </html>

 

具体的参数可以参考:

官方文档1:http://flexpaper.org/docs_api.jsp

官方文档2:http://flexpaper.org/docs_parameters.jsp

声明:

Articles from:http://www.cnblogs.com/hongten/archive/2012/11/06/java_FlexPaper.html