当前位置: 亚洲城ca88 > ca88 > 正文

java将office文书档案pdf文书档案转变到swf文件在线

时间:2019-08-09 00:40来源:ca88
java PDF添加图层的方法 支持多页图层添加,pdf多页  java PDF添加图层,支持多页图层添加,具体如下 代码: import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.Li

java PDF添加图层的方法 支持多页图层添加,pdf多页

 java PDF添加图层,支持多页图层添加,具体如下

代码:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

public class PdfUtils {

 /**
  * PDF添加图层
  * 
  * @param srcPdf
  *   原PDF文件路径
  * @param distPdf
  *   合成PDF输出路径
  * @param layerPathArr
  *   图层路径列表,图层名称需为数字(按照图片名称数字顺序合成在PDF对应页数上)
  * @return
  * @throws IOException
  * @throws DocumentException
  */
 public static String markLocalImage42Dist(String srcPdf, String distPdf, List<String> layerPathArr)
   throws IOException, DocumentException {
   File srcPdfFile = new File(srcPdf);
   if (!srcPdfFile.exists()) {
    throw new IllegalArgumentException("找不到需要添加图层的pdf文件");
   }

   PdfReader reader = new PdfReader(srcPdf);
   int n = reader.getNumberOfPages(); // PDF页数

   PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(distPdf));
   PdfContentByte over;

   for (String layerPath : layerPathArr) {
    File layerFile = new File(layerPath);
    String currentPageNo = layerFile.getName().substring(0, layerFile.getName().lastIndexOf(".")); // 图片名称(对应页数)

    boolean isNum = currentPageNo.matches("[0-9] ");
    if (!isNum) {
     throw new IllegalArgumentException("图层名称是不是数字");
    }

    Image img = Image.getInstance(layerPath);
    img.setAbsolutePosition(0, 0);
    if (n > 0 && n >= Integer.parseInt(currentPageNo)) {
     over = stamp.getOverContent(Integer.parseInt(currentPageNo));
     over.addImage(img);
    }
   }
   stamp.close();
   reader.close();
  return distPdf;
 }

}

测试:

public static void main(String[] args) throws IOException, DocumentException {
  List<String> imgUrlList = new ArrayList<>();
  imgUrlList.add("D:/ts/testPDF/1.png");
  //imgUrlList.add("D:/ts/testPDF/2.png");
  imgUrlList.add("D:/ts/testPDF/3.png");

  markLocalImage42Dist("D:/ts/testPDF/testPDF.pdf", "D:/ts/testPDF/testPDF2.pdf", imgUrlList);
 }

结果:

图片 1 图片 2

原PDF:

图片 3图片 4图片 5

合成后PDF:

图片 6图片 7图片 8

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持帮客之家。

PDF添加图层的方法 支持多页图层添加,pdf多页 java PDF添加图层,支持多页图层添加,具体如下 代码: import java.io.File;import java.io.FileO...

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

写了一段代码 大体是 InputStream读取文件到string后OutputStream到文件 
遇到的问题为TXT文件大小格式等都没有问题,但是PDFRAR等格式的就无法打开了,重新生成的文件大小会比原文件小,代码如下。 
package com.stream; 

第一步,安装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 filesopenoffice.org 3programsoffice -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 FilesWindows Resource KitsToolsinstsrv" OpenOfficeUnoServer "C:Program FilesWindows Resource KitsToolssrvany.exe"

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

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

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

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

  key:Application

     value:C:Program FilesOpenOffice.org 3programsoffice.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客戶端流览。    

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

     openoffice service.bat文件

    "C:Program FilesWindows Resource KitsToolsinstsrv" OpenOfficeUnoServer "C:Program FilesWindows Resource KitsToolssrvany.exe"
    reg add HKEY_LOCAL_MACHINESYSTEMControlSet001servicesOpenOfficeUnoServerParameters /ve /d
    reg add HKEY_LOCAL_MACHINESYSTEMControlSet001servicesOpenOfficeUnoServerParameters /v Application /t REG_SZ /d "C:Program FilesOpenOffice.org 3programsoffice.exe"
    reg add HKEY_LOCAL_MACHINESYSTEMControlSet001servicesOpenOfficeUnoServerParameters /v AppParameters /t REG_SZ /d "-invisible -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard"

import java.io.BufferedReader; 
import java.io.ByteArrayOutputStream; 
import java.io.DataOutputStream; 
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.OutputStream; 
import java.io.Reader; 
import java.util.Arrays; 

第二步,使用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();

public class bytearry { 
// public static void main(String[] args) throws Exception{ 
//        String s = "中国"; 
//        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
//        DataOutputStream dos = new DataOutputStream(baos); 
//        dos.writeUTF(s);     
//        byte[] b = baos.toByteArray(); 
//        for(int i=0;i<b.length;i ){ 
//            System.out.println(Integer.toHexString(b[i])); 
//        } 
//        System.out.println(">>>" new String(b,"UTF-8") "<<<");        
//        System.out.println("--------------------"); 
//        byte[] b2 = s.getBytes("UTF-8"); 
//        for(int i=0;i<b2.length;i ){ 
//            System.out.println(Integer.toHexString(b2[i])); 
//        } 
//    } 

第三步,使用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 进行测试。

// public static void main(String[] args) throws IOException { 
//   String str = "Hello world!"; 
//   // string转byte 
//   byte[] bs = str.getBytes(); 
//   System.out.println(Arrays.toString(bs)); 
//   
//   // byte转string 
//   String str2 = new String(bs); 
//   System.out.println(str2); 
//   
//   OutputStream os = new FileOutputStream("C://testCopy11.pdf");  //输出流 
//   FileInputStream fis = new FileInputStream("d://test.pdf");  //输入流 
//   //InputStreamReader     
//   Reader  inputStreamReader = new InputStreamReader(fis); 
//   BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
//   
//   String ss = new String();    
//   String s;    
//   while((s = bufferedReader.readLine())!=null){    
//           ss = s;    
//   } 
//   //System.out.println(ss); 
//   
//   byte[] buf = new byte[255]; 
//   
//   buf = ss.getBytes(); 
//   
//   
//
// 
//     int len = 0;  
//     //while ((len = buf.length) != -1) {  
//     // os.write(buf, 0, len); 
//     os.write(buf); 
//    // }  
//   
//     fis.close();  
//     os.flush();  
//     os.close(); 
//     //copy(); 
// 
// } 

第四步,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的完整转换,在代码中没有看到和上述问题相关的控制。笔者在得到预期的结果,偶尔也会装糊涂,不去继续深究。

public static void main(String[] args) throws IOException { 
  String str = "Hello world!"; 
  // string转byte 
  byte[] bs = str.getBytes(); 
  System.out.println(Arrays.toString(bs)); 
  
  // byte转string 
  String str2 = new String(bs); 
  System.out.println(str2); 
  
  OutputStream os = new FileOutputStream("C://bytearry.java");  //输出流 
  FileInputStream fis = new FileInputStream("d://bytearry.java");  //输入流 
  //InputStreamReader     
  Reader  inputStreamReader = new InputStreamReader(fis); 
  BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
  
  String ss = new String();    
  String s;    
  while((s = bufferedReader.readLine())!=null){    
          ss = s;    
  } 
  System.out.println(ss.length()); 
  
  byte[] buf = new byte[255]; 
  
  buf = loadAFileToStringDE2(new File("d://bytearry.java")).getBytes(); 
  int len = 0;  
    //while ((len = buf.length) != -1) {  
    // os.write(buf, 0, len); 
    os.write(buf); 
   // }   
    fis.close();  
    os.flush();  
    os.close(); 
    //copy(); 
    System.out.println(loadAFileToStringDE2(new File("d://bytearry.java"))); 

第五步,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,这里笔者不多述。

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

}
   public static String loadAFileToStringDE2(File f) throws IOException {  
        long beginTime = System.currentTimeMillis(); 
        InputStream is = null; 
        String ret = null; 
        try { 
            is =  new FileInputStream(f) ; 
            long contentLength = f.length(); 
            byte[] ba = new byte[(int)contentLength]; 
            is.read(ba); 
            ret = new String(ba); 
        } finally { 
            if(is!=null) {try{is.close();} catch(Exception e){} } 
        } 
        long endTime = System.currentTimeMillis(); 
        System.out.println("方法2用时" (endTime-beginTime) "ms"); 
        return ret;        
    } 
   
public static boolean copy() {  
   try {  
    OutputStream os = new FileOutputStream("C://test.pdf");  //输出流 
    InputStream fis = new FileInputStream("d://test.pdf");  //输入流 
  
    byte[] buf = new byte[255];  
    int len = 0;  
    while ((len = fis.read(buf)) != -1) {  
    os.write(buf, 0, len);  
    }  
  
    fis.close();  
    os.flush();  
    os.close();  
  
    return true;  
   } catch (FileNotFoundException e) {  
    // TODO Auto-generated catch block   
    e.printStackTrace();  
    return false;  
   } catch (IOException e) {  
    // TODO Auto-generated catch block   
    e.printStackTrace();  
    return false;  
   }  
}  

附一:使用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-simplifiedAdobe-GB1.cidToUnicode
unicodeMap   ISO-2022-CN C:xpdf-chinese-simplifiedISO-2022-CN.unicodeMap
unicodeMap   EUC-CN         C:xpdf-chinese-simplifiedEUC-CN.unicodeMap
unicodeMap   GBK              C:xpdf-chinese-simplifiedGBK.unicodeMap
cMapDir        Adobe-GB1    C:xpdf-chinese-simplifiedCMap
toUnicodeDir                     C:xpdf-chinese-simplifiedCMap
fontDir                             C:WINDOWSFonts
displayCIDFontTT Adobe-GB1 C:xpdf-chinese-simplifiedCMapgkai00mp.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";

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

 

问题补充:

chen_yongkai 写道

好乱啊,是指这段拷贝pdf格式的文档由问题吗? 

Java代码  图片 9

  1. public static boolean copy() {  
  2.         try {  
  3.             OutputStream os = new FileOutputStream("C://test.pdf"); // 输出流  
  4.             InputStream fis = new FileInputStream("d://test.pdf"); // 输入流  
  5.   
  6.             byte[] buf = new byte[255];  
  7.             int len = 0;  
  8.             while ((len = fis.read(buf)) != -1) {  
  9.                 os.write(buf, 0, len);  
  10.             }  
  11.   
  12.             fis.close();  
  13.             os.flush();  
  14.             os.close();  
  15.   
  16.             return true;  
  17.         } catch (FileNotFoundException e) {  
  18.             // TODO Auto-generated catch block  
  19.             e.printStackTrace();  
  20.             return false;  
  21.         } catch (IOException e) {  
  22.             // TODO Auto-generated catch block  
  23.             e.printStackTrace();  
  24.             return false;  
  25.         }  
  26.     }  

这个是按字节拷贝的,貌似没什么问题

--------------------------------------------------------- 
这段是没有问题的,但是 InputStream读取文件到string后OutputStream到文件,中间多了一个string过程。


问题补充:

chen_yongkai 写道

有问题的代码呢?重点贴出,不要混在一起

代码是可以运行的吧,下面的行就是InputStream读取文件到string 到byte[]啊。 
buf = loadAFileToStringDE2(new File("d://bytearry.java")).getBytes(); 

Java综合 

2011年9月21日 12:30

图片 10dongni110 
20 
0 0 0

 

  • 图片 11添加评论
  • 图片 12关注(0)

 

 

4个答案按时间排序按投票排序

00

请参见 
inputstream 转 string 转 outputstream

2014年3月28日 13:43

图片 13aqkf-2001 
30 
0 0 0

 

  • 图片 14添加评论

00

找到问题了: 
loadAFileToStringDE2方法里 
byte[] ba = new byte[(int)contentLength]; 
            is.read(ba); 
            ret = new String(ba); //这里用的是平台默认编码 

调用处: 
buf = loadAFileToStringDE2(new File("d://bytearry.java")).getBytes();//用的也是平台默认编码 

应该改为: 
ret = new String(ba,"ISO8859-1"); 

和 

buf = loadAFileToStringDE2(new File("d://bytearry.java")).getBytes("ISO8859-1"); 

平台默认编码有可能不包括某些字符,因而丢失了数据

2011年9月26日 09:40

图片 15chen_yongkai 
1600 
1 1 23

 

  • 图片 16添加评论

00

有问题的代码呢?重点贴出,不要混在一起

2011年9月22日 08:21

图片 17chen_yongkai 
1600 
1 1 23

 

  • 图片 18添加评论

00

好乱啊,是指这段拷贝pdf格式的文档由问题吗? 

Java代码  图片 19

  1. public static boolean copy() {  
  2.         try {  
  3.             OutputStream os = new FileOutputStream("C://test.pdf"); // 输出流  
  4.             InputStream fis = new FileInputStream("d://test.pdf"); // 输入流  
  5.   
  6.             byte[] buf = new byte[255];  
  7.             int len = 0;  
  8.             while ((len = fis.read(buf)) != -1) {  
  9.                 os.write(buf, 0, len);  
  10.             }  
  11.   
  12.             fis.close();  
  13.             os.flush();  
  14.             os.close();  
  15.   
  16.             return true;  
  17.         } catch (FileNotFoundException e) {  
  18.             // TODO Auto-generated catch block  
  19.             e.printStackTrace();  
  20.             return false;  
  21.         } catch (IOException e) {  
  22.             // TODO Auto-generated catch block  
  23.             e.printStackTrace();  
  24.             return false;  
  25.         }  
  26.     }  

这个是按字节拷贝的,貌似没什么问题

编辑:ca88 本文来源:java将office文书档案pdf文书档案转变到swf文件在线

关键词: 亚洲城ca88