package org.wican.company.approval.utils;
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.XWPFTableCell;
import org.wican.company.utils.pdfUtils.Word2PdfAsposeUtil;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Map;
import static org.wican.company.utils.pdfUtils.Word2PdfAsposeUtil.getLicense;
public class ExportBootsUtils {
public static void exportsDoc(Map<String, Object> map, HttpServletResponse response, String wordPath) throws Exception {
exportsDoc(map, response, wordPath, false);
}
public static void exportsDoc(Map<String, Object> map, HttpServletResponse response, String wordPath, Boolean isPdf) throws Exception {
exportsDoc(map, response, wordPath, null, isPdf);
}
public static void exportsDoc(Map<String, Object> map, HttpServletResponse response, String wordPath, String fileName, Boolean isPdf) throws Exception {
exportsDoc(map, response, wordPath, fileName, null, isPdf);
}
public static void exportsDoc(Map<String, Object> map, HttpServletResponse response, String wordPath, String fileName, String filePath, Boolean isPdf) throws Exception {
if(fileName == null){
fileName = "demo";
}
cn.afterturn.easypoi.word.parse.ParseWord07 pw07 = new cn.afterturn.easypoi.word.parse.ParseWord07();
XWPFDocument doc = pw07.parseWord(wordPath, map);
doc.getTables()
.forEach(xwpfTable -> xwpfTable.getRows()
.forEach(xwpfTableRow -> xwpfTableRow.getTableCells()
.forEach(item->{
addBreakInCell(item);
})));
if(isPdf){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
doc.write(bos);
if(filePath != null){
exportPDF(bos.toByteArray(),response, filePath, fileName);
}else{
InputStream ins = null;
OutputStream out = null;
ins = new ByteArrayInputStream(bos.toByteArray());
response.setContentType("application/vnd.ms-word");
response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName + ".pdf", "utf-8"));
out = response.getOutputStream();
Word2PdfAsposeUtil.doc2pdf(ins,out);
}
}else{
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName + ".docx", "utf-8"));
OutputStream bos = response.getOutputStream();
doc.write(bos);
}
}
public static void exportPDF(byte[] brray, HttpServletResponse response, String filePath, String fileName) {
OutputStream os = null;
BufferedInputStream bis = null;
FileInputStream fis = null;
try {
getLicense();
InputStream is = new ByteArrayInputStream(brray);
File file = new File(filePath);
com.aspose.words.Document document = new com.aspose.words.Document(is);
FileOutputStream fileOS = new FileOutputStream(file);
document.save(fileOS, com.aspose.words.SaveFormat.PDF);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".pdf", "UTF-8"));
response.setContentType("application/pdf");
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
os = response.getOutputStream();
byte[] buffer = new byte[1024];
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
file.delete();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
if (bis != null) {
bis.close();
}
if (os != null) {
os.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void addBreakInCell(XWPFTableCell cell) {
if (cell.getText() != null && cell.getText().contains("\n")) {
for (XWPFParagraph p : cell.getParagraphs()) {
for (XWPFRun run : p.getRuns()) {
if (run.getText(0) != null && run.getText(0).contains("\n")) {
String[] lines = run.getText(0).split("\n");
if (lines.length > 0) {
run.setText(lines[0], 0);
for (int i = 1; i < lines.length; i++) {
run.addBreak();
run.setText(lines[i]);
}
}
}
}
}
}
}
}