跳到正文

保留源包的 DOCX 文字编辑 ​

DocxAdapter.editPackage 直接编辑 DOCX 包中的普通文字,保留通用语义模型不能表达的未编辑结构。需要编辑浮动图形、批注、修订、控件或目录声明时,使用类型化 DOCX 语义编辑;两者与通用语义转换分别检查自己的结构和损失边界。

java
import com.mirakyux.export4j.adapter.docx.DocxAdapter;
import com.mirakyux.export4j.model.processing.ProcessingPolicy;
import java.nio.file.Files;
import java.nio.file.Path;

var policy = ProcessingPolicy.builder()
        .feature("OOXML_TEXT_STRUCTURE", ProcessingPolicy.Action.WARN,
                ProcessingPolicy.Treatment.PRESERVE)
        .build();
var prepared = new DocxAdapter().editPackage(Files.readAllBytes(Path.of("source.docx")))
        .part("word/header1.xml")
        .policy(policy)
        .replaceText("Old title", "New title")
        .prepare();
var preview = prepared.preview();
var result = prepared.to(Path.of("edited.docx"));
assert preview.issues().equals(result.report().issues());

默认只选 word/document.xml,可显式添加现有 headerN/footerN 条目。字面、区分大小写、按请求顺序替换;不跨段,不拆代理对。位置是该操作执行时段落视图的 UTF-16。不同运行的同样式普通文字可跨运行替换,保留首运行之外的未命中文字。

策略与保留 ​

默认 ERROR;共享覆盖顺序为操作、功能、格式、默认值。操作键为 REPLACE_TEXT,格式键 DOCX。

功能支持的明确处理
MIXED_RUN_STYLEDEGRADE 使用首运行的样式/链接;或 SKIP_MATCH、SKIP_BLOCK、SKIP_REQUEST、PRESERVE
OOXML_TEXT_STRUCTURE复杂边界不修改;支持上述跳过或 PRESERVE,不能 DEGRADE
GRAPHEME_BOUNDARY不拆字素;明确跳过或保留,不能强制修改

WARN 与 IGNORE 的处理一致,IGNORE 只隐藏警告,仍返回实际 issues;PRESERVE 表示整段保持原内容。SKIP_REQUEST 回滚整个请求。字段、跨段目录缓存、评论边界、修订、内容控件和文本框内文字不作为普通文字编辑。目录、评论、修订、表单、页区等未编辑结构保留,不更新目录/字段缓存、不接受或拒绝修订。

未改条目的解压字节完全一致,整个请求没有实际改动时 ZIP 字节也一致。修改条目保持 DOM 内容与结构,仅选中文字及 xml:space 改变;XML 序列化与 ZIP 压缩、时间戳等可以不同。

安全、预算和输出 ​

输入立即复制,整个包安全解析并验证关系目标、重复及缺失引用。宏、ActiveX、OLE/嵌入包、外部资源、危险字段指令、签名、保护文档无条件拒绝。仅允许不会主动加载资源的合法 HTTP/mailto 超链接;不联网。

包读取先计量完整输入(包括中央目录和 ZIP 注释),再核对中央目录、局部条目、大小、CRC、压缩方法、名称、偏移及数据描述符。截断、目录冲突、重叠、未引用内容和尾随数据直接失败,ERROR/WARN/IGNORE 均不能放宽。支持经典单磁盘 STORED/DEFLATED ZIP、标准注释与数据描述符;ZIP64、加密和多磁盘包明确拒绝。读取不向文件系统解压,不关闭调用方输入流;普通导入、原生语义导入、转换与原包编辑共用该校验。证据见安全回归。

DocxLimits 控制 ZIP 输入/条目/展开量,EditLimits 控制节点、累计文字、命中、工作和诊断;默认输出上限 64 MiB。准备保存确切输出,发布不重做替换。路径要求已有父目录和原子移动支持;最终取消检查先于替换,失败保护旧文件并清理临时文件。借用流不关闭、不刷新,物理写失败可能留下部分字节。

完整示例见 DocxPackageEditExample,证据见阶段四十八。