如何使用Apache POI获取已签名docx文件的签名信息?
用Apache POI获取DOCX签名信息(sig1.xml内容)
你说得没错——签名后的DOCX解压后,签名信息确实存在_xmlsignatures/sig1.xml里。用Apache POI来提取这些信息其实并不复杂,下面是具体的步骤和代码示例:
核心思路
DOCX属于OOXML格式,Apache POI的org.apache.poi.openxml4j.opc包可以直接操作OOXML的包结构,我们只需要定位到_xmlsignatures/sig1.xml这个条目,然后读取它的内容即可。
具体实现步骤
- 第一步:引入Apache POI相关依赖(如果用Maven的话)
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version> <!-- 建议用最新稳定版 --> </dependency> - 第二步:编写代码读取sig1.xml内容
import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import java.io.InputStream; import java.nio.charset.StandardCharsets; import org.apache.commons.io.IOUtils; public class DocxSignatureReader { public static void main(String[] args) { try (OPCPackage opcPackage = OPCPackage.open("你的签名docx文件路径.docx")) { // 定位到sig1.xml所在的包条目 PackagePart sigPart = opcPackage.getPartByName("/_xmlsignatures/sig1.xml"); if (sigPart != null) { // 读取输入流并转换为字符串 try (InputStream is = sigPart.getInputStream()) { String sigXmlContent = IOUtils.toString(is, StandardCharsets.UTF_8); System.out.println("sig1.xml内容:\n" + sigXmlContent); // 这里可以进一步解析XML内容,比如用DOM、SAX或者JAXB } } else { System.out.println("该DOCX文件没有签名信息"); } } catch (Exception e) { e.printStackTrace(); } } }
额外说明
- 如果需要解析XML里的具体签名字段(比如签名者、签名时间、证书信息等),可以结合Java的XML解析工具(比如
javax.xml.parsers.DocumentBuilder)来处理读取到的sigXmlContent字符串。 - 注意要确保使用的Apache POI版本是支持OOXML签名处理的,推荐使用5.x以上的稳定版本,避免兼容性问题。
内容的提问来源于stack exchange,提问作者JDChi
相关产品推荐
相关产品推荐

