2

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

谢谢

4

5 回答 5

1

这种格式我不知道,但是既然你说“ OpenXML”,你可能只需要打开它并解码base64数据;

于 2009-10-19T09:12:44.497 回答
1

根据我的研究,它是压缩的 .fo 文件。如果您将 .zfo 重命名为 .zip,您将能够使用通常的存档器打开它,并且您会发现 .fo 文件是 xml 格式的文件,您可以使用任何文本编辑器查看。

于 2013-12-18T14:58:15.403 回答
1

在 Linux 上

ZFO -> XML

openssl smime -inform DER -in file.zfo -verify -noverify -out file.zfo.xml

在 XML 中是在元素中

<p:dmFiles>

附件数据(文件名、文件类型、数据)

于 2014-08-13T09:11:48.950 回答
1

根据我的经验,.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");
}
于 2015-05-12T12:24:59.863 回答
0

以下(快乐路径)bash 脚本应该足够了。它使用openssl,xsltprocbase64, 在大多数 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>&#xa;</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 部分!

于 2018-04-25T16:13:52.963 回答