https://yq.aliyun.com/ziliao/1768?spm=5176.8246799.blogcont.24.1PxYoX

摘要: 本文讲的是Java实现web在线预览office文档与pdf文档实例, 1、首先我们需要找到可以把office转换成pdf的方法,查找资料发现有openoffice这一软件可以把office转换成pdf,这一软件先下载下来,然后记住自己安装的在那个位置。然后在cmd环境下进入安装目录的program目

1、首先我们需要找到可以把office转换成pdf的方法,查找资料发现有openoffice这一软件可以把office转换成pdf,这一软件先下载下来,然后记住自己安装的在那个位置。然后在cmd环境下进入安装目录的program目录,输入打开openoffice的命令:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

输入完成之后在任务管理器可以看见soffice.bin的进程在任务管理器,这一服务就启动成功。当然在代码中转换office2pdf我们还需要一些架包。下载jodconverter-2.2.2架包,然后复制到lib目录下,引入架包就可以了。这个架包有如下包:

文档与pdf文档实例-office文档在线预览">

有一些项目重复的可以删除,根据实际情况自己处理。

2、我们需要找到转换pdf2swf的方法。查找资料发现swftools这个软件可以把pdf转换成swf文件。把它下下来安装好就可以了。

3、我们需要一个展示swf文件的容器,发现有flexpaper这个插件。而且展示效果还不错。所以我们需要下载这个插件。使用这个插件需要有三个js文件。分别是:jquery.js、flexpaper_flash.js、flexpaper_flash_debug.js。插件的名字是FlexPaperViewer.swf。

整个项目结如下:

准备工作完成下面开始编码.

转换类为DocConverter 的代码:

package com.cectsims.util;
 
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
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;
 
    public DocConverter(String fileString) {
        ini(fileString);
        System.out.println("文件路径"+fileString);
    }
 
    /**
     * * 重新设置file
     *
     * @param fileString
     *            32.
     */
    public void setFile(String fileString) {
        ini(fileString);
    }
 
    /**
     *  * 初始化
     *
     * @param fileString
     *          
     */
    private void ini(String fileString) {
        this.fileString = 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(8100);
                try {
                    connection.connect();
                    DocumentConverter converter = new OpenOfficeDocumentConverter(
                            connection);
                    converter.convert(docFile, pdfFile);
                    // close the connection
                    connection.disconnect();
                    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 {
        Runtime r = Runtime.getRuntime();
        if (!swfFile.exists()) {
            if (pdfFile.exists()) {
                if (environment == 1) {// windows环境处理
                    try {
                        Process p = r.exec("D:/Program/swfttools/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() + "****");
                        if (pdfFile.exists()){
                            pdfFile.delete();
                        }
                    } 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() + "****");
                        if (pdfFile.exists()) {
                            pdfFile.delete();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw e;
                    }
                }
            } else {
                System.out.println("****pdf不存在,无法转换****");
            }
        } else {
            System.out.println("****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();
    }
 
    /**
     * * 转换主方法
     */
    @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 {
            doc2pdf();
            pdf2swf();
        } catch (Exception e) {
              e.printStackTrace();
              return false;
        }
        System.out.println("文件存在吗?"+swfFile);
        if (swfFile.exists()) {
            System.out.println("存在");
            return true;
        } else {
            System.out.println("不存在");
            return false;
        }
    }
 
    /**
     *返回文件路径      
     * @param     
     */
    public String getswfPath(){
        if (this.swfFile.exists()){
            String tempString = swfFile.getPath();
            tempString = tempString.replaceAll("\\\\", "/");
            System.out.println("最后文件路径为"+tempString);
            return tempString;
        } else {
            return "文件不存在";
        }
    }
 
    /**
     * 设置输出路径
     *
     * @param outputPath
     */
    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");
            }
        }
    }
}

调用转换类只需要传word、ptt、excel、pdf文件所在的路径参数就可以了。

展示在线预览的jsp代码如下:

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
   String swfFilePath=session.getAttribute("swfpath").toString();
   System.out.println("展示路径"+swfFilePath);
 %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/flexpaper_flash.js"></script>
<script type="text/javascript" src="js/flexpaper_flash_debug.js"></script>
<!--  <script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/flexpaper.js"></script>
<script type="text/javascript" src="js/flexpaper_handlers.js"></script>-->
<style type="text/css" media="screen">
html,body{
        height: 100%;
}
body{
        margin: 0;
        padding: 0;
        overflow: auto;
}
#flashContent{
       display: none;
}
</style>
<title>在线文档预览</title>
</head>
<body>
   <div style="position: absolute; left:50px;top:10px;">
        <a id="viewerPlaceHolder" style="width: 820px;height: 650px;display: block;"></a>
          <script type="text/javascript">
           var fp=new FlexPaperViewer('FlexPaperViewer','viewerPlaceHolder',{config:{SwfFile:escape('<%=swfFilePath%>'),Scale:1.2,
            ZoomTransition:'easeOut',ZoomTime:0.5,ZoomInterval:0.2,FitPageOnLoad:false,FitWidthOnload:false,
            FullScreenAsMaxWindow:false,ProgressiveLoading:false,MinZoomSize:0.2,MaxZoomSize:5,SearchMatchAll:false,
            InitViewMode:'SinglePage',RenderingOrder : 'flash',ViewModeToolsVisible:true,ZoomToolsVisible:true,NavToolsVisible:true,CursorToolsVisible:true,
            SearchToolsVisible:true,localeChain:'en_US'}});
          </script>
   </div>
</body>
</html>

其中可能会出现在线预览只能实现10页的情况,需要把RenderingOrder : 'flash',设置为flash才可以实现超过10页的在线预览。swfFilePat为转换后的文件所在路径。

注意问题:

1、发现错误一般是openoffice服务没有开启。
2、Linux环境下会存在中文乱码的问题,是linux下不像windows支持那么多字体,需要安装多的字体,并且把字体所在位置链接到flexpaper所在位置。在使用pdf2swf加上参数-s
languagedir=/usr/local/xpdf-chinese-simplified/。具体的一些参数请百度。

java将office文档pdf文档转换成swf文件在线预览

第一步,安装openoffice.org

openoffice.org是一套sun的开源office办公套件,能在widows,linux,solaris等操作系统上执行。

主要模块有writer(文本文档),impress(演示文稿),Calc(电子表格),Draw(绘图),Math(公式),base(数据库)

笔者下载的是openoffice.org 3.3.0。下载完直接安装即可。

但是,我们还需要启动openoffice server。有两种做法:

1.以命令行方式启动openoffice server,缺点是每次系统重启,都需要手动去把openoffice server启动。

2.将openoffice server作为操作系统的服务启动,既然成为了系统服务,就可以设定开机自动启动了。

我们先来看第一种方式,

1.以命令行方式启动openoffice server

  在cmd命令下,cd
opeonofiice的安装路径/program 如:cd c:\program files\openoffice.org
3\program\soffice -headless
-accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

2.以系统服务的方式启动

这里我们还需要Windows Resource Kit tools ,将openoffice server设为系统服务。

Windows
Resource Kit tools
是微软专为管理人员、开发人员和高级用户开发的,包括管理活动目录、组策略、TCP/IP网络、注册表、系统安全、监测等涉及Windows
Server 2003 操作系统的其它很多方面的非常规安装的工具组件。Resource Kit Tools for
XP的发布使得XP用户也能使用Resource Kit Tools对这些问题进行处理。

下载windows resource kit tools,我们进行默认安装。

1.打开Windows Resource Kit Tools

在Command Shell执行以下命令:

"C:\Program
Files\Windows Resource Kits\Tools\instsrv" OpenOfficeUnoServer
"C:\Program Files\Windows Resource Kits\Tools\srvany.exe"

打开 管理工具->服务 可以找到以 OpenOfficeUnoServer 命名的服务

2.打开注册表寻找以下路径

HKEY_LOCAL_MACHINE -> SYSTEM ->ControlSet001 ->Services ->OpenOfficeUnoServer

 新建项 Parameters,在该项下添加两个字符串值:

  key:Application

value:C:\Program Files\OpenOffice.org 3\program\soffice.exe

key:AppParameters

value:-invisible -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard

3.在服务控制台,启动 openoffice 服务

4.在CMD中用以下命令查看8100是否已被监听:netstat -anop tcp

这样OpenOffice3.0就以服务方式运行在Windows系统上了。(使用cmd命令:netstat -anp tcp查看8100端口是否工作)

然後可以通过socket方式连接openOffice,以使用openoffice提供的某些服务,如文件转换服务,ms office转pdf等等。

开源项目 JODConverter 就是结合openoffice来进行文档转换的java组件。

另外有一个命令行工具swftools,该工具可以将pdf转换为swf格式的文档,提供给ie客?舳肆骼馈?nbsp;

  另外,我们可以将该配置用bat文件来快速实现,运行前请先修改相应目录参数:

openoffice service.bat文件

"C:\Program Files\Windows Resource Kits\Tools\instsrv"
OpenOfficeUnoServer "C:\Program Files\Windows Resource
Kits\Tools\srvany.exe"
    reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\OpenOfficeUnoServer\Parameters /ve /d
   
reg add
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\OpenOfficeUnoServer\Parameters
/v Application /t REG_SZ /d "C:\Program Files\OpenOffice.org
3\program\soffice.exe"
    reg add
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\OpenOfficeUnoServer\Parameters
/v AppParameters /t REG_SZ /d "-invisible -headless
-accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard"

第二步,使用JODConverter将office文档转换为pdf

JODConverter是一个java的OpenDucument文件转换器,可以进行许多文件格式的转换,它利用

OpenOffice来进行转换工作,它能进行以下的转换工作:

1.Microsoft Office格式转换为OpenDucument,以及OpenDucument转换为Microsoft Office

2.OpenDucument转换为PDF,Word、Excel、PowerPoint转换为PDF,RTF转换为PDF等。

它是一个开源项目。

我的项目是在MyEclipse下开发的。

下载最新版的jodconverter-2.2.2,把lib文件夹的包导入到你的DocConverter项目的lib文件夹内。

(假设你的项目是DocConverter)

新建DOC2PDFUtil.java

package com.iori.webapp.util;
import java.io.File;  
import java.io.IOException;
import java.net.ConnectException;  
import java.util.Date;  
 
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;  
 
public class DOC2PDFUtil extends java.lang.Thread  {
     private File inputFile;// 需要转换的文件  
      private File outputFile;// 输出的文件  
     
      public DOC2PDFUtil(File inputFile, File outputFile) {  
         this.inputFile = inputFile;  
         this.outputFile = outputFile; 
     }  
     
     public void docToPdf() {  
         Date start = new Date();  
          
         OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);  
         try {  
             connection.connect();  
             DocumentConverter converter = new OpenOfficeDocumentConverter(connection);  
             converter.convert(inputFile, outputFile);  
         } catch (ConnectException cex) {  
             cex.printStackTrace();  
         } finally {  
             // close the connection  
             if (connection != null) {  
                 connection.disconnect();  
                 connection = null;  
             }  
         }  
     }  
     
     /** 
       * 由于服务是线程不安全的,所以……需要启动线程 
        */ 
     public void run() {  
         this.docToPdf();  
     }  
     
     public File getInputFile() {  
         return inputFile;  
     }  
     
     public void setInputFile(File inputFile) {  
         this.inputFile = inputFile;  
     }  
     
     public File getOutputFile() {  
         return outputFile;  
     }  
     
     public void setOutputFile(File outputFile) {  
         this.outputFile = outputFile;  
     } 
     
     /**
       * 测试main方法
        * @param args
       */
     public static void main(String[] args) {
         File inputFile = new File("c://temp//333.xls");
         File outputFile = new File("c://temp//333.pdf");
         DOC2PDFUtil dp=new DOC2PDFUtil(inputFile,outputFile);
         dp.start();
     } 
}

在DOC2PDFUtil.java,右键属性 - >Run as - >Java Application ,输出main的测试结果。

在jsp中执行

新建MyDOC2PDFTest.jsp

<%@ page import="java.io.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.connection.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.connection.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.converter.*"%>
<%@ page import="com.artofsolving.jodconverter.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.iori.webapp.util.*"%>
 
<%
File inputFile = new File("c://temp//333.xls");
File outputFile = new File("c://temp//333.pdf");
DOC2PDFUtil dp=new DOC2PDFUtil(inputFile,outputFile);
dp.start();
%>
<!-- 下面这些html可以去掉 -->
<html>
 <head><title>Simple jsp page</title></head>
 <body>Place your content here</body>
</html>
在项目DocConverter根目录,右键属性 - >Run as - >MyEclipse Server Application
发布到之前安装的Tomcat 6.0的根目录,然后用url路径访问:Http://localhost:8080/DocConverter/MyDOC2PDFTest.jsp 进行测试。
JODConverter将office文档转换pdf,用到的代码如下:
File inputFile = new File("c://temp//333.xls");
File outputFile = new File("c://temp//333.pdf");
 
// 链接 一个运行在8100端口的OpenOffice.org 实例
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();
 
// 创建一个converter对象并转换格式
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);
 
// 关闭连接
connection.disconnect();

第三步,使用swftools将pdf转换为swf

建议下载swftools-0.9.1,笔者起先下载的是最新版的swftools-1.0版。貌似转换时出错,缺少什么组件。

继续笔者的DocConverter项目。笔者使用的开发环境是MyEclipse 9.0。

新建PDF2SWFUtil.java

package com.iori.webapp.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class PDF2SWFUtil {
    
    /**
      * 利用SWFTools工具将pdf转换成swf,转换完后的swf文件与pdf同名
       * @author iori
      * @param fileDir PDF文件存放路径(包括文件名)
       * @param exePath 转换器安装路径
       * @throws IOException
      */
    public static synchronized void pdf2swf(String fileDir, String exePath) throws IOException {
        //文件路径
         String filePath = fileDir.substring(0, fileDir.lastIndexOf("/"));
        //文件名,不带后缀
         String fileName = fileDir.substring((filePath.length() + 1), fileDir.lastIndexOf("."));
        Process pro = null;
        if (isWindowsSystem()) {
            //如果是windows系统
              //命令行命令
              String cmd = exePath + " \"" + fileDir + "\" -o \"" + filePath + "/" + fileName + ".swf\"";
            //Runtime执行后返回创建的进程对象
              pro = Runtime.getRuntime().exec(cmd);
        } else {
            //如果是linux系统,路径不能有空格,而且一定不能用双引号,否则无法创建进程
              String[] cmd = new String[3];
            cmd[0] = exePath;
            cmd[1] = fileDir;
            cmd[2] = filePath + "/" + fileName + ".swf";
            //Runtime执行后返回创建的进程对象
              pro = Runtime.getRuntime().exec(cmd);
        }
        //非要读取一遍cmd的输出,要不不会flush生成文件(多线程)
         new DoOutput(pro.getInputStream()).start();
        new DoOutput(pro.getErrorStream()).start();
        try {
            //调用waitFor方法,是为了阻塞当前进程,直到cmd执行完
             pro.waitFor();
        } catch (InterruptedException e) {
           e.printStackTrace();
        }
    }
    
    /**
      * 判断是否是windows操作系统
       * @author iori
      * @return
      */
    private static boolean isWindowsSystem() {
        String p = System.getProperty("os.name");
        return p.toLowerCase().indexOf("windows") >= 0 ? true : false;
    }
    
    /**
      * 多线程内部类
       * 读取转换时cmd进程的标准输出流和错误输出流,这样做是因为如果不读取流,进程将死锁
       * @author iori
      */
    private static class DoOutput extends Thread {
        public InputStream is;
     
        //构造方法
         public DoOutput(InputStream is) {
            this.is = is;
        }
     
        public void run() {
            BufferedReader br = new BufferedReader(new InputStreamReader(this.is));
            String str = null;
            try {
                //这里并没有对流的内容进行处理,只是读了一遍
                  while ((str = br.readLine()) != null);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    /**
      * 测试main方法
       * @param args
      */
    public static void main(String[] args) {
        //转换器安装路径
         String exePath = "c:/Program Files/SWFTools/pdf2swf.exe";
        try {
            PDF2SWFUtil.pdf2swf("c:/temp/333.pdf", exePath);
        } catch (IOException e) {
            System.err.println("转换出错!");
            e.printStackTrace();
        }
    }
}

在PDF2SWFUtil.java,右键属性 - >Run as - >Java Application ,输出main的测试结果。

在jsp中执行

新建MyPDF2SWFTest.jsp

<%@ page import="java.io.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.connection.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.connection.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.converter.*"%>
<%@ page import="com.artofsolving.jodconverter.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.iori.webapp.util.*"%>
 
<%
//转换器安装路径
String exePath = "c:/Program Files/SWFTools/pdf2swf.exe";
try {
    PDF2SWFUtil.pdf2swf("c:/temp/333.pdf", exePath);
} catch (IOException e) {
    System.err.println("转换出错!");
    e.printStackTrace();
}
%>
 
<!-- 下面这些html可以去掉 -->
<html>
<head>
<title>Simple jsp page</title>
</head>
<body>Place your content here</body>
</html>

在项目DocConverter根目录,右键属性 - >Run as - >MyEclipse Server Application

发布到之前安装的Tomcat 6.0的根目录,然后用url路径访问:Http://localhost:8080/DocConverter/MyPDF2SWFTest.jsp 进行测试。

第四步,office文档转为pdf,同时进一步转为swf

网上资料有很多office文档转为pdf,pdf转为swf,但都是单步转换。关于一起转换的资料比较少。

一起转换有个问题就是转为pdf时,这个转换过程将花费一段时间才能成功,如何控制在pdf转换成功后,才进行swf的转换。

以及多个文档批量转换又该怎么办。

有幸笔者还是找到了一篇同时转换的代码:

新建DocConverter.java

package com.iori.webapp.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
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格式转换
 * @author Administrator
 */
public class DocConverter {
    private static final int environment=1;//环境1:windows 2:linux(涉及pdf2swf路径问题)
    private String fileString;
    private String outputPath="";//输入路径,如果不设置就输出在默认位置
    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)
    {
        this.fileString=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(8100);
                try
                {
                    connection.connect();
                    DocumentConverter converter=new OpenOfficeDocumentConverter(connection);
                    converter.convert(docFile,pdfFile);
                    //close the connection
                    connection.disconnect();
                    System.out.println("****pdf转换成功,PDF输出:"+pdfFile.getPath()+"****");
                }
                catch(java.net.ConnectException e)
                {
                    //ToDo Auto-generated catch block
                    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
     */
    private void pdf2swf() throws Exception
    {
        Runtime r=Runtime.getRuntime();
        if(!swfFile.exists())
        {
            if(pdfFile.exists())
            {
                if(environment==1)//windows环境处理
                {
                    try {
                        Process p=r.exec("C:/Program Files/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()+"****");
                        if(pdfFile.exists())
                        {
                            pdfFile.delete();
                        }
                    } catch (Exception 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()+"****");
                        if(pdfFile.exists())
                        {
                            pdfFile.delete();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw e;
                    }
                }
            }
            else {
                System.out.println("****pdf不存在,无法转换****");
            }
        }
        else {
            System.out.println("****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()
    {
        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 {
            doc2pdf();
            pdf2swf();
        } catch (Exception e) {
            // TODO: Auto-generated catch block
            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 s[])
    {
        DocConverter d=new DocConverter("c:/temp/111.ppt");
        d.conver();
    }
}

在DocConverter.java,右键属性 - >Run as - >Java Application ,输出main的测试结果。笔者分别进行单个转换,及批量转换,都测试可行。

至于为什么能成功进行pdf及swf的完整转换,在代码中没有看到和上述问题相关的控制。笔者在得到预期的结果,偶尔也会装糊涂,不去继续深究。

第五步,flexpaper在线浏览swf文档

FlexPaper是一个开源轻量级的在浏览器上显示各种文档的组件,被设计用来与PDF2SWF一起使用,

使在Flex中显示PDF成为可能,而这个过程并无需PDF软件环境的支持。它可以被当做Flex的库来使用。

另外你也可以通过将一些例如Word、PPT等文档转成PDF,然后实现在线浏览。

FlexPaper_1.2.4_flash:无打印功能

FlexPaper_1.4.7_flash:打印功能,右键打印

这里我们不需要让用户打印,所以笔者选择FlexPaper_1.2.4_flash。

FlexPaper项目中有演示demo,这里笔者不多述。

综上,一个完整的在线文档浏览方案。

附一:使用iText将jpg、jpeg、png转换为pdf

其他,使用iText将jpg/jpeg/png转换为pdf

  iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成

PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。1.在企业的信息系统中,报表处理一直占比较重要的作用,iText--一种生

成PDF报表的Java组件,通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到生成的报表,这样就很好的解
决了B/S系统的报表处理问题。2.支持文本,表格,图形的操作,可以方便的跟 Servlet 进行结合。

继续笔者的DocConverter项目。开发环境是MyEclipse 9.0。笔者下载的是iText5.0.4。

新建JPG2PDFUtil.java

package com.iori.webapp.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.PdfWriter;
 
 
public class JPG2PDFUtil {
    private String inputFileString;
    private String outputFileString;
 
    public JPG2PDFUtil(String inputFile, String outputFile) {  
        this.inputFileString = inputFile;  
        this.outputFileString = outputFile; 
       
    } 
    public void imgtopdf()
    {
        //创建一个文档对象
        Document doc = new Document();
        try {  
            //定义输出文件的位置  
            PdfWriter.getInstance(doc, new FileOutputStream(outputFileString));
            //开启文档  
            doc.open();  
            //设定字体 为的是支持中文  
            //BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);  
           // Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);  
            //向文档中加入图片 
            /*//以下是多图合成一个pdf,暂时用不到
            for(int i=1;i<32;i++)
            {
                //取得图片~~~图片格式:
                Image jpg1 = Image.getInstance("c:/"+i+".jpg"); //原来的图片的路径
                //获得图片的高度
                float heigth=jpg1.height();
                float width=jpg1.width();
                System.out.println("heigth"+i+"----"+heigth);
                System.out.println("width"+i+"-----"+width);
                //合理压缩,h>w,按w压缩,否则按w压缩
                //int percent=getPercent(heigth, width);
                //统一按照宽度压缩
                int percent=getPercent2(heigth, width);
                //设置图片居中显示
                jpg1.setAlignment(Image.MIDDLE);
                //直接设置图片的大小~~~~~~~第三种解决方案,按固定比例压缩
                //jpg1.scaleAbsolute(210.0f, 297.0f);
                //按百分比显示图片的比例
                jpg1.scalePercent(percent);//表示是原来图像的比例;
                //可设置图像高和宽的比例
                //jpg1.scalePercent(50, 100);
                doc.add(jpg1);
            }
            */
           
            //向文档中加入图片 
            //取得图片~~~图片格式:
            Image jpg1 = Image.getInstance(inputFileString); //原来的图片的路径
            //获得图片的高度
            float heigth=jpg1.height();
            float width=jpg1.width();
            System.out.println("heigth----"+heigth);
            System.out.println("width-----"+width);
            //合理压缩,h>w,按w压缩,否则按w压缩
            //int percent=getPercent(heigth, width);
            //统一按照宽度压缩
            int percent=getPercent2(heigth, width);
            //设置图片居中显示
            jpg1.setAlignment(Image.MIDDLE);
            //直接设置图片的大小~~~~~~~第三种解决方案,按固定比例压缩
            //jpg1.scaleAbsolute(210.0f, 297.0f);
            //按百分比显示图片的比例
            jpg1.scalePercent(percent);//表示是原来图像的比例;
            //可设置图像高和宽的比例
            //jpg1.scalePercent(50, 100);
            doc.add(jpg1);
           
           
            //关闭文档并释放资源  
            doc.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (DocumentException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } 
    }
    /**
     * 第一种解决方案
     * 在不改变图片形状的同时,判断,如果h>w,则按h压缩,否则在w>h或w=h的情况下,按宽度压缩
     * @param h
     * @param w
     * @return
     */
   
    public int getPercent(float h,float w)
    {
        int p=0;
        float p2=0.0f;
        if(h>w)
        {
            p2=297/h*100;
        }
        else
        {
            p2=210/w*100;
        }
        p=Math.round(p2);
        return p;
    }
    /**
     * 第二种解决方案,统一按照宽度压缩
     * 这样来的效果是,所有图片的宽度是相等的,自我认为给客户的效果是最好的
     * @param args
     */
    public int getPercent2(float h,float w)
    {
        int p=0;
        float p2=0.0f;
        p2=530/w*100;
        p=Math.round(p2);
        return p;
    }
    /**
     * 第三种解决方案,就是直接压缩,不安像素比例,全部压缩到固定值,如210*297
     *
     * @param args
     */
    public static void main(String[] args) {
        JPG2PDFUtil pt=new JPG2PDFUtil("c:/temp/ddd.jpg","c:/temp/ddd.pdf");
        pt.imgtopdf();
    }
}

在JPG2PDFUtil.java,右键属性 - >Run as - >Java Application ,输出main的测试结果。

在jsp中执行

新建MyJPG2PDFTest.jsp

<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.iori.webapp.util.*"%>
<%
JPG2PDFUtil pt=new JPG2PDFUtil("c:/temp/333.jpg", "c:/temp/333.pdf");
pt.imgtopdf();
%>
<!-- 下面这些html可以去掉 -->
<html>
 <head>
<title>Simple jsp page</title>
</head>
 <body>Place your content here</body>
</html>

在项目DocConverter根目录,右键属性 - >Run as - >MyEclipse Server Application

发布到之前安装的Tomcat 6.0的根目录,然后用url路径访问:Http://localhost:8080/DocConverter/MyDOC2PDFTest.jsp 进行测试。

附二:常见问题集FAQ

1.txt转换swf,发生中文乱码。

txt转换为utf-8编码,或txt格式手动改为odt,上传就不会发生乱码。从根源上解决,暂时就算了...暂时不想去纠结这些鸡毛。

2.加密的pdf可能导致转换为swf失败。

3.Microsoft Excel在公式运算中支持文本型的数值,而OpenOffice.org Calc不支持

此问题暂无解,请手动将Excel中文本型的数值修改为数值型的数值。

4.部分Excel存在过于丰富的样式(大部分指没有数据的单元格也填充了各种样式),即使用专业Adobe Acrobat 7(或9) Pro来进行转换,

本来可能预计将产生20-30分页的pdf,结果却产生800-900分页的pdf。此类文档在线转换,难以避免的将导致转换死锁。

请在你的Excel文档中删除多余的,毫无必要的样式,或者你有更灵活的做法。

5.有些中文PDF文件转换为SWF后,出现乱码(特别一些专业期刊)

1.下载XPDF:xpdf-chinese-simplified.tar.gz

2.下载字体:gkai00mp.rar

3.修改xpdf-chinese-simplified目录下的add-to-xpdfrc文件。将里面的路径设为自己的路径:

#----- begin Chinese Simplified support package (2011-sep-02)
cidToUnicode Adobe-GB1    C:\xpdf-chinese-simplified\Adobe-GB1.cidToUnicode
unicodeMap   ISO-2022-CN C:\xpdf-chinese-simplified\ISO-2022-CN.unicodeMap
unicodeMap   EUC-CN         C:\xpdf-chinese-simplified\EUC-CN.unicodeMap
unicodeMap   GBK              C:\xpdf-chinese-simplified\GBK.unicodeMap
cMapDir        Adobe-GB1    C:\xpdf-chinese-simplified\CMap
toUnicodeDir                     C:\xpdf-chinese-simplified\CMap
fontDir                             C:\WINDOWS\Fonts
displayCIDFontTT Adobe-GB1 C:\xpdf-chinese-simplified\CMap\gkai00mp.ttf
#fontFileCC Adobe-GB1 /usr/..../gkai00mp.ttf
#----- end Chinese Simplified support package

4.参照上面的代码,在调用pdf2swf命令中加入“ -s languagedir=D:\\xpdf\\xpdf-chinese-simplified ”参数。

PDF2SWFUtil.java

String
cmd = exePath + " \"" + fileDir + "\" -o \"" + filePath + "/" +
fileName + ".swf\" -T 9 -s languagedir=c:\\xpdf-chinese-simplified";

这样乱码的问题就解决了。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文档
, 文件
, new
转换器
office文档在线预览、html5 office文档预览、office文档预览插件、office365文档预览、h5 office文档预览,以便于您获取更多的相关知识。

Java实现web在线预览office文档与pdf文档实例的更多相关文章

  1. Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结

    Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结 1. office word  excel pdf 的web预览要求 ...

  2. java通过url在线预览Word、excel、ppt、pdf、txt文档

    java通过url在线预览Word.excel.ppt.pdf.txt文档中的内容[只获得其中的文字] 在页面上显示各种文档中的内容.在servlet中的逻辑 word: BufferedInputS ...

  3. 在线预览office文件

    Office Online 实现在线预览 office的在线预览,针对不同的浏览器版本和系统具有要求,具体的相关文档请参考官方文档. 利用office online 平台进行office 文档的在线查 ...

  4. 文件在线预览doc,docx转换pdf(一)

    文件在线预览doc,docx转换pdf(一) 1. 前言 文档转换是一个是一块硬骨头,但是也是必不可少的,我们正好做的知识库产品中,也面临着同样的问题,文档转换,精准的全文搜索,知识的转换率,是知识库 ...

  5. Web方式预览Office/Word/Excel/pdf文件解决方案

    最近在做项目时需要在Web端预览一些Office文件,经过在万能的互联网上一番搜索确定并解决了. 虽然其中碰到的一些问题已经通过搜索和自己研究解决了,但是觉得有必要将整个过程记录下来,以方便自己以后查 ...

  6. 经管资源库项目总结----在线预览office文件的实现与总结

    依旧是这个经管的项目.在线预览作为资源和文档管理系统的一个很酷的并且是如此重要的功能,是必须要实现的.然后百度一下office在线预览,看起来so eazy啊,各种博客各种demo,一下子就做出效果来 ...

  7. WEB在线预览PDF

    这是我在博客园发表的第一篇文章.以后会陆续把在线预览其他格式文档的解决方案发表出来. 解决思路:把pdf转换成html显示. 在线预览pdf我暂时了解3种解决方案,欢迎大家补充. 方案一: 利用pdf ...

  8. 在线预览Office文件【效果类似百度文库】

    引言 结合上个项目和目前做的这个项目,其中都用到了Office文件在线预览,目前项目中是用到公司购买的Ntko控件,该控件每次浏览文件时则会提示安装信任插件,很繁琐,而且浏览效果不好. 提到Offic ...

  9. 在线预览Office文件【效果类似百度文库】(转载)

    转载地址:http://www.cnblogs.com/sword-successful/p/4031823.html 引言 结合上个项目和目前做的这个项目,其中都用到了Office文件在线预览,目前 ...

随机推荐

  1. 进程间共享数据Manager

    一.前言 进程间的通信Queue()和Pipe(),可以实现进程间的数据传递.但是要使python进程间共享数据,我们就要使用multiprocessing.Manager. Manager()返回的 ...

  2. Sql2008 全文索引创建

    在SQL Server 中提供了一种名为全文索引的技术,可以大大提高从长字符串里搜索数 据的速度,不用在用LIKE这样低效率的模糊查询了.   下面简明的介绍如何使用Sql2008 全文索引 一.检查 ...

  3. 爬取知乎话题async使用协程

    import requests import json import time from pyquery import PyQuery import pandas as pd from collect ...

  4. oracle数据库的date和timestamp类型

    1.date类型存储数据的格式为年月日时分秒,可以精确到秒 timestamp类型存储数据的格式为年月日时分秒,可以精确到纳秒(9位) 2.date类型 Date类型的数据可以显示到年月日,也可以显示 ...

  5. spring-boot-JdbcTemplate

    添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  6. netif_receive_skb->__netif_receive_skb_core

    在设备驱动收包之后,会通过netif_receive_skb将收取的包,按照注册的协议回调,传递到上层进行处理: /* 将skb传递到上层 */ static int __netif_receive_ ...

  7. 自动化测试===adb 解锁手机的思路

    在adb里有模拟按键/输入的命令 比如使用 adb shell input keyevent <keycode> 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列 ...

  8. linux下route命令--说的比较清楚!

    linux下route命令     route命令感觉很不容易.一般开机后在命令行中使用route命令,会得到下面的信息   Kernel IP routing table   Destination ...

  9. Tomcat参数调优包括日志、线程数、内存【转】

    [Tomcat中日志打印对性能测试的影响] 一般都提供了这样5个日志级别: ▪ Debug ▪ Info ▪ Warn ▪ Error ▪ Fatal 由于性能测试需要并发进行压力测试,如果日志级别是 ...

  10. 集合框架之Map学习

    Map接口的实现类有HashTable.HashMap.TreeMap等,文章学习整理了“ Map和HashMap的使用方法”. /** * Map和HashMap的使用方法 */public sta ...