文档相关工具
package com.lc.ibps.components.upload.util; import java.awt.FontMetrics; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.swing.JLabel; import org.apache.pdfbox.pdfparser.PDFParser; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.util.PDFTextStripper; import com.aspose.words.Document; import com.aspose.words.License; import com.aspose.words.SaveFormat; import com.itextpdf.text.Element; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfCopy; import com.itextpdf.text.pdf.PdfGState; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import com.lc.ibps.base.core.util.AppUtil; import freemarker.template.Configuration; import freemarker.template.Template; import net.sf.json.JSONArray; import net.sf.json.JSONObject; /** * * @项目名称: * @类名称: DocumentUtils * @类描述: 文档工具类 * @修改备注: * @version: 1.0 */ public class DocumentUtils { private static int interval = -5; /** * 导出word * * @方法名:exportWord * @参数 @param templateName .xml格式word模板 * @参数 @param dataModel 数据 * @参数 @return * @返回类型 String */ public static String exportWord(String templateName, Object dataModel) { FileOutputStream fos = null; OutputStreamWriter writer = null; String outFile = null; try { // 导出路径 String outPath = AppUtil.getProperty("file.upload"); // 导出文件名 String outName = templateName + "_output.doc"; // 导出doc全路径 outFile = outPath + File.separator + outName; // 临时目录 String exceltemplates = outPath + File.separator + "exceltemplates"; fos = new FileOutputStream(outFile); writer = new OutputStreamWriter(fos, "UTF-8"); Configuration config = new Configuration(Configuration.VERSION_2_3_23); config.setDefaultEncoding("UTF-8"); config.setDirectoryForTemplateLoading(new File(exceltemplates)); // 模板路径 Template template = config.getTemplate(templateName + ".xml", "UTF-8"); template.process(dataModel, writer); } catch (Exception e) { e.printStackTrace(); } finally { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } return outFile; } /** * 模板、数据、生成word * * @方法名:exportWord * @参数 @param templateName 模板名称 * @参数 @param dataModel 数据 * @参数 @param target 目标doc路径 * @返回类型 void */ public static void exportWord(String templateName, Object dataModel, String target) { FileOutputStream fos = null; OutputStreamWriter writer = null; // 临时目录 String exceltemplates = AppUtil.getProperty("file.upload") + File.separator + "exceltemplates"; try { fos = new FileOutputStream(target); writer = new OutputStreamWriter(fos, "UTF-8"); Configuration config = new Configuration(Configuration.VERSION_2_3_23); config.setDefaultEncoding("UTF-8"); config.setDirectoryForTemplateLoading(new File(exceltemplates)); // 模板路径 Template template = config.getTemplate(templateName + ".xml", "UTF-8"); template.process(dataModel, writer); } catch (Exception e) { e.printStackTrace(); } finally { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * Word转PDF * * @方法名:convertPdf * @参数 @param templateName * @参数 @param wordPath * @参数 @return * @返回类型 String */ public static String convertPdf(String templateName, String wordPath) { String outFile = null; FileOutputStream fos = null; try { // 导出文件名 String outName = templateName + "_output.pdf"; // 导出路径 String outPath = AppUtil.getProperty("file.upload"); // 导出doc全路径 outFile = outPath + File.separator + outName; fos = new FileOutputStream(outFile); // 注册 License aposeLic = new License(); aposeLic.setLicense( new FileInputStream(DocumentUtils.class.getClassLoader().getResource("license.xml").getPath())); // 转换 Document doc = new Document(new FileInputStream(wordPath)); doc.save(fos, SaveFormat.PDF); } catch (Exception e) { e.printStackTrace(); } finally { try { fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } return outFile; } /** * word转成pdf * * @方法名:wordToPdf * @参数 @param source doc路径 * @参数 @param target 目标pdf路径 * @返回类型 void */ public static void wordToPdf(String source, String target) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(target); // 注册 License aposeLic = new License(); String path = AppUtil.getProperty("file.upload") + File.separator + "exceltemplates" + File.separator + "license.xml"; aposeLic.setLicense(new FileInputStream(path)); // 转换 Document doc = new Document(fis); doc.save(fos, SaveFormat.PDF); } catch (Exception e) { e.printStackTrace(); } finally { try { fos.flush(); fos.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * word转成pdf * * @方法名:wordToPdf * @参数 @param wordList 源WORD文件信息 * @返回类型 List<String> */ public static List<String> wordToPdf(JSONArray wordList) { FileInputStream fis = null; FileOutputStream fos = null; String root = AppUtil.getProperty("file.upload");// 上传根目录 String target = root + File.separator + "pdf";// 临时PDF存放目录 File pdf = new File(target); if (!pdf.exists()) { pdf.mkdir(); } List<String> pdfList = new ArrayList<>(); try { String name = UUID.randomUUID().toString(); // 注册 License aposeLic = new License();// 注册license String path = root + File.separator + "exceltemplates" + File.separator + "license.xml";// 获取license模板 aposeLic.setLicense(new FileInputStream(path)); for (Object object : wordList) { JSONObject o = JSONObject.fromObject(object); String targetPath = target + File.separator + name + "_word_tmp" + ".pdf"; fis = new FileInputStream(root + File.separator + o.getString("filePath")); fos = new FileOutputStream(targetPath); pdfList.add(targetPath); // 转换 Document doc = new Document(fis); doc.save(fos, SaveFormat.PDF); // 流处理 fos.flush(); fos.close(); fis.close(); } } catch (Exception e) { e.printStackTrace(); return null; } finally { try { fos.flush(); fos.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); return null; } } return pdfList; } /** * 读取word文本 * * @方法名:readWordToString * @参数 @param path * @参数 @return * @返回类型 String */ /* * public static String readWordToString(String path) { String result = ""; try * { if (null != path && path.indexOf("doc") > 0) { if (path.endsWith(".doc")) { * InputStream is = new FileInputStream(path); WordExtractor ex = new * WordExtractor(is); result = ex.getText(); is.close(); } else if * (path.endsWith(".docx")) { OPCPackage o = POIXMLDocument.openPackage(path); * POIXMLTextExtractor extractor = new XWPFWordExtractor(o); result = * ((XWPFWordExtractor) extractor).getText(); o.close(); } } } catch (Exception * e) { e.printStackTrace(); result = ""; } return result; } */ /** * 读取pdf文本 * * @方法名:readPdfToString * @参数 @param path * @参数 @return * @返回类型 String */ public static String readPdfToString(String path) { try { FileInputStream fis = new FileInputStream(path); PDFParser p = new PDFParser(fis); p.parse(); PDDocument pdd = p.getPDDocument(); PDFTextStripper ts = new PDFTextStripper(); String result = ts.getText(pdd); pdd.close(); fis.close(); return result; } catch (Exception e) { e.printStackTrace(); return ""; } } /** * PDF合并 * * @param pdfFilenames * @param targetFilename * @throws Exception */ public static void combinPdf(List<String> pdfFilenames, String targetFilename) throws Exception { PdfReader reader = null; com.itextpdf.text.Document doc = new com.itextpdf.text.Document(); PdfCopy pdfCopy = new PdfCopy(doc, new FileOutputStream(targetFilename)); int pageCount = 0; doc.open(); for (int i = 0; i < pdfFilenames.size(); ++i) { reader = new PdfReader(pdfFilenames.get(i)); pageCount = reader.getNumberOfPages(); for (int j = 1; j <= pageCount; ++j) { pdfCopy.addPage(pdfCopy.getImportedPage(reader, j)); } } doc.close(); pdfCopy.close(); reader.close(); } public static void waterMark(String inputFile, String outputFile, String waterMarkName) { try { // 读取需要添加水印的PDF文件 PdfReader reader = new PdfReader(inputFile); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile)); // 设置水印字体 BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED); Rectangle pageRect = null; PdfGState gs = new PdfGState(); // 设置水印透明度 gs.setFillOpacity(0.1f); gs.setStrokeOpacity(0.2f); // 计算PDF的页数 int total = reader.getNumberOfPages() + 1; JLabel label = new JLabel(); FontMetrics metrics; int textH = 0; int textW = 0; label.setText(waterMarkName); metrics = label.getFontMetrics(label.getFont()); textH = metrics.getHeight(); textW = metrics.stringWidth(label.getText()); PdfContentByte under; // 給没一页加上水印,可以随便指定页 for (int i = 1; i < total; i++) { pageRect = reader.getPageSizeWithRotation(i); under = stamper.getOverContent(i); under.saveState(); under.setGState(gs); under.beginText(); under.setFontAndSize(base, 40); under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, textW, textH, 30); // 水印文字成30度角倾斜 /*for (int height = interval + textH; height < pageRect.getHeight(); height = height + textH * 3) { for (int width = interval + textW; width < pageRect.getWidth() + textW; width = width + textW * 2) { under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, width - textW, height - textH, 30); } }*/ // 添加水印文字 under.endText(); } // 关闭流 stamper.close(); reader.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 批量打包 * * @param jsonString * json格式字符串数据 * @param fileSaveRootPath * 项目根目录 * @return zip文件保存绝对路径 */ public static String createZipAndReturnPath(List<Map<String, String>> filePathList, String fileSaveRootPath) { // 生成jsonArray列表 SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDD"); String time = sdf.format(new Date()); try { // 生成打包下载后的zip文件 String papersZipName = "文件包"+time+".zip"; // zip文件保存路径 String zipPath = fileSaveRootPath + papersZipName; ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipPath)); // 遍历jsonArray列表获取所有JSONObject对象 for (int i = 0; i < filePathList.size(); i++) { Map<String, String> fileMap = filePathList.get(i); String fileName = fileMap.get("FILE_NAME"); String relativePath = fileMap.get("FILE_PATH"); // 获得下载文件完整路径 String downloadPath = fileSaveRootPath + relativePath; FileInputStream fis = new FileInputStream(downloadPath); out.putNextEntry(new ZipEntry(fileName)); // 写入压缩包 int len; byte[] buffer = new byte[1024]; while ((len = fis.read(buffer)) > 0) { out.write(buffer, 0, len); } out.closeEntry(); fis.close(); } out.close(); out.flush(); return zipPath; } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { waterMark("d:\\12.pdf", "D:\\456.pdf", "新化啊"); } }