java web在线预览--参考一

原址:https://www.cnblogs.com/wdcwy/p/6949540.html

这个博主提供的最为详细,基本思路和流程都走了一片,包括一些坑都踩了

备份原文:

 

 

Java实现web在线预览office文档与pdf文档实例

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

 

 

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

云计算 云服务器ECS 大数据 建站 备案 文档 域名 whois查询 文集

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目录下,引入架包就可以了。这个架包有如下包:

Java实现web在线预览office<a target=_blank target=_blank target=_blank href=文档与pdf文档实例-office文档在线预览">


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

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

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

整个项目结如下:

Java实现web在线预览office文档与pdf文档实例-html5 office文档预览


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

转换类为DocConverter 的代码:
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

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代码如下:
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

<%@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
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

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
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<%@ 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
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

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
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<%@ 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
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

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
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<%@ 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";

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值