自学内容网 自学内容网

java 导出word锁定且部分内容解锁可编辑

使用 Apache POI 创建带编辑限制的 Word 文档

在日常工作中,我们可能需要生成一些带有编辑限制的 Word 文档,例如某些段落只能被查看,而其他段落可以自由编辑。本文介绍如何使用 Apache POI 创建这样的文档,并通过代码实现相应的编辑权限。

示例代码

以下代码演示了如何使用 Apache POI 设置 Word 文档的部分段落为只读,同时创建可以自由编辑的区域。

import org.apache.poi.wp.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.poifs.crypt.HashAlgorithm;

import java.io.FileOutputStream;
import java.util.Random;

public class WordEditingRestriction {
    public static void main(String[] args) throws Exception {
        XWPFDocument document = new XWPFDocument();

        // 创建一个不可编辑的段落
        XWPFParagraph lockedParagraph = document.createParagraph();
        XWPFRun lockedRun = lockedParagraph.createRun();
        lockedRun.setText("本段已被程序锁定,解锁密码是000000。");

        // 创建可编辑区域
        createEditableRegion(document, "这是可以自由编辑的区域");

        // 再添加一个不可编辑的段落
        XWPFParagraph anotherLockedParagraph = document.createParagraph();
        XWPFRun anotherLockedRun = anotherLockedParagraph.createRun();
        anotherLockedRun.setText("这也是被锁定的内容。");

        // 设置文档编辑限制
        document.enforceReadonlyProtection("000000", HashAlgorithm.sha512);

        String outputPath = "/Users/wtm/Desktop/output/" + System.currentTimeMillis() + ".docx";
        try (FileOutputStream out = new FileOutputStream(outputPath)) {
            document.write(out);
        }

        System.out.println("Word document created with editing restrictions.");
    }

    /**
     * 创建可编辑区域。
     *
     * @param document Word 文档对象
     * @param text     可编辑区域中的文本内容
     */
    private static void createEditableRegion(XWPFDocument document, String text) {
        // 随机生成一个唯一的权限 ID
        String id = String.valueOf(new Random().nextInt());

        // 选择一个段落,创建运行对象并设置文本
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun run = paragraph.createRun();
        run.setText(text);

        // 获取段落和运行的底层 XML 节点
        Node paragraphNode = paragraph.getCTP().getDomNode();
        Node runNode = run.getCTR().getDomNode();

        // 添加权限开始标记
        CTPermStart permStart = paragraph.getCTP().addNewPermStart();
        permStart.setId(id); // 设置权限 ID
        permStart.setEdGrp(STEdGrp.EVERYONE); // 设置编辑权限为所有人

        Node permStartNode = permStart.getDomNode();

        // 添加权限结束标记
        CTPerm permEnd = paragraph.getCTP().addNewPermEnd();
        permEnd.setId(id); // 设置权限 ID

        Node permEndNode = permEnd.getDomNode();

        // 将权限开始标记插入到段落节点中运行节点之前
        paragraphNode.insertBefore(permStartNode, runNode);

        // 将权限结束标记插入到段落节点中运行节点的下一个兄弟节点之前
        paragraphNode.insertBefore(permEndNode, runNode.getNextSibling());
    }
}

导出效果

在这里插入图片描述


原文地址:https://blog.csdn.net/qq_41525524/article/details/144386618

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!