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