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;
}
}

最新文章

  1. 转: 深入理解Linux修改hostname
  2. css面包屑导航编号
  3. rails 常用的知识点
  4. Html 两个DIV并排的问题
  5. Myeclipse下JSP打开报空指针异常解决方法。
  6. Andriod ADB开启Activity、Service以及BroadCast(包括参数的传递)
  7. git SSH keys
  8. day6-2面向对象
  9. 转:设置session过期时间
  10. JavaScript break和continue 跳出循环
  11. pecl安装php的ev扩展时的报错处理
  12. Operation not permitted引发的惊魂72小时
  13. 第二次作业——个人项目实战(Sudoku)
  14. 学会WCF之试错法——安全配置报错分析
  15. MATLAB——画图(经典)
  16. [译]Ocelot - Quality of Service
  17. Win2008 IIS7.5安装配置PHP7.3.2步骤,及500错误解决
  18. 机器学习入门14 - 神经网络简介 (Introduction to Neural Networks)
  19. IntelliJ IDEA连接TFS local workspace无法正常签入
  20. SpringBoot定制修改Servlet容器

热门文章

  1. 你设计的应用是IO依赖型还是CPU依赖型?
  2. Oracle基础学习登陆SQLPLUS(一)
  3. Vuex 2 入门与提高。
  4. C指针类型小结
  5. js yield
  6. iOS --发送手机验证码收不到手机验证码
  7. linux中使用vi 打开文件时,能显示行号
  8. Tomcat工作原理解析!
  9. [Oracle] - Create DB on Oracle 12c for an Application
  10. java.lang.VerifyError: Expecting a stack map frame