如何从ZFO中提取附件?

时间:2009-10-19 09:05:54

标签: extraction

有没有人知道如何从.zfo文件中提取附件(602表单填充程序)。它是一种基于openXML的格式。

谢谢

5 个答案:

答案 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脚本应该足够了。它没什么特别的,但是使用opensslxmllint来完成工作,这两种工具都是大多数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部分!