package bs.util.tool.commongui.plugins.more; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.File; import java.io.IOException; import java.net.ConnectException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JFormattedTextField; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.text.NumberFormatter; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter; import bs.util.io.PropertiesUtils; import bs.util.tool.commongui.GuiJPanel; import bs.util.tool.commongui.GuiUtils; import bs.util.tool.commongui.utils.CopyFileFromCommonsIo; import bs.util.tool.commongui.utils.FileUtils; import bs.util.tool.commongui.utils.SearchFileNameParams; /** * OpenOffice文档转换. */ public class JODConverterVisual extends GuiJPanel { private static final long serialVersionUID = 1L; /** * 转换文件/文件夹路径表单. */ private JTextField convertPathTextField = new JTextField(); /** * 转换文件/文件夹路径选择. */ private JFileChooser convertPath_Chooser = new JFileChooser(); /** * 转换按钮. */ private JButton convertButton; /** * 转换目标文件夹路径表单. */ private JTextField convertedPathTextField = new JTextField(); /** * 转换目标文件夹路径选择. */ private JFileChooser convertedPath_Chooser = new JFileChooser(); /** * 转换文件格式. */ private String fileFromType = ""; /** * 转换文件格式. */ private String fileToType = ""; /** * 高级条件面板. */ private JPanel advanceConditionPanel; /** * 设置IP表单. */ private JTextField ipTextField = new JTextField("127.0.0.1", 8); /** * 设置端口表单. */ private JFormattedTextField portTextField = createNumberTextField(new NumberFormatter(), 5, GuiUtils.font14_cn, "8100"); /** * 文件名包含字符表单. */ private JTextField fileNameContainsTextField; /** * 文件名不包含字符表单. */ private JTextField fileNameNotContainsTextField; /** * 文件名是否支持正则. */ private boolean fileNameSupportRegex; /** * 转换结果文件域. */ private JTextArea resultTextArea = createJTextArea(GuiUtils.font14_un); /** * 可进行转换的文件格式. */ private String fromComboboxItems = ""; /** * 转换文件格式Map. */ private Map<String, String> formatsFromMap = new HashMap<String, String>(); /** * 目标文件格式Map. */ private Map<String, String> formatsToMap = new HashMap<String, String>(); /** * 目标文件名是否保留原始文件类型. */ private boolean keepOriginalFileType = false; /** * 把需要转换的文件当作txt处理表单. */ private JCheckBox filesDealAsTxtBox; { // 转换配置 String converterPropsFile = "conf/JODConverterVisual/converter.properties"; try { Properties converterConfProperties = PropertiesUtils.getProperties(GuiUtils .getActualPath(converterPropsFile)); fromComboboxItems = converterConfProperties.getProperty("fromComboboxItems").trim().toLowerCase(); for (Object propObj : converterConfProperties.keySet()) { String propStr = propObj.toString(); if (propStr.endsWith(".formats.from")) { formatsFromMap.put(propStr, "," + converterConfProperties.getProperty(propStr).trim().toLowerCase() + ","); } else if (propStr.endsWith(".formats.to")) { formatsToMap.put(propStr, "," + converterConfProperties.getProperty(propStr).trim().toLowerCase() + ","); } } } catch (IOException e) { logLoadPropertiesException(converterPropsFile, e); } } public JODConverterVisual() { // 主面板:边界布局,分North、Center两部分,North用于放置输入及条件控件,Center是放置转换结果输出 setLayout(new BorderLayout()); // 输入及条件Panel JPanel inputPanel = new JPanel(new GridLayout(2, 1)); add(inputPanel, BorderLayout.NORTH); // 转换from格式->to格式 final DefaultComboBoxModel fileToBoxModel = new DefaultComboBoxModel(); resetFileToBoxModel(fileToBoxModel, fromComboboxItems.split(",")[0]); final JComboBox fileFromBox = createJComboBox(fromComboboxItems.split(","), GuiUtils.font13_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { fileFromType = ((JComboBox) event.getSource()).getSelectedItem().toString(); resetFileToBoxModel(fileToBoxModel, fileFromType); } }); fileFromType = fileFromBox.getSelectedItem().toString(); final JComboBox fileToBox = new JComboBox(fileToBoxModel); fileToBox.setFont(GuiUtils.font12_cn); fileToBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { if (((JComboBox) event.getSource()).getSelectedItem() != null) { fileToType = ((JComboBox) event.getSource()).getSelectedItem().toString(); } } }); fileToType = fileToBox.getSelectedItem().toString(); // 转换文件/文件夹表单、转换按钮Panel JPanel fileChooAndDetectPanel = new JPanel(new BorderLayout()); // 转换文件/文件夹表单 addJLabel(fileChooAndDetectPanel, " 文件/文件夹: ", GuiUtils.font14_cn, BorderLayout.WEST); JPanel fileChooPanel = new JPanel(new BorderLayout()); fileChooPanel.add(new JPanel(), BorderLayout.NORTH); convertPathTextField.setEditable(false); convertPathTextField.addMouseListener(new MouseListener() { public void mouseReleased(MouseEvent e) { chooseConvertFile(fileFromBox); } public void mousePressed(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } }); addJTextField(fileChooPanel, convertPathTextField, GuiUtils.font14_un, BorderLayout.CENTER); fileChooPanel.add(new JPanel(), BorderLayout.SOUTH); fileChooAndDetectPanel.add(fileChooPanel, BorderLayout.CENTER); JPanel buttonFlowPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); addJButton(buttonFlowPanel, "浏览", "", GuiUtils.font12_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { chooseConvertFile(fileFromBox); } }); // 转换按钮 convertButton = createJButton("转换", "", GuiUtils.font14b_cn); convertButton.addMouseListener(new MouseListener() { public void mouseReleased(MouseEvent event) { File convertFile = new File(convertPathTextField.getText().trim()); Map<String, Object> paramsMap = new HashMap<String, Object>(); paramsMap.put("fileNameContainsText", fileNameContainsTextField.getText().trim()); paramsMap.put("fileNameNotContainsText", fileNameNotContainsTextField.getText().trim()); paramsMap.put("fileNameSupportRegex", fileNameSupportRegex); convertButton.setEnabled(false); try { List<File> files = new ArrayList<File>(); if (!convertFile.isDirectory()) { files.add(convertFile); } else { FileUtils.loopDirectory(convertFile, files, new SearchFileNameParams(paramsMap)); } boolean filesDealAsTxt = filesDealAsTxtBox.isSelected(); appendConvertResult(resultTextArea, files, filesDealAsTxt); } catch (IOException e) { showExceptionMessage(e); } convertButton.setEnabled(true); } public void mousePressed(MouseEvent e) { File convertFile = new File(convertPathTextField.getText().trim()); if (!convertFile.exists()) { showMessage("转换文件/文件夹不存在!", "警告", JOptionPane.WARNING_MESSAGE); return; } String convertedPath = convertedPathTextField.getText().trim(); if (convertedPath.length() == 0) { showMessage("转换目标文件夹未选择!", "警告", JOptionPane.WARNING_MESSAGE); return; } resultTextArea.setText("开始转换,请稍候......\n\n"); } public void mouseExited(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } }); // 转换文件格式 -> 目标文件格式 addJLabel(buttonFlowPanel, " 格式:", GuiUtils.font14_cn); buttonFlowPanel.add(fileFromBox); addJLabel(buttonFlowPanel, "->", GuiUtils.font14_cn); buttonFlowPanel.add(fileToBox); buttonFlowPanel.add(convertButton); // 转换路径选择控件 convertPath_Chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); // 可选择文件/文件夹 fileChooAndDetectPanel.add(buttonFlowPanel, BorderLayout.EAST); inputPanel.add(fileChooAndDetectPanel); // 转换目标文件夹表单面板 JPanel convertPanel = new JPanel(new BorderLayout()); // 转换目标文件夹表单 addJLabel(convertPanel, " 目标文件夹: ", GuiUtils.font14_cn, BorderLayout.WEST); JPanel convertFileChooPanel = new JPanel(new BorderLayout()); convertFileChooPanel.add(new JPanel(), BorderLayout.NORTH); convertedPathTextField.setEditable(false); convertedPathTextField.addMouseListener(new MouseListener() { public void mouseReleased(MouseEvent e) { chooseConvertedFolder(); } public void mousePressed(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } }); addJTextField(convertFileChooPanel, convertedPathTextField, GuiUtils.font14_un, BorderLayout.CENTER); convertFileChooPanel.add(new JPanel(), BorderLayout.SOUTH); convertPanel.add(convertFileChooPanel, BorderLayout.CENTER); JPanel comboxButtonFlowPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); addJButton(comboxButtonFlowPanel, "浏览", "", GuiUtils.font12_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { chooseConvertedFolder(); } }); // 目标路径选择控件 convertedPath_Chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // 只可选择文件夹 // 目标文件名是否保留原始文件类型. addJCheckBox(comboxButtonFlowPanel, "文件名中保留原类型", false, GuiUtils.font14_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { keepOriginalFileType = ((JCheckBox) event.getSource()).isSelected(); } }); // 是否作为文本处理 filesDealAsTxtBox = new JCheckBox("作为文本处理(全部) "); filesDealAsTxtBox.setFont(GuiUtils.font14_cn); filesDealAsTxtBox.setSelected(false); filesDealAsTxtBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent event) { JCheckBox checkBox = (JCheckBox) event.getSource(); if (checkBox.isSelected()) { fileFromBox.setSelectedItem("txt"); fileFromBox.setEnabled(false); } else { fileFromBox.setEnabled(true); File selectFile = convertPath_Chooser.getSelectedFile(); if (!selectFile.isDirectory()) { String fileType = FileUtils.getFileType(selectFile.getName()); if (("," + fromComboboxItems + ",").contains("," + fileType + ",")) { fileFromBox.setSelectedItem(fileType); fileFromBox.setEnabled(false); } } } } }); filesDealAsTxtBox.setEnabled(false); comboxButtonFlowPanel.add(filesDealAsTxtBox); // 展开/收缩高级(条件)按钮 addJButton(comboxButtonFlowPanel, "高级", "", GuiUtils.font14_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { advanceConditionPanel.setVisible(!advanceConditionPanel.isVisible()); getContextPanel().revalidate(); } }); convertPanel.add(comboxButtonFlowPanel, BorderLayout.EAST); inputPanel.add(convertPanel); // 高级(条件)及转换日志输出面板,使用边界布局,North为高级(条件),Center为转换日志输出 JPanel advanceAndLogPanel = new JPanel(new BorderLayout()); // 高级(条件) advanceConditionPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); advanceConditionPanel.setVisible(false); advanceAndLogPanel.add(advanceConditionPanel, BorderLayout.NORTH); // 设置IP addJLabel(advanceConditionPanel, " IP:", GuiUtils.font14_cn); advanceConditionPanel.add(ipTextField); // 设置端口 addJLabel(advanceConditionPanel, "端口:", GuiUtils.font14_cn); advanceConditionPanel.add(portTextField); // 文件名包含(不包含)字符 addJLabel(advanceConditionPanel, " 文件名包含字符:", GuiUtils.font14_cn); fileNameContainsTextField = new JTextField(14); addJTextField(advanceConditionPanel, fileNameContainsTextField, GuiUtils.font14_un); addJLabel(advanceConditionPanel, " 文件名不包含字符:", GuiUtils.font14_cn); fileNameNotContainsTextField = new JTextField(14); addJTextField(advanceConditionPanel, fileNameNotContainsTextField, GuiUtils.font14_un); // 是否支持正则 addJCheckBox(advanceConditionPanel, "支持正则", false, GuiUtils.font14_cn, new ActionListener() { public void actionPerformed(ActionEvent event) { fileNameSupportRegex = ((JCheckBox) event.getSource()).isSelected(); } }); // 转换结果输出 JPanel convertLogPanel = new JPanel(new BorderLayout()); convertLogPanel.add(new JScrollPane(resultTextArea)); advanceAndLogPanel.add(convertLogPanel, BorderLayout.CENTER); add(advanceAndLogPanel, BorderLayout.CENTER); } /** * 根据文件格式获取可转换的文件格式. * * @param type 原格式 * @return <code>String</code> 获取可转换的文件格式 */ private String getConvertAbleTypes(String type) { if (type == null || type.trim().length() == 0) { return ""; } for (String formatFrom : formatsFromMap.keySet()) { if (formatsFromMap.get(formatFrom).contains("," + type + ",")) { return formatsToMap.get(formatFrom.subSequence(0, formatFrom.length() - 4) + "to"); } } return ""; } /** * 重设FileToBoxModel,实现联动. * * @param fileToBoxModel JCombobox Model * @param fromType 转换文件格式 */ private void resetFileToBoxModel(DefaultComboBoxModel fileToBoxModel, String fromType) { String ableTypes = getConvertAbleTypes(fromType); fileToBoxModel.removeAllElements(); for (String type : ableTypes.split(",")) { type = type.trim(); if (type.length() != 0 && !type.equals(fromType)) { fileToBoxModel.addElement(type); } } } /** * append转换文件结果. */ private void appendConvertResult(JTextArea resultTextArea, List<File> files, boolean filesDealAsTxt) throws IOException { OpenOfficeConnection con = new SocketOpenOfficeConnection(ipTextField.getText().trim(), Integer.parseInt(portTextField.getText().trim().replace(",", ""))); try { con.connect(); } catch (ConnectException e) { resultTextArea .append("转换出错,请检查OpenOffice服务是否启动或者点开高级按钮查看IP、端口设置是否正确\n" + "本机OpenOffice服务启动方法:CMD下,OpenOffice_HOME/program>soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard\n\n"); return; } DocumentConverter converter = new OpenOfficeDocumentConverter(con); int convertNum = 0; int convertedNum = 0; String convertPath = convertPathTextField.getText().trim(); File convertFile = new File(convertPath); String convertedPath = convertedPathTextField.getText().trim(); // 转换文件 if (!convertFile.isDirectory()) { String convertFileName = convertFile.getName(); String fileType = FileUtils.getFileType(convertFileName); convertFileName = (keepOriginalFileType ? convertFileName + "." : convertFileName.substring(0, convertFileName.length() - FileUtils.getFileType(convertFileName).length()) + (fileType.length() == 0 ? "." : "")); File convertedFile = new File(convertedPath + File.separator + convertFileName + fileToType); convertNum++; String success = convertFile(convertFile, convertedFile, converter, resultTextArea, filesDealAsTxt); if (success.equals("Success")) { convertedNum++; } resultTextArea.append(convertFile.getAbsolutePath() + " Convert: " + success + "\n"); } // 转换文件夹下的文件 else { for (File file : files) { String fileType = FileUtils.getFileType(file.getName()); if (fileType.equals(fileFromType) || filesDealAsTxt) { convertNum++; String fileName = file.getName(); fileName = (keepOriginalFileType ? fileName + "." : fileName.substring(0, fileName.length() - fileType.length()) + (fileType.length() == 0 ? "." : "")); String success = convertFile(file, new File(convertedPath + File.separator + fileName + fileToType), converter, resultTextArea, filesDealAsTxt); if (success.equals("Success")) { convertedNum++; } resultTextArea.append(file.getAbsolutePath() + " Convert: " + success + "\n"); } } } con.disconnect(); resultTextArea.append("\nConvert files: " + convertNum + ", Success: " + convertedNum + ", Fail: " + (convertNum - convertedNum) + "."); } /** * 转换文件. */ private String convertFile(File fromFile, File toFile, DocumentConverter converter, JTextArea resultTextArea, boolean filesDealAsTxt) { try { if (filesDealAsTxt) { File copyToFile = new File(toFile.getAbsolutePath() + ".convert-as-txt-tmp.txt"); CopyFileFromCommonsIo.copyFile(fromFile, copyToFile); converter.convert(copyToFile, toFile); copyToFile.delete(); } else { converter.convert(fromFile, toFile); } return "Success"; } catch (Exception e) { GuiUtils.log(e); return "Fail[Exception: " + e.getMessage() + "]"; } } /** * 选择转换文件/文件夹. */ private void chooseConvertFile(JComboBox fileFromBox) { if (convertPath_Chooser.showDialog(getContextPanel(), "确定") == JFileChooser.CANCEL_OPTION) { return; } File selectFile = convertPath_Chooser.getSelectedFile(); if (selectFile != null) { boolean flag = true; if (!selectFile.exists()) { flag = false; showMessage("所选文件/文件夹不存在!", "警告", JOptionPane.WARNING_MESSAGE); } else if (selectFile.isDirectory()) { fileFromBox.setEnabled(true); filesDealAsTxtBox.setEnabled(true); } else if (!selectFile.isDirectory()) { String fileType = FileUtils.getFileType(selectFile.getName()); if (("," + fromComboboxItems + ",").contains("," + fileType + ",")) { fileFromBox.setSelectedItem(fileType); fileFromBox.setEnabled(false); filesDealAsTxtBox.setSelected(false); filesDealAsTxtBox.setEnabled(true); } else { int dealAsTxt = showConfirmMessage("不支持转换此种格式的文件,是否作为文本处理!", "确认", JOptionPane.OK_CANCEL_OPTION); if (dealAsTxt == JOptionPane.OK_OPTION) { fileFromBox.setEnabled(false); filesDealAsTxtBox.setSelected(true); filesDealAsTxtBox.setEnabled(false); } else { flag = false; } } } if (flag) { convertPathTextField.setText(selectFile.getAbsolutePath()); } } } /** * 选择目标文件夹. */ private void chooseConvertedFolder() { if (convertedPath_Chooser.showDialog(getContextPanel(), "确定") == JFileChooser.CANCEL_OPTION) { return; } File selectFile = convertedPath_Chooser.getSelectedFile(); if (selectFile != null) { if (!selectFile.exists()) { showMessage("转换目标文件夹不存在将自动创建!", "提示", JOptionPane.INFORMATION_MESSAGE); try { org.apache.commons.io.FileUtils.forceMkdir(selectFile); } catch (IOException e) { showExceptionMessage(e, "创建转换目标文件夹失败!"); return; } } convertedPathTextField.setText(selectFile.getAbsolutePath()); } } }