有谁知道如何从 .zfo 文件(602 表单填充器)中提取附件。它是一种基于 openXML 的格式。
谢谢
这种格式我不知道,但是既然你说“ OpenXML
”,你可能只需要打开它并解码base64数据;
根据我的研究,它是压缩的 .fo 文件。如果您将 .zfo 重命名为 .zip,您将能够使用通常的存档器打开它,并且您会发现 .fo 文件是 xml 格式的文件,您可以使用任何文本编辑器查看。
在 Linux 上
ZFO -> XML
openssl smime -inform DER -in file.zfo -verify -noverify -out file.zfo.xml
在 XML 中是在元素中
<p:dmFiles>
附件数据(文件名、文件类型、数据)
根据我的经验,.zfo 消息只是签名的 XML 文件(CMS/PKCS #7 标准)。您需要做的就是删除加密的信封,它会为您提供一个易于阅读的 XML 文件。在捷克 ISDS 的情况下,所有附件都列在一个<p:dmFiles>
元素中。
XML 示例:
...
<p:dmFiles xmlns:p="http://isds.czechpoint.cz/v20">
<p:dmFile dmMimeType="doc" ... >
<p:dmEncodedContent> ... </p:dmEncodedContent>
</p:dmFile>
<p:dmFile dmMimeType="pdf" ...>
<p:dmEncodedContent> ... </p:dmEncodedContent>
</p:dmFile>
</p:dmFiles>
您可以使用 C# 访问内容元素,如下所示:
var message = new System.Security.Cryptography.Pkcs.SignedCms();
message.Decode(System.IO.File.ReadAllBytes("message.zfo"));
var doc = new System.Xml.XmlDocument();
using (var ms = new System.IO.MemoryStream(message.ContentInfo.Content))
{
doc.Load(ms);
var list = d.DocumentElement.GetElementsByTagName("p:dmEncodedContent");
}
以下(快乐路径)bash 脚本应该足够了。它使用openssl
,xsltproc
和base64
, 在大多数 Linux 发行版中都非常常用的工具。请参阅我的 GitHub以获得更强大的版本。
$ cat extract-zfo.sh
#!/bin/bash
# verify and strip signature
xml="$(openssl smime -inform DER -verify -noverify -in "$1")"
# list all attachments
stylesheet='
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:for-each select="'"//*[local-name()='dmFile']"'">
<xsl:value-of select="@dmFileDescr"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>'
files="$(xsltproc <(printf '%s' "$stylesheet") - <<<"$xml")"
# dump all attachments
while read -r file; do
stylesheet='
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:value-of select="'"//*[local-name()='dmFile' and @dmFileDescr='$file']/*[local-name()='dmEncodedContent']/text()"'"/>
</xsl:template>
</xsl:stylesheet>'
xsltproc <(printf '%s' "$stylesheet") - <<<"$xml" | base64 -d > "$file"
done <<<"$files"
用法:
$ ./extract-zfo.sh a-file.zfo
感谢 @knedle 的 openssl 部分!