问题标签 [openmcdf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
821 浏览

c# - 使用 Outlook .OFT 文件修改文件附件流时出现问题

我正在尝试以编程方式替换 OFT 文件(Outlook 消息模板)中的嵌入图像,该文件采用复合文件二进制格式(因为使用任何人类可读的东西都会让我的生活变得太容易)。

为了处理这个文件,我使用了 OpenMCDF

由于嵌入的图像基本上是文件附件,我可以像这样获取图像的流:

然后,我可以使用所需图像中的字节更新该流,如下所示:

但是,当我在 Outlook 中加载 .OFT 文件时,图像不再加载,并且我得到一个红色 X 表示无法加载图像。我花了几个小时分析那个 OFT 文件的每一点,然后原始模板和新模板之间唯一改变的是我替换的一个流。

这就是事情变得奇怪的地方:

我注意到我可以用我以前拥有的完全相同的字节替换字节并保存它,所以我的保存机制正在工作。我想也许 OFT 模板存储了某种必须匹配的图像散列。所以我修改了一些随机字节,图像仍然加载(有时带有一些时髦的颜色)。最终,我意识到只有当新图像包含的字节数少于原始图像时,它才会中断。我可以用更大的图像替换图像,这很有效!我也可以在流的末尾用尾随零填充一个较小的图像,它仍然有效。

这让我想出了一个真正的黑客杰作:

基本上,如果img2太小,我会填充足够的字节以使其与原始图像大小相同(准确地说是 5585 字节)。所以这行得通。但是..是的。

我的问题:

Microsoft OFT 文件格式是否将附件的字节数存储在其他流或其他 CDF 容器中?如果这是 CDF 的标准属性,您会认为 OpenMCDF 会更新此计数。这让我相信这是 OFT 文件格式的一个属性,OpenMCDF 当然对此一无所知。

为什么写入较小的流会损坏文件,而写入较大的流可以工作?

更新:

从我目前所的内容来看,该__properties_version1.0流包含一个指针列表(偏移量?),以标记各种其他流的位置。我猜这里有些东西需要更新。目前,我在附件容器中有这些流:

在此处输入图像描述

据我所知__properties_version1.0,第一个附件(一个 36,463 字节的文件)和第二个附件(一个 5,585 字节的文件)之间几乎没有变化。第二__properties_version1.0个附件是:

在此处输入图像描述

这两个附件之间只有一组 8 个字节的变化。在附件 1 中,我们有:

6F 8E 00 00 03 00 2D 00

在附件 2(如上图)中,我们有:

D1 15 00 00 03 00 6F 08

这些是偏移量吗?似乎不是一个范围,否则数字会上升。这些数字也太大而不能成为文件大小。另外,无论如何在这里存储文件大小似乎是多余的。所以,我再次不知道为什么改变0x37010102流的大小会导致图像不再加载。

另一件零意义的事情。我可以使用更大或更小的文件更改第一个附件的大小,并且没有任何中断。但是,这两个容器中的任何流之间绝对没有区别,除了流中的数据0x37010102。为什么这种方法在一个附件中起作用,而在另一个附件中不起作用?

更新 2:

我注意到__properties_version1.0两个附件之间的流中的两个差异确实对应于文件大小:

6F 8E似乎是文件大小的小端表示,因为十进制的 8E6F 将是 36463,这是第一个附件中的字节数。十进制的 15D1 是 5585,即第二个附件的大小。所以,这个流肯定是存储文件大小。现在看看如果文件未损坏,我是否修复了这些字节。

更新 3:

因此,更改这些字节可以修复以前损坏的文件,这就是关键!现在只是想找到一种以编程方式执行此操作的方法。

0 投票
0 回答
382 浏览

ms-word - 如何使用 Open XML SDK 编辑粘贴的内容

我有一个自定义模板,我想在其中控制(尽我所能)文档中可以存在的内容类型。为此,我禁用了控件,并且还截取了粘贴以删除其中一些内容类型,例如图表。我知道这个内容也可以拖放,所以我稍后也会检查它,但我更愿意尽快停止或警告用户。

我尝试了一些策略:

  • RTF 操作
  • 打开 XML 操作

到目前为止,RTF 操作工作得相当好,但我真的更喜欢使用 Open XML,因为我希望它在未来会更有用。我就是无法让它工作。

开放式 XML 操作

奇妙的未记录(据我所知)“嵌入源”似乎包含一个复合文档对象,我可以使用它来修改使用 Open XML SDK 复制的内容。但是我无法将修改后的内容放回一个可以正确粘贴的对象中。

修改部分似乎工作正常。我可以看到,如果我将修改后的内容保存到一个临时的 .docx 文件中,那么更改是正确的。返回剪贴板似乎给我带来了麻烦。

我尝试只将 Embed Source 对象分配回剪贴板(以便清除 RTF 等其他类型),在这种情况下根本没有粘贴任何内容。我还尝试将 Embed Source 对象重新分配回剪贴板的数据对象,以便剩余的数据类型仍然存在(但可能内容不匹配),这会导致粘贴一个空的嵌入文档。

这是我使用 Open XML 所做的示例:

问题

我究竟做错了什么?这只是一种糟糕/不可行的方法吗?

0 投票
0 回答
598 浏览

java - 从 Outlook (Java) 解析 OLE 对象电子邮件附件

情况: 系统通过标准方法 (Pop3) 从邮件服务器获取电子邮件,并将它们作为多部分消息(*.eml 文件)发送到存档组件。

如果邮件是从 Outlook 发送的,它可能包含一个 OLE 对象,例如 MS Word、MS Excel 等。有几种方法可以包含这样的对象,例如通过菜单“插入->对象”

问题: 我们现在的要求是提取那些 OLE 对象,将它们归档为单独的附件。最好用 Java 或其他 JVM 语言来完成。其他语言和框架是可能的,但它们必须在不同的平台上工作(Win、Linux、Unix)

问题是我们没有在库中找到任何库或函数来执行此操作。

第一个问题是,接收者收到的消息取决于 Outlook 的配置方式:

  • 它可能会发送 RTF 消息:然后接收者收到带有附件“Untitled Attachment.bin”的消息
  • 它可能会发送 HTML 消息:然后接收者会收到包含附件“oledata.mso”的消息。

到目前为止我们所尝试的: 我们尝试了 Apache POI,尤其是 POIFS 来加载文件“oledata.mso”,但它抱怨某些标头值是错误的:

我们找到了一个谈论同样问题的网站。据我们了解,oledata.mso 是Compound File Binary Files的集合。这也应该可以单独用 POI 解析,因为 OpenMCDF 做的事情与 POI 相同。 在这个网站上,他们以某种方式将各个部分分开并单独解析。但是我们还没有找到类似的功能或任何规范如何做到这一点。

任何人都可以对此有所了解吗?

0 投票
1 回答
81 浏览

c# - 将 ole 文件另存为 office 文档

我在旧系统中有一些 ole2 格式的 ole 文件。我认为这些是 office word 或 excel & 嵌入对象(例如图片)。如果我用 docx 或 xlsx externsion 重命名文件,它会说文件已损坏。

我可以用一些现有的 C# 库提取 ole 文件吗?并将其保存为word或excel文档?

OLE文件结构 PNG

笔记:

更新:(可能的解决方案)

对于旧样式,例如 xls、doc,它只需将 ole 文件重命名为这些扩展名即可。但是有些文件无法通过 MS Office 打开,但通过 Libre Office 可以成功打开。

对于新样式,例如 xlsx、docx。它可以提取包流并保存为 xlsx 或 docx。文件。