当下做一个项目,就是各种操作office,客户的需求总是各种不按常理,来需求就得搞啊.对JAVA操作office这方面真是头大,弟弟是真滴不懂不会啊。无奈只好试啊试的。网上一大堆好使的,一大堆不好使的。整了一大堆word转PDF的方法。但是客户要求有水印,又不想花钱。硬着头皮试了一堆。虽说暂时还都没采用,但是收获也是有的。以下都是亲测可用的(很多都是借鉴了前辈的博文)一来给自己用(毕竟我记性不好), 二来是希望能对看到本博客的帅哥靓妹们有点用处,免得一用都是不好使的。以下方法都是转换结果比较可观的。。。。要用哪个自己斟酌,本博客的方法也许会不断的增加。有心自己看吧!!

第一种方法

JobConverter + OpenOffice     ( Windows系统下 )JobConverter的jar包下载地址 :  点我去下载OpenOffice的下载地址 : 点我去下载    OpenOffice 的安装路径自己定义。 代码中要使用对应路径调用启动服务  (此处友情提示)

 
import java.io.File; 
import java.io.IOException; 
  
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;     
  
    // 将word格式的文件转换为pdf格式 
    public static void WordToPDF(String startFile, String overFile) throws IOException { 
        // 源文件目录 
        File inputFile = new File(startFile); 
        if (!inputFile.exists()) { 
            System.out.println("源文件不存在!"); 
            return; 
        } 
         
        // 输出文件目录 
        File outputFile = new File(overFile); 
        if (!outputFile.getParentFile().exists()) { 
            outputFile.getParentFile().exists(); 
        } 
         
        // 调用openoffice服务线程 
        /** 我把openOffice下载到了 C:/Program Files (x86)/下  ,下面的写法自己修改编辑就可以**/ 
        String command = "C:/Program Files (x86)/OpenOffice 4/program/soffice.exe -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\""; 
        Process p = Runtime.getRuntime().exec(command); 
  
        // 连接openoffice服务 
        OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1", 8100); 
        connection.connect(); 
  
        // 转换 
        DocumentConverter converter = new OpenOfficeDocumentConverter(connection); 
        converter.convert(inputFile, outputFile); 
  
        // 关闭连接 
        connection.disconnect(); 
  
        // 关闭进程 
        p.destroy(); 
    } 
     
     
     public static void main(String[] args) { 
        String start = "F:\\新建文件夹\\我是word测试文件.docx"; 
        String over = "F:\\新建文件夹\\成了.pdf"; 
        try { 
        	WordToPDF(start, over); 
		} catch (IOException e) { 
			e.printStackTrace(); 
		} 
	} 

第二种方法

SaveAsPDFandXPS + jacob (Windows操作系统下,电脑里有office)SaveAsPDFandXPS 下载地址  :  点我去下载      jacob 的jar包 下载地址 : 点我去下载  先安装SaveAsPDFandXPS ,安装成功后 , 打开jacob的jar包  ,里面的结构应该是这样的把jacob.jar 放到项目下然后 这里注意 把  两个后缀为dll的文件 放到 jre目录bin的里面   必须放进去  不然会报错(java.lang.NoClassDefFoundError) ,实在不懂看此图    如果是默认安装 大概就是这个文件里面。然后准备就绪  对应代码

 
import java.io.File; 
import com.jacob.activeX.ActiveXComponent; 
import com.jacob.com.ComThread; 
import com.jacob.com.Dispatch; 
import com.jacob.com.Variant; 
  
private static final int wdFormatPDF = 17;// PDF 格式     
	public static void wordToPDF(){     
  
		ActiveXComponent app = null;   
		Dispatch doc = null;   
		try {       
			app = new ActiveXComponent("Word.Application");       
			app.setProperty("Visible", new Variant(false));   
			Dispatch docs = app.getProperty("Documents").toDispatch();     
  
			//转换前的文件路径 
			String startFile = "F:\\新建文件夹\\我是word版本" + ".doc"; 
			//转换后的文件路劲 
			String overFile =  "F:\\新建文件夹\\我是转换后的pdf文件"  + ".pdf"; 
  
			doc = Dispatch.call(docs,  "Open" , startFile).toDispatch();   
			File tofile = new File(overFile);       
			if (tofile.exists()) {       
				tofile.delete();       
			}       
			Dispatch.call(doc,"SaveAs", overFile, wdFormatPDF);       
		} catch (Exception e) {       
			System.out.println(e.getMessage());       
		} finally {   
			Dispatch.call(doc,"Close",false);   
			if (app != null)       
				app.invoke("Quit", new Variant[] {});       
		}   
		//结束后关闭进程    
		ComThread.Release(); 
	} 
  
  
	public static void main(String[] args) { 
		wordToPDF(); 
	} 

第三种方法

这种方法纯属是搜刮出来的,因为测试好用。所以也弄了上来。这个里面依赖的jar包挺麻烦的。但是只要导入jar包就可以获得立竿见影的效果,缺点可能就速度上比较上面两种能慢一些,还有就是支持的是docx的文档格式 。我把所有jar包一点一点的搜集起来整合了一下(jar包的版本也会造成问题。所以我整合了一版)大家可以去这里下载→  整合版jar包下载地址    这个代码相比较上面两种就比较容易了。导入jar包就能用。

 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream;   
import java.io.InputStream;   
import java.io.OutputStream;   
import java.util.HashMap;   
import java.util.List;   
import java.util.Map;   
    
import org.apache.commons.collections.MapUtils; 
import org.apache.poi.xwpf.converter.core.utils.StringUtils; 
import org.apache.poi.xwpf.converter.pdf.PdfConverter; 
import org.apache.poi.xwpf.converter.pdf.PdfOptions; 
import org.apache.poi.xwpf.usermodel.XWPFDocument;   
import org.apache.poi.xwpf.usermodel.XWPFParagraph;   
import org.apache.poi.xwpf.usermodel.XWPFRun;   
import org.apache.poi.xwpf.usermodel.XWPFTable;   
import org.apache.poi.xwpf.usermodel.XWPFTableCell;   
import org.apache.poi.xwpf.usermodel.XWPFTableRow;   
    
  
public class WordToPDF {   
    
    
    /**  
     * 将word文档, 转换成pdf, 中间替换掉变量  
     * @param source 源为word文档, 必须为docx文档  
     * @param target 目标输出  
     * @param params 需要替换的变量  
     * @throws Exception  
     */   
    public static void wordConverterToPdf(InputStream source,   
            OutputStream target, Map<String, String> params) throws Exception {   
        wordConverterToPdf(source, target, null, params);       
    }   
    
    /**  
     * 将word文档, 转换成pdf, 中间替换掉变量  
     * @param source 源为word文档, 必须为docx文档  
     * @param target 目标输出  
     * @param params 需要替换的变量  
     * @param options PdfOptions.create().fontEncoding( "windows-1250" ) 或者其他  
     * @throws Exception  
     */   
    public static void wordConverterToPdf(InputStream source, OutputStream target,    
            PdfOptions options,   
            Map<String, String> params) throws Exception {   
         XWPFDocument doc = new XWPFDocument(source);   
         paragraphReplace(doc.getParagraphs(), params);   
         for (XWPFTable table : doc.getTables()) {   
           for (XWPFTableRow row : table.getRows()) {   
               for (XWPFTableCell cell : row.getTableCells()) {   
                   paragraphReplace(cell.getParagraphs(), params);   
               }   
           }   
       }   
       PdfConverter.getInstance().convert(doc, target, options);   
    }   
        
    /** 替换段落中内容 */   
    private static void paragraphReplace(List<XWPFParagraph> paragraphs, Map<String, String> params) {   
        if (MapUtils.isNotEmpty(params)) {   
            for (XWPFParagraph p : paragraphs){   
                for (XWPFRun r : p.getRuns()){   
                    String content = r.getText(r.getTextPosition());   
                    if(StringUtils.isNotEmpty(content) && params.containsKey(content)) {   
                        r.setText(params.get(content), 0);   
                    }   
                }   
            }   
        }   
    }   
        
     
    public static void main(String[] args) { 
        String filepath = "F:\\新建文件夹\\我是word.docx";   
        String outpath = "F:\\新建文件夹\\我是结果.pdf";    
            
        InputStream source; 
		OutputStream target; 
		try { 
			source = new FileInputStream(filepath);   
			target = new FileOutputStream(outpath); 
	        Map<String, String> params = new HashMap<String, String>();   
	            
	            
	        PdfOptions options = PdfOptions.create();   
	            
	        wordConverterToPdf(source, target, options, params);   
		} catch (FileNotFoundException e) { 
			// TODO Auto-generated catch block 
			e.printStackTrace(); 
		} catch (Exception e) { 
			// TODO Auto-generated catch block 
			e.printStackTrace(); 
		}   
  
	} 
}   

第一种效果不错,windows . linux 都可以配置。 linux有兴趣可以自己查阅 。

第二种最好,几乎不管水印还是格式都完美的转换。 但是只能支持windows 。

第三种最方便, 效果和第一种差不多,但是速度稍微慢了一些。 

以上方法,大多经过网上前辈们的博客博文的指点, 并加上本人亲测,完全可用。

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

E45: 'readonly' option is set (add ! to override)错误解决详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。