博客
关于我
POI:POI实现docx文件添加水印
阅读量:801 次
发布时间:2023-03-03

本文共 3775 字,大约阅读时间需要 12 分钟。

POI引入与Word文档水印生成

1. POI引入

Apache POI库是处理Office文档格式的强大工具,主要用于读取、写入和转换各种文档文件。为确保本文档正常运行,需注意以下几点:

  • POI版本要求:确保使用POI的最新版本(4.X及以上),以支持最新功能和修复已知问题。
  • 依赖项配置
    • poi:核心POI库,提供文档解析和操作功能。
    • poi-ooxml:处理OOXML格式文档的解析器。
    • poi-ooxml-schemas:提供必要的XSD(XML Schema Definition)文件,确保文档解析的完整性。
org.apache.poi
poi
4.1.2
org.apache.poi
poi-ooxml
4.1.2
org.apache.poi
poi-ooxml-schemas
4.1.2

2. 水印工具类实现

2.1 工具类概述

以下工具类DocxWaterMark用于在Word文档中添加水印,支持自定义内容、颜色和样式。代码结构清晰,易于扩展和维护。

package org.publiccms.common.watermark;import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import org.apache.xmlbeans.XmlObject;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.regex.Pattern;public class DocxWaterMark {    public static void addWaterMark(String filePath, String outPath, String waterMarkValue) throws Exception {        InputStream in = new FileInputStream(new File(filePath));        XWPFDocument doc = new XWPFDocument(in);                // 获取页眉页脚策略        XWPFHeaderFooterPolicy headerFooterPolicy = doc.getHeaderFooterPolicy();        if (headerFooterPolicy == null) {            headerFooterPolicy = doc.createHeaderFooterPolicy();        }                // 设置水印内容        headerFooterPolicy.createWatermark(waterMarkValue);                // 获取并修改水印样式        XWPFHeader header = headerFooterPolicy.getHeader(XWPFHeaderFooterPolicy.DEFAULT);        XWPFParagraph paragraph = header.getParagraphArray(0);                // 获取水印图形对象        XmlObject[] xmlobjects = paragraph.getCTP().getRArray(0).getPictArray(0).selectChildren(            new javax.xml.namespace.QName("urn:schemas-microsoft-com:vml", "shape"));                if (xmlobjects.length > 0) {            CTShape ctshape = (CTShape) xmlobjects[0];            ctshape.setFillcolor("#f6f6f6");            ctshape.setStyle(ctshape.getStyle() + ";rotation:315");            ctshape.setStyle(getShapeStyle());        }                // 输出文档        OutputStream out = new FileOutputStream(outPath);        doc.write(out);        out.flush();        out.close();    }        // 修改水印样式高度的辅助方法    private static String getShapeStyle() {        return "position: absolute; left: opt; width: 500pt; height: 150pt; z-index: -251654144; mso-wrap-edited: f; margin-left: -50pt; margin-top: 270pt; mso-position-horizontal-relative: margin; mso-position-vertical-relative: margin; mso-width-relative: page; mso-height-relative: page; rotation: 335";    }        // 修改水印样式高度的方法    public static String getWaterMarkStyle(String styleStr, double height) {        Pattern pattern = Pattern.compile(";");        String[] parts = styleStr.split(pattern);                for (String part : parts) {            if (part.startsWith("height:")) {                styleStr = styleStr.replace(part, "height: " + height + "pt");                break;            }        }        return styleStr;    }}

3. 测试代码示例

以下代码示例展示了如何在实际应用中使用DocxWaterMark类添加水印:

DocxWaterMark dwm = new DocxWaterMark();String fileName = urlOfd.substring(urlOfd.lastIndexOf("/") + 1);String baseSrcUrl = this.preAbsoluteUrl + urlOfd.substring(urlOfd.lastIndexOf("upload") - 1, urlOfd.lastIndexOf("/")) + "/" + fileName;String baseOutUrl = this.preAbsoluteUrl + "\\waterMark" + urlOfd.substring(urlOfd.lastIndexOf("/"));try {    dwm.addWaterMark(baseSrcUrl, baseOutUrl, username);    msg = "success";} catch (Exception ex) {    ex.printStackTrace();}

4. 注意事项

  • 依赖管理:确保所有POI依赖项已正确添加,且版本与项目要求一致。
  • 性能优化:在处理大文档时,可考虑分块处理以避免内存溢出。
  • 异常处理:建议在实际应用中添加更全面的错误处理逻辑,确保系统稳定性。

通过以上步骤,可以轻松集成POI库并为Word文档添加自定义水印,满足多种应用场景需求。

转载地址:http://jkxfk.baihongyu.com/

你可能感兴趣的文章
poj 3468 A Simple Problem with Integers 降维线段树
查看>>
poj 3468 A Simple Problem with Integers(线段树 插线问线)
查看>>
poj 3485 区间选点
查看>>
poj 3518 Prime Gap
查看>>
poj 3539 Elevator——同余类bfs
查看>>
poj 3628 Bookshelf 2
查看>>
Qt笔记——官方文档全局定义(一)Types数据类型
查看>>
POJ 3670 DP LIS?
查看>>
POJ 3683 Priest John's Busiest Day (算竞进阶习题)
查看>>
POJ 3988 Selecting courses
查看>>
POJ 4020 NEERC John's inversion 贪心+归并求逆序对
查看>>
poj 4044 Score Sequence(暴力)
查看>>
POJ 题目3020 Antenna Placement(二分图)
查看>>
Poj(1797) Dijkstra对松弛条件的变形
查看>>
POJ--2391--Ombrophobic Bovines【分割点+Floyd+Dinic优化+二分法答案】最大网络流量
查看>>
POJ-1163-The Triangle
查看>>
POJ-Fence Repair 哈夫曼树
查看>>
poj1061 - 同余方程,二元一次不定方程
查看>>
poj1068Parencodings
查看>>
poj1182(带权并查集)
查看>>