有没有人知道如何从.zfo文件中提取附件(602表单填充程序)。它是一种基于openXML的格式。
谢谢
答案 0 :(得分:1)
我不知道这种格式,但是既然你说“OpenXML
”,你可能只需要打开它并解码base64数据;
答案 1 :(得分:1)
根据我的研究,它是压缩的.fo文件。 如果你将.zfo重命名为.zip,你将能够使用普通的归档程序打开它,你会发现.fo文件是xml格式,你可以用任何文本编辑器查看。
答案 2 :(得分:1)
在linux上
ZFO - > XML
openssl smime -inform DER -in file.zfo -verify -noverify -out file.zfo.xml
XML中的在元素
中<p:dmFiles>
附件数据(文件名,文件类型,数据)
答案 3 :(得分:0)
根据我的经验.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");
}
答案 4 :(得分:0)
这个bash脚本应该足够了。它没什么特别的,但是使用openssl
和xmllint
来完成工作,这两种工具都是大多数Linux发行版中常用的工具。
$ cat extract-zfo.sh
#!/bin/bash
openssl smime -inform DER -in "$1" -verify -noverify -out "$1.xml"
files=$(xmllint --xpath "string(//*[local-name()='dmFile']/@dmFileDescr)" "$1.xml")
echo "Found the following files: $files"
for file in $files; do
echo "Extracting $file"
xmllint --xpath "//*[local-name()='dmFile' and @dmFileDescr='$file']/*[local-name()='dmEncodedContent']/text()" "$1.xml" | base64 -d > "$file"
done
用法:
$ ./extract-zfo.sh a-file.zfo
感谢@knedle的openssl部分!