java WordUtils word文档工具类
package com.sicdt.library.core.utils; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.Set; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.Range; import org.apache.poi.xwpf.converter.core.XWPFConverterException; public class WordUtils { /** * <br> * 描 述: doc内容改变 <br> * 作 者: shizhenwei <br> * 历 史: (版本) 作者 时间 注释 * * @param is * doc文档模板 * @param params * key value 将模板里的可以替换为响应VALUE * @return * @throws IOException */ public static byte[] docContentChange(InputStream is, Map<String, String> params) throws IOException { HWPFDocument document = new HWPFDocument(is); Range range = document.getRange(); Set<String> keys = params.keySet(); for (String key : keys) { range.replaceText(key, params.get(key)); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); document.write(baos); byte[] bytes = baos.toByteArray(); document.close(); baos.close(); return bytes; } /** * <br> * 描 述: docx内容改变 <br> * 作 者: shizhenwei <br> * 历 史: (版本) 作者 时间 注释 * * @param is * docx文档模板 * @param params * key value 将模板里的可以替换为响应VALUE * @return * @throws IOException * @throws XWPFConverterException */ public static byte[] docxContentChange(InputStream is, Map<String, String> params) throws XWPFConverterException, IOException { return DocxUtils.docxContentChange(is, params); } /** * <br> * 描 述: 将docx字节数组流转换为pdf字节数组流 <br> * 作 者: shizhenwei <br> * 历 史: (版本) 作者 时间 注释 * * @param docxBytes * docx文档字节数组 * @return * @throws XWPFConverterException * @throws IOException * 注:需在部署系统安装word对应的中文字体 */ public static byte[] docx2pdf(byte[] docxBytes) throws XWPFConverterException, IOException { return DocxUtils.docx2pdf(docxBytes); } /** * <br> * 描 述: 将Word模板流改变内容后转换为pdf字节数组流 <br> * 作 者: shizhenwei <br> * 历 史: (版本) 作者 时间 注释 * * @param is * docx文档输入流 * @param params * key value 将模板里的可以替换为响应VALUE * @return * @throws IOException * @throws XWPFConverterException * * 注:需在部署系统安装word对应的中文字体 */ public static byte[] docx2pdf(InputStream is, Map<String, String> params) throws XWPFConverterException, IOException { return DocxUtils.docx2pdf(is, params); } }
package com.sicdt.library.core.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.Range; import org.apache.poi.xwpf.converter.core.XWPFConverterException; 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; /** * * @author zhenwei.shi * */ public class DocxUtils { /** * <br> * 描 述: doc内容改变 <br> * 作 者: shizhenwei <br> * 历 史: (版本) 作者 时间 注释 * * @param is * doc文档模板 * @param params * key value 将模板里的可以替换为响应VALUE * @return * @throws IOException */ public static byte[] docContentChange(InputStream is, Map<String, String> params) throws IOException { HWPFDocument document = new HWPFDocument(is); Range range = document.getRange(); Set<String> keys = params.keySet(); for (String key : keys) { range.replaceText("{{"+key.toString()+"}}", params.get(key)); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); document.write(baos); byte[] bytes = baos.toByteArray(); document.close(); baos.close(); return bytes; } /** * <br>描 述: docx内容改变 * <br>作 者: shizhenwei * <br>历 史: (版本) 作者 时间 注释 * @param is docx文档模板 * @param params key value 将模板里的可以替换为响应VALUE * @return * @throws IOException * @throws XWPFConverterException */ public static byte[] docxContentChange(InputStream is,Map<String,String> params) throws XWPFConverterException, IOException{ XWPFDocument document = new XWPFDocument(is); List<XWPFParagraph> list = document.getParagraphs(); for(XWPFParagraph paragraph : list){ String regex = "(\\w|\\W)*\\{\\{\\w+\\}\\}(\\w|\\W)*";//{{string}}匹配 if(!paragraph.getText().matches(regex)){ continue; } List<XWPFRun> runs = paragraph.getRuns(); loop : for(int i=0; i<runs.size(); i++){ XWPFRun run = runs.get(i); if(!run.text().matches(regex)){ continue; } if(null==params || params.keySet().size()<1){ run.setText("",0); continue; } Set<String> keySet = params.keySet(); for(String key : keySet){ if(run.text().contains(key)){ String text = run.text().replaceAll(getReplaceAllKey("{{"+key.toString()+"}}"), params.get(key)); run.setText(text,0); continue loop; } } run.setText("",0); } } ByteArrayOutputStream baos = new ByteArrayOutputStream(); document.write(baos); byte[] bytes = baos.toByteArray(); document.close(); baos.close(); return bytes; } /** * <br>描 述: 将docx字节数组流转换为pdf字节数组流 * <br>作 者: shizhenwei * <br>历 史: (版本) 作者 时间 注释 * @param docxBytes docx文档字节数组 * @return * @throws XWPFConverterException * @throws IOException * 注:需在部署系统安装word对应的中文字体 */ public static byte[] docx2pdf(byte[] docxBytes) throws XWPFConverterException, IOException{ PdfOptions options = PdfOptions.create(); XWPFDocument document = new XWPFDocument(new ByteArrayInputStream(docxBytes)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfConverter.getInstance().convert(document, baos, options); return baos.toByteArray(); } /** * <br>描 述: 将Word模板流改变内容后转换为pdf字节数组流 * <br>作 者: shizhenwei * <br>历 史: (版本) 作者 时间 注释 * @param is docx文档输入流 * @param params key value 将模板里的可以替换为响应VALUE * @return * @throws IOException * @throws XWPFConverterException * * 注:需在部署系统安装word对应的中文字体 */ public static byte[] docx2pdf(InputStream is,Map<String, String> params) throws XWPFConverterException, IOException{ XWPFDocument document = new XWPFDocument(is); List<XWPFParagraph> list = document.getParagraphs(); for(XWPFParagraph paragraph : list){ String regex = "(\\w|\\W)*\\{\\{\\w+\\}\\}(\\w|\\W)*";//{{string}}匹配 if(!paragraph.getText().matches(regex)){ continue; } List<XWPFRun> runs = paragraph.getRuns(); for(int i=0; i<runs.size(); i++){ XWPFRun run = runs.get(i); if(!run.text().matches(regex)){ continue; } Set<String> keySet = params.keySet(); for(String key : keySet){ key = "{{"+key+"}}"; if(run.text().contains(key)){ String text = run.text().replaceAll(getReplaceAllKey(key), params.get(key)); run.setText(text,0); } } } } ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfOptions options = PdfOptions.create(); PdfConverter.getInstance().convert(document, baos, options); byte[] bytes = baos.toByteArray(); document.close(); baos.close(); return bytes; } /** * * <br>描 述: String replaceAll方法默认正则 {{}} 对特殊字符进行转义,如 {} == \\{\\} * <br>作 者: shizhenwei * <br>历 史: (版本) 作者 时间 注释 * @param key * @return */ public static String getReplaceAllKey(String key){ String afterKey = ""; for(int i=0; i<key.length(); i++){ if('{'==key.charAt(i)){ afterKey+="\\{"; }else if('}'==key.charAt(i)){ afterKey+="\\}"; }else{ afterKey+=key.charAt(i); } } return afterKey; } }