123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- package nccloud.web.hrhi.cardrep.action;
- import nc.bs.logging.Logger;
- import nc.hr.utils.MultiLangHelper;
- import nc.hr.utils.ResHelper;
- import nc.itf.hr.frame.IPersistenceRetrieve;
- import nc.itf.hr.tools.rtf.IGenerateRTFDocument;
- import nc.ui.hr.tools.rtf.jacob.RtfHelper;
- import nc.ui.hr.tools.rtf.jacob.WordUtil;
- import nc.vo.hi.repdef.RepDefVO;
- import nc.vo.hr.tools.rtf.RtfTemplateVO;
- import nc.vo.pub.BusinessException;
- import nc.vo.uif2.LoginContext;
- import nccloud.commons.lang.StringUtils;
- import nccloud.framework.core.io.WebFile;
- import nccloud.framework.service.ServiceLocator;
- import nccloud.web.hr.pub.HRCommonAction;
- import nccloud.web.uapbd.commons.web.ParamUtils;
- import org.apache.commons.io.FileUtils;
- import org.apache.poi.hwpf.HWPFDocument;
- import org.apache.poi.hwpf.converter.PicturesManager;
- import org.apache.poi.hwpf.converter.WordToHtmlConverter;
- import org.apache.poi.hwpf.usermodel.PictureType;
- import org.jodconverter.JodConverter;
- import org.jodconverter.office.LocalOfficeManager;
- import org.jodconverter.office.LocalOfficeUtils;
- import org.jodconverter.office.OfficeException;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.transform.OutputKeys;
- import javax.xml.transform.Transformer;
- import javax.xml.transform.TransformerException;
- import javax.xml.transform.TransformerFactory;
- import javax.xml.transform.dom.DOMSource;
- import javax.xml.transform.stream.StreamResult;
- import java.io.*;
- import java.text.SimpleDateFormat;
- import java.util.Base64;
- /**
- * 人员卡片基础类
- *
- * @author chenchgf
- */
- public abstract class CardrptBaseAction extends HRCommonAction {
- protected Object getObject(String operateType, ParamUtils param, LoginContext context) throws BusinessException {
- String pk_psnjob = param.getString("pk_psnjob", null);
- if (StringUtils.isBlank(pk_psnjob)) {
- throw new BusinessException(ResHelper.getString("6007psn", "16007psn0084")/* @res "未选择人员!" */);
- }
- String pk_rpt_def = param.getString("pk_rpt_def", null);
- if (StringUtils.isBlank(pk_rpt_def)) {
- throw new BusinessException(ResHelper.getString("6007psn", "16007psn0085")/* @res "未选择人员卡片!" */);
- }
- RepDefVO rptVO = (RepDefVO) ServiceLocator.find(IPersistenceRetrieve.class).retrieveByPk(null, RepDefVO.class, pk_rpt_def);
- String filePathName = null;
- String tempFile = null;
- String temprtfFile = null;
- try {
- String previewFileName = "preview_word_" + System.currentTimeMillis();
- tempFile = RtfHelper.strDocTempletDirPath + previewFileName + ".doc"; // ui包可用???
- temprtfFile = tempFile.replace(".doc", ".rtf");
- if (System.getProperty("os.name").startsWith("Windows")) {
- byte[] ba = WordUtil.changeTemplete(((RtfTemplateVO) rptVO.getObj_rpt_def()).getRtfDocument(), tempFile);
- ((RtfTemplateVO) rptVO.getObj_rpt_def()).setRtfDocument(ba);
- }
- IGenerateRTFDocument grd = ServiceLocator.find(IGenerateRTFDocument.class);
- byte bytes[] = grd.createRtfFile(context, pk_psnjob, "psndoc", rptVO, null);
- String rptName = (String) rptVO.getAttributeValue(RepDefVO.RPT_NAME + MultiLangHelper.getLangIndex());
- String currentTime = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss").format(System.currentTimeMillis());
- String filename = rptName + "_" + currentTime;
- filePathName = RtfHelper.strDocTempletDirPath + filename;
- FileUtils.writeByteArrayToFile(new File(filePathName + ".rtf"), bytes);
- if ("preview".equals(operateType)) {
- // 使用JodConverter直接将rtf转为html后内容有问题,所以先用JodConverter将rtf转为doc,再用poi将doc转为html
- convertFileFormatWithJod(filePathName + ".rtf", filePathName + ".doc");
- convertDocToHtmlWithPoi(filePathName + ".doc", filePathName + ".html");
- return FileUtils.readFileToString(new File(filePathName + ".html"), "UTF-8");
- } else if ("export".equals(operateType)) {
- ByteArrayInputStream bis = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(filePathName + ".rtf")));
- WebFile webfile = new WebFile(filename + ".rtf", bis);
- return webfile;
- } else {
- return null;
- }
- } catch (Exception e) {
- Logger.error(e.getMessage(), e);
- throw new BusinessException(ResHelper.getString("6007psn", "06007psn0015")/* @res "卡片报表导出发生错误!" */ + " " + e.getMessage());
- } finally {
- WordUtil.deleteTempFile(tempFile);
- WordUtil.deleteTempFile(temprtfFile);
- WordUtil.deleteTempFile(filePathName + ".rtf");
- WordUtil.deleteTempFile(filePathName + ".html");
- deleteAllTempFile(filePathName + ".files");
- }
- }
- /**
- * 使用JodConverter转换文件格式
- *
- * @param inputFilename
- * @param outputFilename
- * @throws BusinessException
- */
- private void convertFileFormatWithJod(String inputFilename, String outputFilename) throws BusinessException {
- Logger.error("JodConverter: convert begin...");
- LocalOfficeManager officeManager = null;
- try {
- if (System.getProperty("os.name").startsWith("Windows")) {
- Logger.error("JodConverter for Windows: os.name : " + System.getProperty("os.name"));
- officeManager = LocalOfficeManager.builder().install().build();
- } else if (System.getProperty("os.name").startsWith("Linux")) {
- Logger.error("JodConverter for Linux: os.name : " + System.getProperty("os.name"));
- officeManager = LocalOfficeManager.builder().install().build();
- } else {
- Logger.error("JodConverter for Other System: os.name : " + System.getProperty("os.name"));
- officeManager = LocalOfficeManager.builder().install().build();
- // throw new BusinessException("JodConverter: Unsupported System!");
- }
- Logger.error("JodConverter using office home: " + LocalOfficeUtils.getDefaultOfficeHome());
- } catch (Exception e) {
- throw new BusinessException(ResHelper.getString("6007psn", "16007psn0088")/* @res "未安装" */ + " OpenOffice " +
- ResHelper.getString("6007psn", "16007psn0089")/* @res "或" */ + " LibreOffice!\n", e);
- }
- try {
- officeManager.start();
- } catch (OfficeException e) {
- Logger.error("Office manager failed to start!", e);
- throw new BusinessException("Office manager failed to start! Please check if you have any disk space left!", e);
- }
- try {
- JodConverter.convert(new File(inputFilename)).to(new File(outputFilename)).execute();
- } catch (OfficeException e) {
- Logger.error("Office manager failed to convert!", e);
- // throw new BusinessException("JodConverter converting gets wrong!", e);
- }
- try {
- officeManager.stop();
- } catch (OfficeException e) {
- Logger.error("Office manager failed to stop!", e);
- throw new BusinessException("Office manager failed to stop!", e);
- }
- Logger.error("JodConverter: convert rtf to doc finished...");
- }
- /**
- * poi方式 - convert doc to html
- *
- * @param inputFilename
- * @param outputFilename
- * @throws TransformerException
- * @throws IOException
- * @throws ParserConfigurationException
- */
- public static void convertDocToHtmlWithPoi(String inputFilename, String outputFilename)
- throws TransformerException, IOException, ParserConfigurationException {
- Base64.Encoder encoder = Base64.getEncoder();
- HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(inputFilename));
- WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
- DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
- wordToHtmlConverter.setPicturesManager(new PicturesManager() {
- public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches,
- float heightInches) {
- String encodedText = new String(encoder.encode(content));
- String imgSrc = "data:" + pictureType.getMime() + ";" + "base64," + encodedText;
- return imgSrc;
- }
- });
- wordToHtmlConverter.processDocument(wordDocument);
- org.w3c.dom.Document htmlDocument = wordToHtmlConverter.getDocument();
- DOMSource domSource = new DOMSource(htmlDocument);
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- StreamResult streamResult = new StreamResult(out);
- TransformerFactory tf = TransformerFactory.newInstance();
- Transformer serializer = tf.newTransformer();
- serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
- serializer.setOutputProperty(OutputKeys.INDENT, "yes");
- serializer.setOutputProperty(OutputKeys.METHOD, "html");
- serializer.transform(domSource, streamResult);
- out.close();
- FileUtils.writeByteArrayToFile(new File(outputFilename), out.toByteArray());
- Logger.error("PoiConverter: convert doc to html finished...");
- }
- /**
- * 删除临时文件夹
- *
- * @param strBaseDir
- */
- private void deleteAllTempFile(String strBaseDir) {
- File f = new File(strBaseDir);
- if (!f.exists()) {
- return;
- }
- File fa[] = f.listFiles();
- try {
- for (int i = 0; i < fa.length; i++) {
- fa[i].delete();
- }
- f.delete();
- } catch (Exception e) {
- /** 忽略,有可能正在被使用 */
- }
- }
- }
|