代码之家  ›  专栏  ›  技术社区  ›  JL. Hans Passant

如何从ZFO中提取附件?

  •  1
  • JL. Hans Passant  · 技术社区  · 15 年前

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

    5 回复  |  直到 15 年前
        1
  •  1
  •   Rubens Farias    15 年前

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

        2
  •  1
  •   Petro Kostyuk    11 年前

    根据我的研究,这是压缩的.fo文件。 如果您将.zfo重命名为.zip,您将能够使用普通的archiver打开它,并且您可以在那里找到.fo文件,该文件是xml格式,您可以使用任何文本编辑器查看。

        3
  •  1
  •   knedle    10 年前

    在linux上

    ZFO->XML

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

    <p:dmFiles>
    

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

        4
  •  1
  •   Caesarion    9 年前

    以我的经验来看.zfo消息只是签名的XML文件(CMS/PKCS#7标准)。您所需要做的就是删除加密的信封,它为您提供了一个可以轻松读取的XML文件。如果是捷克ISD,所有附件都列在 <p:dmFiles> 元素。

    ...
    <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");
    }
    
        5
  •  0
  •   tlwhitec    6 年前

    openssl xmllint

    $ 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部分服务!