masque的gravatar头像
masque 2015-07-09 23:04:21

2003高版本word转pdf的功能如何实现?

最近项目要用到一个word转pdf功能,网上找了很久,试了很多方法,

http://my.oschina.net/mingpeng/blog/337198

只有这个还原度比较高,没多少乱码,但是不支持2003版本

说说最原始的需求吧,一个归档功能,原来的是doc或者docx 现在要转换为pdf版本。

在linux上的openoffice转换还原度很低,经理想法是下载在本地,本地office转好再上传到服务器.

第一,下载后用户把文件保存在哪?这个无法确定.

第二,由于安全机制,用户不选择文件的情况下,浏览器的js是无法做到选中文件上传到服务器(转换好文件之后)

上面提到的方法只支持高版本的转换.

哪位牛牛有这方面的经验望指点.

希望是java代码就能做到,有开源Linux上的插件也可以,但是要求还原度高。

所有回答列表(2)
609718046的gravatar头像
609718046  LV4 2015年7月14日

/**OfficeToPdf
     * @param word文件路径
     * @param pdf文件路径
     * @param formatType(Html,Pdf,Docx)
     * @return 
     */
    public boolean officeConvert(String office,String target,String formatType) {
        /*
         * office转换结果参数
         * 0:Doc
         * 1:Dot
         * 2-5:Txt
         * 6:Rtf
         * 7:Txt
         * 8,10:htm
         * 11:xml
         * 12,16:Docx
         * 13:Docm
         * 14:Dotx
         * 15:Dotm
         * 17: 32:  57:  pdf
         */
        int format = 99 ;
        boolean result = false;
        String filetype = office.substring(office.lastIndexOf(".") + 1, office.length()).toLowerCase();
        switch(formatType){
            case "Html":
                if("doc".equals(filetype) || "docx".equals(filetype)){
                    format = 8;// word
                 }else {
                     format = 99;
                 }
                break;            
            case "Pdf":
                if("doc".equals(filetype) || "docx".equals(filetype)){
                    format = 17;// word
                 }else if("ppt".equals(filetype) || "pptx".equals(filetype)){
                     format = 32 ;//ppt
                 }else if("xls".equals(filetype) || "xlsx".equals(filetype)){
                     format = 57;// Excel
                 }
                break;
            case "Docx":
                format = 16;
                break;
            case "txt":
                format = 7;
                break;
            default:
                format = 99;
                break;    
        }
        if(format == 99){
            log.info("Office转换终止:转换类型不明确!");
            return result;
        }
        if("txt".equals(filetype) || "doc".equals(filetype) || "docx".equals(filetype)||"ppt".equals(filetype) || "pptx".equals(filetype)||"xls".equals(filetype) || "xlsx".equals(filetype)||"docm".equals(filetype)){
            log.info("Office转换进度:源文件类型校验通过!(路径为:" + office + ")");
        }else{
            log.info("Office转换终止:源文件类型不正确!");
            return result;
        }
        ActiveXComponent app = jacobPool.getConnection(filetype); // 启动Office
        String officeProperty = "";
        if("txt".equals(filetype) || "doc".equals(filetype) || "docx".equals(filetype) || "docm".equals(filetype)){
            officeProperty = "Documents";// word
         }else if("ppt".equals(filetype) || "pptx".equals(filetype)){
             officeProperty = "Presentations";// PowerPoint
         }else if("xls".equals(filetype) || "xlsx".equals(filetype)){
             officeProperty = "Workbooks";// Excel
         }
        try {
               log.info("Office转换进度:"+filetype+"转" + formatType + "开始!");
                (new File(target.substring(0, target.lastIndexOf("/")))).mkdirs(); // 如果文件夹不存在,则建立新文件夹
                // 设置word不可见
                Dispatch docs = app.getProperty(officeProperty).toDispatch();
                // 打开word文件
                Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] { office.replaceAll("/", "\\\\"), new Variant(false), new Variant(true) }, new int[1]).toDispatch();
                // 作为pdf格式保存
                Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { target.replaceAll("/", "\\\\"), new Variant(format) }, new int[1]);
                Variant f = new Variant(false);
            if ("Presentations".equals(officeProperty)) {//ppt文档 需要特殊处理服务器显示最后再杀死进程
                app.invoke("Quit", new Variant[0]);
                app = null;
                ComThread.Release();  
            }    else{
                    Dispatch.call(doc, "Close", f);
            }
                log.info("Office转" + formatType + "成功!(文件生成路径为:" + target + ")");
                result = true;
            //暂时解决,待修改
                Dispatch.call(app, "Quit");
                jacobPool.freeConnection(null);
        } catch (Exception ex) {
            log.info("Office转" + formatType + "异常(Exception)!",ex);
            jacobPool.removeFromfreeConnections(app);
            return result;
        } catch (Error ex) {
            log.info("Office转" + formatType + "异常(Error)!",ex);
            jacobPool.removeFromfreeConnections(app);
            return result;
        } finally {
            log.info("Office转" + formatType + "结束!");
        }
        return result;
    }
    

评论(0) 最佳答案
touch39的gravatar头像
touch39  LV10 2015年7月10日

在读写时,请注意文件的版本问题,2003前使用HSSF组件,2003以后使用XSSF组件
    try{
        wb = new HSSFWorkbook(new FileInputStream(file));
    }catch(OfficeXmlFileException e){
        wb = new XSSFWorkbook(new FileInputStream(file));
    }

不知道能否帮助你

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友