pom文件

<!--依赖springboot-start中dependencyManagement的版本--><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>${freemarker.version}</version></dependency><!--itextpdf--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.3.4</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-pdfa</artifactId><version>5.5.13.1</version><scope>test</scope></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>1.2.1</version></dependency><!--没有该包的话,会有中文显示问题--><dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency><!--xdocreport--><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>org.apache.poi.xwpf.converter.pdf</artifactId><version>1.0.6</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId><version>1.0.6</version></dependency>

java文件

import com.hanxiaozhang.constant.ContractConstant;
import com.hanxiaozhang.watermarkutil.PDFWatermarkPrint;
import com.hanxiaozhang.watermarkutil.WatermarkPrint;
import lombok.extern.slf4j.Slf4j;import java.io.*;
import java.util.HashMap;
import java.util.Map;/*** 功能描述: <br>* 〈word转pdf, pdf转word工具类测试〉**/
@Slf4j
public class WordUtilTest {public static void main(String[] args) throws Exception {String docx = "D:\\test\\test.docx";WordUtil.getInstance().execute(docx,"test",initData(),"test11");}/*** 初始化docx文件中的变量数据* @return*/public static Map initData() {Map<String, String> data = new HashMap<>(4);data.put("test", "tese");return data;}
}
@Slf4j
public class WordUtil {/*** 代表应用程序和URL之间的通信链接*/HttpURLConnection httpURLConnection = null;/*** 生成pdf路径名*/private String pdfName;/*** 添加水印的pdf路径名*/private String waterPdfName;/*** 文件上传到fast的地址*/private String fileUrl;private File pdfFile;private File waterPdfFile;private static class Holder{private final static WordUtil INSTANCE = new WordUtil();}private WordUtil() {}public static WordUtil getInstance() {return Holder.INSTANCE;}/*** 执行生成PDF文件*/public String execute(String fastUrl, String waterMark, Map<String, String> initPdfData, String fileName) {this.fileUrl=null;this.pdfName = CommonUtil.getDir() + fileName + "-" + DateUtil.format2() + ".pdf";log.info("WordUtil--execute-pdfName: {}",pdfName);this.waterPdfName = CommonUtil.getDir() + fileName + "-" + DateUtil.format2() + "-1.pdf";log.info("WordUtil--execute-waterPdfName: {}",waterPdfName);this.pdfFile = new File(pdfName);this.waterPdfFile = new File(waterPdfName);InputStream is = null;try {is = getInputStreamByPath(fastUrl);// word 转 pdfWordUtil.wordToPDF(is, initPdfData, pdfFile, ContractConstant.DOCX);watermark(waterMark);FileUtil.uploadFile(fileToByte(waterPdfFile), CommonUtil.getDir(), fileName +".pdf");} catch (Exception e) {log.error("wordToPDF『"+pdfName+"』", e);} finally {try {if (is != null) {is.close();}} catch (Exception e) {log.error("关闭流异常", e);}}log.info("返回生成pdf--execute-fileUrl{}",fileUrl);return fileUrl;}/*** word转pdf** @param srcInput  doc输入流* @param data      需要替换的doc文档变量数据* @param targetPdf pdf文件* @param fileType  doc或者docx* @throws Exception*/public static void wordToPDF(InputStream srcInput, Map<String, String> data, File targetPdf, String fileType) throws Exception {if (fileType.endsWith(ContractConstant.DOCX)) {byte[] pdfData = bindDocxDataAndToPdf(srcInput, data);FileUtils.writeByteArrayToFile(targetPdf, pdfData);} else if (fileType.endsWith(ContractConstant.DOC)) {byte[] pdfData = bindDocDataAndToPdf(srcInput, data);FileUtils.writeByteArrayToFile(targetPdf, pdfData);} else {throw new RuntimeException("文件格式不正确");}}/*** 替换docx文件内容,并转换成PDF** @param input docx文件流* @param data  替换内容* @return pdf文件流* @throws Exception*/private static byte[] bindDocxDataAndToPdf(InputStream input, Map<String, String> data) throws Exception {byte[] replacedContent = replaceDocxContent(input, data);byte[] pdfData = docxToPdf(new ByteArrayInputStream(replacedContent));return pdfData;}/*** 替换doc文件内容,并转换成PDF** @param input docx文件流* @param data  替换内容* @return pdf文件流* @throws Exception*/private static byte[] bindDocDataAndToPdf(InputStream input, Map<String, String> data) throws Exception {byte[] pdfData = new byte[0];return pdfData;}/*** docx转成pdf** @param docxStream docx文件流* @return 返回pdf数据* @throws Exception*/private static byte[] docxToPdf(InputStream docxStream) throws Exception {ByteArrayOutputStream targetStream = null;XWPFDocument doc = null;try {doc = new XWPFDocument(docxStream);PdfOptions options = PdfOptions.create();// 中文字体处理options.fontProvider(new IFontProvider() {@Overridepublic Font getFont(String familyName, String encoding, float size, int style, Color color) {try {BaseFont bfChinese = createFont();Font fontChinese = new Font(bfChinese, size, style, color);if (familyName != null) {fontChinese.setFamily(familyName);}return fontChinese;} catch (Exception e) {e.printStackTrace();return null;}}});targetStream = new ByteArrayOutputStream();PdfConverter.getInstance().convert(doc, targetStream, options);return targetStream.toByteArray();} catch (IOException e) {throw new Exception(e);} finally {IOUtils.closeQuietly(targetStream);}}/*** doc转成pdf** @param docStream doc文件流* @return 返回pdf数据* @throws Exception*/private static byte[] docToPdf(InputStream docStream) {ByteArrayOutputStream targetStream = new ByteArrayOutputStream();// todo 待完善doc转成pdfreturn targetStream.toByteArray();}/*** 替换docx内容** @param in  docx输入流* @param map 替换键值对* @return 返回替换后的文件流* @throws Exception*/private static byte[] replaceDocxContent(InputStream in, Map<String, String> map) throws Exception {// 读取word模板XWPFDocument hdt = null;ByteArrayOutputStream out = null;try {hdt = new XWPFDocument(in);// 替换段落内容List<XWPFParagraph> paragraphs = hdt.getParagraphs();if (map != null && !map.isEmpty()) {replaceParagraphsContent(paragraphs, map);}// 替换表格内容List<XWPFTable> tables = hdt.getTables();// 读取表格for (XWPFTable table : tables) {int rcount = table.getNumberOfRows();// 遍历表格中的行for (int i = 0; i < rcount; i++) {XWPFTableRow row = table.getRow(i);// 遍历行中的单元格List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {List<XWPFParagraph> cellParagraphs = cell.getParagraphs();if (map != null && !map.isEmpty()) {replaceParagraphsContent(cellParagraphs, map);}}}}out = new ByteArrayOutputStream();hdt.write(out);return out.toByteArray();} catch (IOException e) {throw new Exception(e.getMessage());} finally {IOUtils.closeQuietly(out);}}/*** 替换段落内容** @param paragraphs* @param map*/private static void replaceParagraphsContent(List<XWPFParagraph> paragraphs, Map<String, String> map) {for (XWPFParagraph paragraph : paragraphs) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String text = run.getText(0);if (text != null) {boolean isSetText = false;for (Map.Entry<String, String> entry : map.entrySet()) {String key = entry.getKey();// 在配置文件中有这个关键字对应的键if (text.indexOf(key) != -1) {String value = entry.getValue();if (value == null) {throw new RuntimeException(key + "对应的值不能为null");}// 文本替换text = text.replace(key, value);isSetText = true;}}if (isSetText) {run.setText(text, 0);}}}}}/*** 创建字体** @return*/private static BaseFont createFont() {//仿宋体String font_cn = getChineseFont();BaseFont chinese = null;try {chinese = BaseFont.createFont(font_cn, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return chinese;}/*** 获取中文字体位置** @return*/private static String getChineseFont() {// 仿宋体String font = "C:/windows/fonts/simfang.ttf";// 判断系统类型,加载字体文件java.util.Properties prop = System.getProperties();String osName = prop.getProperty("os.name").toLowerCase();if (osName.indexOf("linux") > -1) {font = "/usr/share/fonts/simsun/simfang.ttf";}else if(osName.indexOf("mac os x") > -1){font="/Users/Downloads/simfang.ttf";}if (!new File(font).exists()) {throw new RuntimeException("字体文件不存在,影响导出pdf中文显示!" + font);}return font;}/*** 将文件转换成byte数组** @param tradeFile* @return*/public static byte[] fileToByte(File tradeFile) {byte[] buffer = null;try {FileInputStream fis = new FileInputStream(tradeFile);ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] b = new byte[1024];int n;while ((n = fis.read(b)) != -1) {bos.write(b, 0, n);}fis.close();bos.close();buffer = bos.toByteArray();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return buffer;}/*** 添加水印** @param waterMark*/private void watermark(String waterMark) {WatermarkPrint watermarkPrint = new PDFWatermarkPrint();try {watermarkPrint.print(pdfFile, new BufferedOutputStream(new FileOutputStream(waterPdfFile)),waterMark, DateUtil.format1());} catch (Exception e) {e.printStackTrace();}}/*** 上传到fast*/private void uploadFast() {// 上传到文件服务器String remoteServerPath = "https://www.xxxx.com/";String remoteFilePath = null;try {
//            remoteFilePath = FastDfsUtil.upload(fileToByte(waterPdfFile), "pdf");} catch (Exception e) {e.printStackTrace();}if (StringUtil.isBlank(remoteFilePath)) {throw new RuntimeException("文件上传失败,请重新上传!");}String fileUrl = "";// 保存到数据库if (remoteServerPath.endsWith("/")) {fileUrl = remoteServerPath + remoteFilePath;} else {fileUrl = remoteServerPath + "/" + remoteFilePath;}this.fileUrl = fileUrl;}/*** 获取输入流通过Url** @param fileUrl* @return*/private InputStream getInputStreamByUrl(String fileUrl) {InputStream is = null;for (int i = 0; i < 3; i++) {try {URL url = new URL(fileUrl);httpURLConnection = (HttpURLConnection) url.openConnection();httpURLConnection.setDoInput(true);httpURLConnection.setRequestMethod("GET");httpURLConnection.setConnectTimeout(30000);is = httpURLConnection.getInputStream();break;} catch(Exception e) {log.error("打开文件链接异常, 第【{}】次", i+1 , e);}}return is;}/*** 获取输入流通过path** @param path* @return*/private InputStream getInputStreamByPath(String path){InputStream is = null;try {is = new FileInputStream(path);} catch (FileNotFoundException e) {e.printStackTrace();}return is;}}
@Slf4j
public class FreemarkerUtil {public static Configuration CONFIG;public static String renderTemplate(String s, Map<String, Object> data) throws IOException, TemplateException {Template t = new Template(null, new StringReader(s), CONFIG);// 执行插值,并输出到指定的输出流中StringWriter w = new StringWriter();t.getConfiguration();try {t.process(data, w);} catch (Exception e) {e.printStackTrace();log.error("填充模板内容出现异常,模板:"+s);log.debug("noticeTime",data.get("noticeTime"));}return w.getBuffer().toString();}public static String renderFileTemplate(String file, Map<String, Object> data) throws IOException,TemplateException {Configuration cfg = CONFIG;cfg.setDefaultEncoding("UTF-8");// 取得模板文件Template t = cfg.getTemplate(file);// 执行插值,并输出到指定的输出流中StringWriter w = new StringWriter();t.getConfiguration();t.process(data, w);return w.getBuffer().toString();}}
public class PdfHelper {private Document document;private BaseFont bfChinese;/*** 字体*/@SuppressWarnings("unused")private Font font;public PdfHelper(String path) {document = new Document();try {// 建立一个PdfWriter对象PdfWriter.getInstance(document, new FileOutputStream(path));document.open();// 设置中文字体bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 设置字体大小font = new Font(bfChinese, 10, Font.NORMAL);} catch (DocumentException de) {} catch (IOException ioe) {}}public static PdfHelper instance(String path) {return new PdfHelper(path);}public void exportPdf() {document.close();}public void addHtmlList(List<Element> list) throws DocumentException {for (Element e : list) {document.add(e);}}}
@Slf4j
public class PdfUtil {/***   协议模板*/private ContractTemplateDO contractTemplateDO;private PdfHelper pdf;private Map<String, Object> data;/*** 生成pdf路径名*/private String pdfName;/*** 添加水印的pdf路径名*/private String waterPdfName;private File pdfFile;private File waterPdfFile;/*** 文件上传到fast的地址*/private String fileUrl;/*** 水印文字*/private String watermark;private static class Holder{private static PdfUtil INSTANCE = new PdfUtil();}private PdfUtil(){}public static PdfUtil getInstance() {return Holder.INSTANCE;}/*** 执行生成PDF文件*/public String execute(ContractTemplateDO contractTemplateDO, Map<String, Object> templateData, String watermark, String fileName) {this.contractTemplateDO = contractTemplateDO;pdfName = CommonUtil.getDir() + fileName + "-" + DateUtil.format2() + ".pdf";waterPdfName = CommonUtil.getDir() + fileName + "-" + DateUtil.format2() + "-1.pdf";this.pdf = PdfHelper.instance(pdfName);this.waterPdfFile = new File(waterPdfName);this.data = templateData;this.watermark = watermark;prepare();valid();initDate();createPdf();watermark(watermark);//uploadFast();return fileUrl;}/*** 预处理*/private void prepare() {}/*** 校验*/private void valid() {}/*** 初始化参数*/private void initDate() {}/*** 创建PDF*/private void createPdf() {boolean checkFile = false;File pdfFile = new File(pdfName);try {if (!pdfFile.exists()) {pdfFile.mkdir();}String out = FreemarkerUtil.renderTemplate(contractTemplateDO.getTemplateContent(), this.data);ProtocolHelper.templateHtml(out, pdf);checkFile = true;} catch (IOException e) {log.error("解析模板出错",e);throw new RuntimeException("解析模板出错");} catch (Exception e) {log.error("生成pdf出错",e);}if (!checkFile) {throw new RuntimeException("pdf生成的路径不存在...");}pdf.exportPdf();}/*** 上传到fast*/private void uploadFast() {// 上传到文件服务器String remoteServerPath = "https://www.xxxx.com/";String remoteFilePath = null;try {
//            remoteFilePath = FastDfsUtil.upload(fileToByte(waterPdfFile), "pdf");} catch (Exception e) {e.printStackTrace();}if (StringUtil.isBlank(remoteFilePath)) {throw new RuntimeException("文件上传失败,请重新上传!");}String fileUrl = "";// 保存到数据库if (remoteServerPath.endsWith("/")) {fileUrl = remoteServerPath + remoteFilePath;} else {fileUrl = remoteServerPath + "/" + remoteFilePath;}this.fileUrl = fileUrl;}/*** 打印水印** @param watermark*/private void watermark(String watermark) {WatermarkPrint watermarkPrint = new PDFWatermarkPrint();File file = new File(pdfName);try {watermarkPrint.print(file, new BufferedOutputStream(new FileOutputStream(waterPdfFile)),watermark, DateUtil.format2());} catch (IOException e) {e.printStackTrace();} catch (DocumentException e) {e.printStackTrace();}}}
@Slf4j
public class ProtocolHelper {/*** * @param str* @param pdf* @return* @throws IOException* @throws DocumentException*/protected static void templateHtml(String str, PdfHelper pdf) throws IOException, DocumentException {final List<Element> pdfeleList = new ArrayList<Element>();ElementHandler elemH = new ElementHandler() {@Overridepublic void add(final Writable w) {if (w instanceof WritableElement) {pdfeleList.addAll(((WritableElement) w).elements());}}};log.info("Charset.defaultCharset(): {}",Charset.defaultCharset());InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(str.getBytes("UTF-8")), "UTF-8");XMLWorkerHelper.getInstance().parseXHtml(elemH, isr);List<Element> list = new ArrayList<Element>();pdfeleList.forEach(x->{if (x instanceof LineSeparator || x instanceof WritableDirectElement) {return;}list.add(x);});pdf.addHtmlList(list);}}

word转pdf加水印以及替换内容相关推荐

  1. Java实现Excel和word转pdf加水印,复制及可用

    Java实现Excel和word转pdf加水印,复制及可用 时隔大半年,之前朋友,今天突然找我说,他们有个需求要做这东西.想起来之前自己照着官方文档写,也走了不少坑.今天就索性写个,也为了方便以后使用 ...

  2. 给现有的word和pdf加水印

    iTextSharp简单生成pdf和操作pdf添加水印 给word加水印,利用的是aspose.words

  3. (Java)word转pdf(aspose),pdf加水印(itextpdf),并支持POI模板(包括checkbox)导出

    目录 1.引入jar包 2.pdf处理工具类 3.poi模板导出工具类 4.测试类 5.模板 6.最终效果 1.引入jar包 2.pdf处理工具类 import com.aspose.cells.Pd ...

  4. Springboot使用itext及documents4j操作pdf(word转pdf、pdf加水印(文字或图片,可指定位置)、pdf加密(打开密码,编辑密码))

    pom.xml引入 <!-- pdf文档生成 --><dependency><groupId>com.documents4j</groupId>< ...

  5. java使用2种方法操作liberoffice把word转pdf,pdf加水印,java远程调用Linux执行命令

    文章目录 libreoffice下载地址 安装 (第一种) java调用 (第二种 推荐) java调用Linux命令转pdf java远程连接Linux执行命令(少数情况) linux安装windo ...

  6. itextPDF5.5.13 pdf加水印的权限控制

    1.我们的需求需要对pdf加水印,其中有加密的和未加密的, 操作过程中发现 有的虽然加密了 但是符合PDFReader的五种加密算法,就可以成功破解加水印,还有一些就会抛出一些异常 第一种报错:com ...

  7. PDF转换图片,图片的切割,图片转换PDF以及PDF加水印等记录贴

    PDF转变为图片: 把图片进行切割: 把图片转变回PDF: 为PDF加水印文字: 为PDF加水印图片. 1,PDF转变为图片 /*** @author dalin*将PDF格式的文件转换成png文件* ...

  8. itex将html转成pdf加水印,itext操作PDF文件添加水印

    功能描述:添加图片和文字水印 /** * * [功能描述:添加图片和文字水印] [功能详细描述:功能详细描述] * @param srcFile 待加水印文件 * @param destFile 加水 ...

  9. 为Word文档加水印使其更加美观(转)

    为Word文档加水印使其更加美观(转) 许多朋友在制作Word文档时,为使文档更加美观,喜欢在其中加上水印.而通常制作水印的方法是通过图形的层叠来实现的,但如果需要为文档中的每一页都加有相同水印的话, ...

  10. 如何给word文档加水印

    转自:微点阅读  https://www.weidianyuedu.com/content/3519276155101.html 怎么给word文档添加水印?这是很多人心里面都有的疑问,给word文档 ...

最新文章

  1. 深度学习100问-1:深度学习环境配置有哪些坑?
  2. php下载的文件不是汉字,php实现支持中文的文件下载功能示例
  3. h5微信本地调试 vue_Vue 移动端微信内H5调起支付(利用js sdk)
  4. .NET C# I/O 操作
  5. 在减少对内地房地产投资的同时,加快了在内地零售业的布局;并积极推动“走出去”战略,在全球52个国家投资多种业务。...
  6. 上传jar包到私服(仅限于翼支付公司工作流程使用)和涉及的技术总结
  7. hql 字符串where语句_Hibernate HQL基础 限定查询条件
  8. Tomcat实现Session对象的持久化原理及配置方法介绍
  9. docker镜像的使用及相关
  10. for input string:是什么原因出现的_「汽车空调异味」周期性出现:原因是什么呢?...
  11. 【HAVENT原创】使用 Spring Boot 的 AOP 全局记录执行时间日志
  12. 黑马 docker 学习笔记
  13. 为什么说人脸识别门禁是智慧社区的优选?
  14. 教你炒股票25:吻,MACD、背弛、中枢
  15. Android Wifi文件传输
  16. 【性能测试之问题分析】遇到内存告警百分之80以上的排查逻辑及实例分析(关键字:JVM、JAVA)
  17. 【前端笔记】Ant Design Form组件 resetFields() 与 setFieldsValue() 之比较
  18. Python变量命名用法(一般变量、常量、私有变量、内置变量)
  19. mysql4.0做主从时主库的备份脚本
  20. 微信小程序客服之如何接入多客服

热门文章

  1. jsencrypt加密,并解决Message too long for RSA
  2. UGUI_03_补充之_Image的属性(image type这个属性simple、Sliced、tiled、filled样式详解)
  3. qt编写的mask遮罩的半透明涂抹功能
  4. 解决数据库数据粘贴到excel中换行、换列问题
  5. adobe服务器无响应,链接不到adobe服务器
  6. 文本域换行 php,js获取textarea文本域自动换行符
  7. android自定义六边形,Android实现六边形图像
  8. suspense源码分析
  9. ubuntu 下的 dnw 下载安装和使用
  10. 网站首页导航栏移入移出动画(一)slideDown、slideUp