用Java实现office(word,excel)转换为PDF文件(提供源码及一键部署)

用Java实现office文件转换为PDF。研究了一下主要有以下几种方式:

1.使用openoffice,这个可以再linux系统中使用。但是这个据说对于样式复杂的office文件,转换的效果并不好。(但是linux下仍然推荐使用这个)

2.使用POI技术+itext技术。这个样式设计比较繁琐,并且样式效果也不是太好。

3.jacob技术,也是本文要讲解的技术。这个的实现思路是通过Java代码控制Windows系统上的office软件,进行转换。(仅限Windows服务器)

前期的准备工作:

1.下载jacob的相关jar包。里面主要包含jacob.jar和jacob-1.18-x64.dll,jacob-1.18-x86.dll三个文件。先将jar包引入到工程中,然后启动工程会报错,根据提示的错误信息,将指定的dll文件,加到当前jdk/jre/bin目录下即可。查看当前jdk安装路径的方法:通过配置的环境变量去查看所在目录。(注意引入的文件名要与报错的信息保持一致)

下载地址: http://sourceforge.net/project/jacob-project(该地址可能不能用了,自行寻找吧)

2.excel转PDF的话,一般要安装savapdf的插件。去下载SaveAsPDFandXPS.exe并一步步安装。

3.Excel转PDF,还容易报缺少打印机的错误。去Windows的本地服务里开启print spooler服务

4.excel转PDF,还容易出现PDF显示不全的问题。解决的方法是,打开Excel,然后分页预览,将两条蓝色的边线,分别拉倒两侧,(当前文件有多宽,就设置多宽)然后保存。参考https://jingyan.baidu.com/article/48b558e3266ab17f38c09ac0.html

5.准备其他需要的jar包。有poi-ooxml-3.9.jar,poi-3.9.jar,ooxml-schemas-1.1.jar,dom4j-2.0.0-RC1.jar

准备工作做完了,就上代码了:

 

import java.io.File;  
import org.apache.poi.POIXMLDocument;  
import org.apache.poi.xwpf.usermodel.XWPFDocument;  
import org.dom4j.Document;  
import org.dom4j.DocumentException;  
import org.dom4j.io.SAXReader;    
import com.jacob.activeX.ActiveXComponent;  
import com.jacob.com.ComThread;  
import com.jacob.com.Dispatch;  
import com.jacob.com.Variant;   
public class Office2pdf {    
    static final int wdFormatPDF = 17;// PDF 格式      
    /**
     * word转化为PDF
     * @param sfileName
     * @param toFileName
     * @return
     * @throws Exception
     * @author ygl
     */
    public static int word2Pdf(String sfileName,String toFileName) throws Exception{      
              
        System.out.println("启动Word...");        
        long start = System.currentTimeMillis();        
        ActiveXComponent app = null;    
        Dispatch doc = null;    
        try {        
            app = new ActiveXComponent("Word.Application");   
            app.setProperty("Visible", new Variant(false));    
            // 打开word文件  
            Dispatch docs = app.getProperty("Documents").toDispatch();     
//          doc = Dispatch.call(docs,  "Open" , sourceFile).toDispatch();     
            doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] {                      
               sfileName, new Variant(false),new Variant(true) }, new int[1]).toDispatch();  
            System.out.println("打开文档..." + sfileName);    
            System.out.println("转换文档到PDF..." + toFileName);        
            File tofile = new File(toFileName);      
           // System.err.println(getDocPageSize(new File(sfileName)));  
            if (tofile.exists()) {        
                tofile.delete();        
            }          
//          Dispatch.call(doc, "SaveAs",  destFile,  17);     
         // 作为html格式保存到临时文件::new Variant(8)其中8表示word转html;7表示word转txt;44表示Excel转html;17表示word转成pdf。
            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {                  
                toFileName, new Variant(17) }, new int[1]);      
            long end = System.currentTimeMillis();        
            System.out.println("转换完成..用时:" + (end - start) + "ms.");                
        } catch (Exception e) {    
            e.printStackTrace();    
            System.out.println("========Error:文档转换失败:" + e.getMessage());        
        }catch(Throwable t){  
            t.printStackTrace();  
        } finally {    
            // 关闭word  
            Dispatch.call(doc,"Close",false);    
            System.out.println("关闭文档");    
            if (app != null)        
                app.invoke("Quit", new Variant[] {});        
            }    
          //如果没有这句winword.exe进程将不会关
           ComThread.Release();    
           return 1;  
           }    
    private static Document read(File xmlFile) throws DocumentException {  
        SAXReader saxReader = new SAXReader();  
        return saxReader.read(xmlFile);  
    }  
    public  int getDocPageSize(String filePath)  throws Exception {  
        XWPFDocument docx = new XWPFDocument(POIXMLDocument.openPackage(filePath));  
        int pages = docx.getProperties().getExtendedProperties().getUnderlyingProperties().getPages();//总页
        int wordCount = docx.getProperties().getExtendedProperties().getUnderlyingProperties().getCharacters();// 忽略空格的字符另外还有getCharactersWithSpaces()方法获取带空格的总字数�?          
        System.out.println ("pages=" + pages + " wordCount=" + wordCount);  
        return pages;  
    }  
    /**
     * excle转PDF
     * @param els
     * @param pdf
     * @author ygl
     */  
    public static void excel2Pdf(String inFilePath, String outFilePath) throws Exception {
        ActiveXComponent ax = null;
        Dispatch excel = null;
        try {
            ComThread.InitSTA();
            ax = new ActiveXComponent("Excel.Application");
            ax.setProperty("Visible", new Variant(false));
            ax.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏
            Dispatch excels = ax.getProperty("Workbooks").toDispatch();
            Object[] obj = new Object[]{ 
                    inFilePath, 
                    new Variant(false),
                    new Variant(false) 
             };
            excel = Dispatch.invoke(excels, "Open", Dispatch.Method, obj, new int[9]).toDispatch();
            File tofile = new File(outFilePath);      
            // System.err.println(getDocPageSize(new File(sfileName)));  
             if (tofile.exists()) {        
                 tofile.delete();        
             }        
            // 转换格式
            Object[] obj2 = new Object[]{ 
                    new Variant(0), // PDF格式=0
                    outFilePath, 
                    new Variant(0)  //0=标准 (生成的PDF图片不会变模糊) ; 1=最小文件
            };
            Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method,obj2, new int[1]);
            System.out.println("转换完毕!");
        } catch (Exception es) {
            es.printStackTrace();
            throw es;
        } finally {
            if (excel != null) {
                Dispatch.call(excel, "Close", new Variant(false));
            }
            if (ax != null) {
                ax.invoke("Quit", new Variant[] {});
                ax = null;
            }
            ComThread.Release();
        }
    }
    public static void main(String[] args) throws Exception {    
      word2Pdf("d:\\222.docx", "d:\\222.pdf");    
        excel2Pdf("d:\\44.xlsx", "d:\\44.pdf");    
    }    
    
} 

 

注意:Excel转换为PDF只能转换第一个sheet。

另附,我自己写的现成的工程,及bat文件。一键启动,无需更改,方便快捷。https://download.csdn.net/download/qq_29281307/10668558

 

你可能感兴趣的:(用Java实现office(word,excel)转换为PDF文件(提供源码及一键部署))