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

本文共 3837 字,大约阅读时间需要 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/

你可能感兴趣的文章
pip3命令全解析:Python3包管理工具的详细使用指南
查看>>
pip3安装命令重复创建文件‘/tmp/pip-install-xxxxx/package‘失败
查看>>
PIPE 接口信号列表
查看>>
pipeline配置与管理Job企业级实战
查看>>
pipeline项目配置实战
查看>>
Pipenv 与 Conda?
查看>>
QVGA/HVGA/WVGA/FWVGA分辨率屏含义及大小//Android虚拟机分辨率
查看>>
pipreqs : 无法将“pipreqs”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径 正确,然后再试一次。
查看>>
pipy国内镜像的网址
查看>>
quiver绘制python语言
查看>>
pip下载缓慢
查看>>
PIP使用SSH从BitBucket安装自定义软件包,无需输入SSH密码
查看>>
pip命令提示unknow or unsupported command install解决方法
查看>>
pip在安装模块时提示Read timed out
查看>>
pip更换源
查看>>
SpringBoot之Banner源码深度分解
查看>>
Pix2Pix如何工作?
查看>>
QuickBI助你成为分析师——搞定数据源
查看>>
pkl来存储python字典
查看>>
quick sort | 快速排序 C++ 实现
查看>>