CardrptBaseAction.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package nccloud.web.hrhi.cardrep.action;
  2. import nc.bs.logging.Logger;
  3. import nc.hr.utils.MultiLangHelper;
  4. import nc.hr.utils.ResHelper;
  5. import nc.itf.hr.frame.IPersistenceRetrieve;
  6. import nc.itf.hr.tools.rtf.IGenerateRTFDocument;
  7. import nc.ui.hr.tools.rtf.jacob.RtfHelper;
  8. import nc.ui.hr.tools.rtf.jacob.WordUtil;
  9. import nc.vo.hi.repdef.RepDefVO;
  10. import nc.vo.hr.tools.rtf.RtfTemplateVO;
  11. import nc.vo.pub.BusinessException;
  12. import nc.vo.uif2.LoginContext;
  13. import nccloud.commons.lang.StringUtils;
  14. import nccloud.framework.core.io.WebFile;
  15. import nccloud.framework.service.ServiceLocator;
  16. import nccloud.web.hr.pub.HRCommonAction;
  17. import nccloud.web.uapbd.commons.web.ParamUtils;
  18. import org.apache.commons.io.FileUtils;
  19. import org.apache.poi.hwpf.HWPFDocument;
  20. import org.apache.poi.hwpf.converter.PicturesManager;
  21. import org.apache.poi.hwpf.converter.WordToHtmlConverter;
  22. import org.apache.poi.hwpf.usermodel.PictureType;
  23. import org.jodconverter.JodConverter;
  24. import org.jodconverter.office.LocalOfficeManager;
  25. import org.jodconverter.office.LocalOfficeUtils;
  26. import org.jodconverter.office.OfficeException;
  27. import javax.xml.parsers.DocumentBuilderFactory;
  28. import javax.xml.parsers.ParserConfigurationException;
  29. import javax.xml.transform.OutputKeys;
  30. import javax.xml.transform.Transformer;
  31. import javax.xml.transform.TransformerException;
  32. import javax.xml.transform.TransformerFactory;
  33. import javax.xml.transform.dom.DOMSource;
  34. import javax.xml.transform.stream.StreamResult;
  35. import java.io.*;
  36. import java.text.SimpleDateFormat;
  37. import java.util.Base64;
  38. /**
  39. * 人员卡片基础类
  40. *
  41. * @author chenchgf
  42. */
  43. public abstract class CardrptBaseAction extends HRCommonAction {
  44. protected Object getObject(String operateType, ParamUtils param, LoginContext context) throws BusinessException {
  45. String pk_psnjob = param.getString("pk_psnjob", null);
  46. if (StringUtils.isBlank(pk_psnjob)) {
  47. throw new BusinessException(ResHelper.getString("6007psn", "16007psn0084")/* @res "未选择人员!" */);
  48. }
  49. String pk_rpt_def = param.getString("pk_rpt_def", null);
  50. if (StringUtils.isBlank(pk_rpt_def)) {
  51. throw new BusinessException(ResHelper.getString("6007psn", "16007psn0085")/* @res "未选择人员卡片!" */);
  52. }
  53. RepDefVO rptVO = (RepDefVO) ServiceLocator.find(IPersistenceRetrieve.class).retrieveByPk(null, RepDefVO.class, pk_rpt_def);
  54. String filePathName = null;
  55. String tempFile = null;
  56. String temprtfFile = null;
  57. try {
  58. String previewFileName = "preview_word_" + System.currentTimeMillis();
  59. tempFile = RtfHelper.strDocTempletDirPath + previewFileName + ".doc"; // ui包可用???
  60. temprtfFile = tempFile.replace(".doc", ".rtf");
  61. if (System.getProperty("os.name").startsWith("Windows")) {
  62. byte[] ba = WordUtil.changeTemplete(((RtfTemplateVO) rptVO.getObj_rpt_def()).getRtfDocument(), tempFile);
  63. ((RtfTemplateVO) rptVO.getObj_rpt_def()).setRtfDocument(ba);
  64. }
  65. IGenerateRTFDocument grd = ServiceLocator.find(IGenerateRTFDocument.class);
  66. byte bytes[] = grd.createRtfFile(context, pk_psnjob, "psndoc", rptVO, null);
  67. String rptName = (String) rptVO.getAttributeValue(RepDefVO.RPT_NAME + MultiLangHelper.getLangIndex());
  68. String currentTime = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss").format(System.currentTimeMillis());
  69. String filename = rptName + "_" + currentTime;
  70. filePathName = RtfHelper.strDocTempletDirPath + filename;
  71. FileUtils.writeByteArrayToFile(new File(filePathName + ".rtf"), bytes);
  72. if ("preview".equals(operateType)) {
  73. // 使用JodConverter直接将rtf转为html后内容有问题,所以先用JodConverter将rtf转为doc,再用poi将doc转为html
  74. convertFileFormatWithJod(filePathName + ".rtf", filePathName + ".doc");
  75. convertDocToHtmlWithPoi(filePathName + ".doc", filePathName + ".html");
  76. return FileUtils.readFileToString(new File(filePathName + ".html"), "UTF-8");
  77. } else if ("export".equals(operateType)) {
  78. ByteArrayInputStream bis = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(filePathName + ".rtf")));
  79. WebFile webfile = new WebFile(filename + ".rtf", bis);
  80. return webfile;
  81. } else {
  82. return null;
  83. }
  84. } catch (Exception e) {
  85. Logger.error(e.getMessage(), e);
  86. throw new BusinessException(ResHelper.getString("6007psn", "06007psn0015")/* @res "卡片报表导出发生错误!" */ + " " + e.getMessage());
  87. } finally {
  88. WordUtil.deleteTempFile(tempFile);
  89. WordUtil.deleteTempFile(temprtfFile);
  90. WordUtil.deleteTempFile(filePathName + ".rtf");
  91. WordUtil.deleteTempFile(filePathName + ".html");
  92. deleteAllTempFile(filePathName + ".files");
  93. }
  94. }
  95. /**
  96. * 使用JodConverter转换文件格式
  97. *
  98. * @param inputFilename
  99. * @param outputFilename
  100. * @throws BusinessException
  101. */
  102. private void convertFileFormatWithJod(String inputFilename, String outputFilename) throws BusinessException {
  103. Logger.error("JodConverter: convert begin...");
  104. LocalOfficeManager officeManager = null;
  105. try {
  106. if (System.getProperty("os.name").startsWith("Windows")) {
  107. Logger.error("JodConverter for Windows: os.name : " + System.getProperty("os.name"));
  108. officeManager = LocalOfficeManager.builder().install().build();
  109. } else if (System.getProperty("os.name").startsWith("Linux")) {
  110. Logger.error("JodConverter for Linux: os.name : " + System.getProperty("os.name"));
  111. officeManager = LocalOfficeManager.builder().install().build();
  112. } else {
  113. Logger.error("JodConverter for Other System: os.name : " + System.getProperty("os.name"));
  114. officeManager = LocalOfficeManager.builder().install().build();
  115. // throw new BusinessException("JodConverter: Unsupported System!");
  116. }
  117. Logger.error("JodConverter using office home: " + LocalOfficeUtils.getDefaultOfficeHome());
  118. } catch (Exception e) {
  119. throw new BusinessException(ResHelper.getString("6007psn", "16007psn0088")/* @res "未安装" */ + " OpenOffice " +
  120. ResHelper.getString("6007psn", "16007psn0089")/* @res "或" */ + " LibreOffice!\n", e);
  121. }
  122. try {
  123. officeManager.start();
  124. } catch (OfficeException e) {
  125. Logger.error("Office manager failed to start!", e);
  126. throw new BusinessException("Office manager failed to start! Please check if you have any disk space left!", e);
  127. }
  128. try {
  129. JodConverter.convert(new File(inputFilename)).to(new File(outputFilename)).execute();
  130. } catch (OfficeException e) {
  131. Logger.error("Office manager failed to convert!", e);
  132. // throw new BusinessException("JodConverter converting gets wrong!", e);
  133. }
  134. try {
  135. officeManager.stop();
  136. } catch (OfficeException e) {
  137. Logger.error("Office manager failed to stop!", e);
  138. throw new BusinessException("Office manager failed to stop!", e);
  139. }
  140. Logger.error("JodConverter: convert rtf to doc finished...");
  141. }
  142. /**
  143. * poi方式 - convert doc to html
  144. *
  145. * @param inputFilename
  146. * @param outputFilename
  147. * @throws TransformerException
  148. * @throws IOException
  149. * @throws ParserConfigurationException
  150. */
  151. public static void convertDocToHtmlWithPoi(String inputFilename, String outputFilename)
  152. throws TransformerException, IOException, ParserConfigurationException {
  153. Base64.Encoder encoder = Base64.getEncoder();
  154. HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(inputFilename));
  155. WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
  156. DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
  157. wordToHtmlConverter.setPicturesManager(new PicturesManager() {
  158. public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches,
  159. float heightInches) {
  160. String encodedText = new String(encoder.encode(content));
  161. String imgSrc = "data:" + pictureType.getMime() + ";" + "base64," + encodedText;
  162. return imgSrc;
  163. }
  164. });
  165. wordToHtmlConverter.processDocument(wordDocument);
  166. org.w3c.dom.Document htmlDocument = wordToHtmlConverter.getDocument();
  167. DOMSource domSource = new DOMSource(htmlDocument);
  168. ByteArrayOutputStream out = new ByteArrayOutputStream();
  169. StreamResult streamResult = new StreamResult(out);
  170. TransformerFactory tf = TransformerFactory.newInstance();
  171. Transformer serializer = tf.newTransformer();
  172. serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
  173. serializer.setOutputProperty(OutputKeys.INDENT, "yes");
  174. serializer.setOutputProperty(OutputKeys.METHOD, "html");
  175. serializer.transform(domSource, streamResult);
  176. out.close();
  177. FileUtils.writeByteArrayToFile(new File(outputFilename), out.toByteArray());
  178. Logger.error("PoiConverter: convert doc to html finished...");
  179. }
  180. /**
  181. * 删除临时文件夹
  182. *
  183. * @param strBaseDir
  184. */
  185. private void deleteAllTempFile(String strBaseDir) {
  186. File f = new File(strBaseDir);
  187. if (!f.exists()) {
  188. return;
  189. }
  190. File fa[] = f.listFiles();
  191. try {
  192. for (int i = 0; i < fa.length; i++) {
  193. fa[i].delete();
  194. }
  195. f.delete();
  196. } catch (Exception e) {
  197. /** 忽略,有可能正在被使用 */
  198. }
  199. }
  200. }