/src/main/java/com/eastrobot/doc/service/impl/WatermarkServiceImpl.java

https://github.com/ekoz/kbase-doc · Java · 103 lines · 71 code · 16 blank · 16 comment · 9 complexity · 27ee0289d627772f185d25d0c376c1a8 MD5 · raw file

  1. /*
  2. * Power by www.xiaoi.com
  3. */
  4. package com.eastrobot.doc.service.impl;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.io.OutputStream;
  11. import javax.xml.namespace.QName;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.apache.poi.hwpf.HWPFDocument;
  14. import org.apache.poi.util.IOUtils;
  15. import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
  16. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  17. import org.apache.poi.xwpf.usermodel.XWPFHeader;
  18. import org.apache.poi.xwpf.usermodel.XWPFParagraph;
  19. import org.apache.xmlbeans.XmlObject;
  20. import org.springframework.stereotype.Service;
  21. import com.eastrobot.doc.service.WatermarkService;
  22. /**
  23. * @author <a href="mailto:eko.z@outlook.com">eko.zhan</a>
  24. * @date 2018年9月1日 上午10:11:26
  25. * @version 1.0
  26. */
  27. @Service
  28. public class WatermarkServiceImpl implements WatermarkService {
  29. private final static String DEFAULT_WATERMARK = "powered by eko.zhan";
  30. private final static String DEFAULT_FONT_COLOR = "#d8d8d8";
  31. @Override
  32. public byte[] handle(File originFile, String watermark) throws IOException {
  33. return handle(originFile, watermark, DEFAULT_FONT_COLOR);
  34. }
  35. @Override
  36. public byte[] handle(File originFile, String watermark, String color) throws IOException {
  37. watermark = StringUtils.isBlank(watermark)?DEFAULT_WATERMARK:watermark;
  38. color = StringUtils.isBlank(color)?DEFAULT_FONT_COLOR:color;
  39. if (originFile.getName().toLowerCase().endsWith("docx")) {
  40. try (InputStream in = new FileInputStream(originFile)){
  41. XWPFDocument doc = new XWPFDocument(in);
  42. addWaterMark(doc, watermark, color);
  43. try (OutputStream out = new FileOutputStream(originFile)){
  44. doc.write(out);
  45. doc.close();
  46. }
  47. }
  48. return IOUtils.toByteArray(new FileInputStream(originFile));
  49. } else if (originFile.getName().toLowerCase().endsWith("doc")) {
  50. try (InputStream in = new FileInputStream(originFile)){
  51. HWPFDocument doc = new HWPFDocument(in);
  52. addWaterMark(doc, watermark, color);
  53. try (OutputStream out = new FileOutputStream(originFile)){
  54. doc.write(out);
  55. doc.close();
  56. }
  57. }
  58. return IOUtils.toByteArray(new FileInputStream(originFile));
  59. }
  60. return null;
  61. }
  62. private void addWaterMark(Object obj, String watermark, String color) {
  63. if (obj instanceof XWPFDocument) {
  64. XWPFDocument doc = (XWPFDocument) obj;
  65. // create header-footer
  66. XWPFHeaderFooterPolicy headerFooterPolicy = doc.getHeaderFooterPolicy();
  67. if (headerFooterPolicy == null) headerFooterPolicy = doc.createHeaderFooterPolicy();
  68. // create default Watermark - fill color black and not rotated
  69. headerFooterPolicy.createWatermark(watermark);
  70. // get the default header
  71. // Note: createWatermark also sets FIRST and EVEN headers
  72. // but this code does not updating those other headers
  73. XWPFHeader header = headerFooterPolicy.getHeader(XWPFHeaderFooterPolicy.DEFAULT);
  74. XWPFParagraph paragraph = header.getParagraphArray(0);
  75. // get com.microsoft.schemas.vml.CTShape where fill color and rotation is set
  76. XmlObject[] xmlobjects = paragraph.getCTP().getRArray(0).getPictArray(0).selectChildren(new QName("urn:schemas-microsoft-com:vml", "shape"));
  77. if (xmlobjects.length > 0) {
  78. com.microsoft.schemas.vml.CTShape ctshape = (com.microsoft.schemas.vml.CTShape)xmlobjects[0];
  79. // set fill color
  80. ctshape.setFillcolor(color);
  81. // set rotation
  82. ctshape.setStyle(ctshape.getStyle() + ";rotation:315");
  83. }
  84. } else if (obj instanceof HWPFDocument) {
  85. }
  86. }
  87. }