如何从 ZFO 中提取附件?

发布于 2024-08-07 17:16:28 字数 69 浏览 3 评论 0原文

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

谢谢

Does anyone know how to extract the attachments from a .zfo file (602 form filler). Its a format based on openXML.

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

×眷恋的温暖 2024-08-14 17:16:28

根据我的经验,.zfo 消息只是签名的 XML 文件(CMS/PKCS #7 标准)。您所需要做的就是删除加密信封,这将为您提供一个可以轻松读取的 XML 文件。对于捷克 ISDS,所有附件均列在 元素中。

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");
}

In my experience .zfo messages are just signed XML files (CMS/PKCS #7 standard). All you need to do is to remove the encrypted envelope, which gives you a XML file that you can easily read. In case of Czech ISDS all attachments are listed in a <p:dmFiles> element.

XML example:

...
<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>

You can reach the content elements using C# like this:

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");
}
空心↖ 2024-08-14 17:16:28

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

I don't know about this format, but since you said "OpenXML", you probably just need to open it and decode base64 data;

芯好空 2024-08-14 17:16:28

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

According my research it's zipped .fo file.
If you rename .zfo to .zip, you'll be able to open it with usual archiver and you find there .fo file which is in xml format you can view with any text editor.

笔芯 2024-08-14 17:16:28

在 Linux

ZFO 上 -> XML中的XML

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

位于元素

<p:dmFiles>

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

on linux

ZFO -> XML

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

in XML are in element

<p:dmFiles>

attachements data (file name, file type, data)

巷子口的你 2024-08-14 17:16:28

以下 (happy-path) bash 脚本应该足够了。它使用 opensslxsltprocbase64,这些都是大多数 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 部分!

The following (happy-path) bash script should be enough. It uses openssl, xsltproc and base64, all a very commonly available tools in most Linux distros. See my GitHub for a more robust version.

$ 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"

Usage:

$ ./extract-zfo.sh a-file.zfo

Kudos to @knedle for the openssl part!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文