码迷,mamicode.com
首页 > 编程语言 > 详细

Java实现文档在线预览(openoffice+swfTools+FlexPaper)

时间:2015-10-26 00:34:47      阅读:931      评论:0      收藏:0      [点我收藏+]

标签:

文档在线预览在项目中早就完成了,后来又经过了一次优化。但是一直都没时间去记录遇到的问题,文档在线预览的详细步骤可以参考http://blog.csdn.net/u013614451/article/details/24261503,感谢博主写了这么好的文章帮助我完成了项目中主要的模块。下面是文档转换的工具类DocConvert.java,并标注出我修改的部分。

package com.he.util;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.UUID;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

/**
 * doc docx格式转换
 */
public class DocConverter {
    private static final int environment = 1;// 环境 1:windows 2:linux
    private String fileString;// (只涉及pdf2swf路径问题)
    private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置
    private String fileName;
    private File pdfFile;
    private File swfFile;
    private File docFile;
    
    private String tempName;
    private String extName ;
    
    public DocConverter(String fileString,String outputPath) {
        ini(fileString,outputPath);
    }

    /**
     * 重新设置file
     * 
     * @param fileString
     */
    public void setFile(String fileString,String outputPath) {
        ini(fileString,outputPath);
    }

    /**
     * 初始化
     * 
     * @param fileString
     */
    private void ini(String fileString,String outputPath) {
        this.fileString = fileString;
        fileName=fileString.substring(0,fileString.lastIndexOf("."));  //获取文件路径
        //转换后的文件名以要转换文件名的hash值命名
        
        this.extName = fileString.substring(fileString.lastIndexOf(".")); //获取后缀名
        //如果文件是txt的,则先对其编码成utf-8格式,
    if(".txt".equalsIgnoreCase(extName)){
            docFile = new File(copyFile2(fileString, outputPath+"/"+tempName+".txt"));
        }else{
            docFile = new File(fileString);
        }
        
      if(".pdf".equals(extName)){
            pdfFile = new File(fileName+".pdf");            
        }else{
            pdfFile = new File(outputPath+"/"+tempName + ".pdf");
        }
        swfFile = new File(outputPath+"/"+tempName + ".swf");
    }
    
    /**
     * 转为PDF
     * 
     * @param file
     */
    private void doc2pdf() throws Exception {
        if (docFile.exists()) {
            if (!pdfFile.exists()) {
                OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
                try {
                    connection.connect();
                    DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
                    converter.convert(docFile, pdfFile);
                    // close the connection
                    connection.disconnect();
                    //如果文件是txt文件,将复制后的文件删除
                    if(".txt".equalsIgnoreCase(extName)){
                        if(docFile.exists()){
                            docFile.delete();
                        }
                    }
                    System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");
                } catch (java.net.ConnectException e) {
                    e.printStackTrace();
                    System.out.println("****swf转换器异常,openoffice服务未启动!****");
                    throw e;
                } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
                    e.printStackTrace();
                    System.out.println("****swf转换器异常,读取转换文件失败****");
                    throw e;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw e;
                }
            } else {
                System.out.println("****已经转换为pdf,不需要再进行转化****");
            }
        } else {
            System.out.println("****swf转换器异常,需要转换的文档不存在,无法转换****");
        }
    }
    
    /**
     * 转换成 swf
     */
    @SuppressWarnings("unused")
    private void pdf2swf() throws Exception {
        if (pdfFile.exists()) {
        Runtime r = Runtime.getRuntime();
        if (!swfFile.exists()) {
                if (environment == 1) {// windows环境处理
                    try {
                        Process p = r.exec("D:/SWFTools/pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9");
                        System.out.print(loadStream(p.getInputStream()));
                        System.err.print(loadStream(p.getErrorStream()));
                        System.out.print(loadStream(p.getInputStream()));
                        System.err.println("****swf转换成功,文件输出:"
                                + swfFile.getPath() + "****");
                    } catch (IOException e) {
                        e.printStackTrace();
                        throw e;
                    }
                } else if (environment == 2) {// linux环境处理
                    try {
                        Process p = r.exec("pdf2swf " + pdfFile.getPath()
                                + " -o " + swfFile.getPath() + " -T 9");
                        System.out.print(loadStream(p.getInputStream()));
                        System.err.print(loadStream(p.getErrorStream()));
                        System.err.println("****swf转换成功,文件输出:"
                                + swfFile.getPath() + "****");
                        
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw e;
                    }
                }
               //文件不是pdf文档,并且文件存在才将pdf文件删除
                if (!".pdf".equalsIgnoreCase(extName) && pdfFile.exists()) {
                    pdfFile.delete();
                }
}
else { System.out.println("****pdf不存在,无法转换****"); } } else { System.out.println("****swf已经存在不需要转换****"); } } /** * 把txt文件按照其原来的编码读出来,然后再以utf-8的编码写到一个新的txt文件中去,将utf-8文件转换成pdf,就不会乱码 * @param sourceFile 要读取的文件 * @param targetFile 目标文件 * @return */ @SuppressWarnings("unused") private String copyFile2(String sourceFile,String targetFile){ //获取txt原始编码 String charSet = EncodingDetect.getJavaEncode(sourceFile); return EncodingDetect.readFile(sourceFile, charSet, targetFile); } 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(); } /** * 转换主方法 */ @SuppressWarnings("unused") public boolean conver() { if (swfFile.exists()) { System.out.println("****swf转换器开始工作,该文件已经转换为swf****"); return true; } if (environment == 1) { System.out.println("****swf转换器开始工作,当前设置运行环境windows****"); } else { System.out.println("****swf转换器开始工作,当前设置运行环境linux****"); } try { //如果文件本身就是pdf文件,就不需要经过OpenOffice转换 if(".pdf".equalsIgnoreCase(extName)){ pdf2swf(); }else{ doc2pdf(); pdf2swf(); } } catch (Exception e) { e.printStackTrace(); return false; } 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) { this.outputPath = 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"); } } } public static void main(String[] args) { DocConverter d = new DocConverter("D:/swf/abc.pdf","D:/swf"); d.conver(); } }

问题一  flexPaper无法加载SWF文件名为中文问题

       这个问题我开始是将要转换成的SWF文件以UUID命名,后来发现每次预览文件都得转换,很影响效率,同时也会使项目中转换的swf文件越来越多,浪费空间。最后想到每个文件夹中不会出现相同的文件名(包括后缀名),那就可以用文件名的hash值作为转换后SWF文件的文件名,这样就解决了中文名问题和文件只需要转换一次就能多次预览。具体代码实现是红色标记部分。

问题二  要预览的文档为PDF格式

        原文中并没有考虑这种情况,但是项目中大多数文件都是PDF格式的。PDF文档不需要经过OpenOffice转换,可以直接转换成SWF格式,而且原文中将PDF格式转换成SWF格式后就把PDF文件删除,所以我们先要判断文件的格式再删文件,这个问题的具体解决代码可以看灰色部分的标记和注解

问题三  txt文件转换后乱码问题

        这个问题原文中有解答,EncodingDetect类也可以在原文中下载。具体代码可以看黄色部分标记。

Java实现文档在线预览(openoffice+swfTools+FlexPaper)

标签:

原文地址:http://www.cnblogs.com/duoluomengxing/p/4909974.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!