在 perl 中将 Outlook htmlrtf 转换为 html

Posted

技术标签:

【中文标题】在 perl 中将 Outlook htmlrtf 转换为 html【英文标题】:Convert Outlook htmlrtf to html in perl 【发布时间】:2021-09-05 19:43:46 【问题描述】:

我设法使用Email::Outlook::Message 从 Outlook .msg 中提取了 RTF 部分。下面是它的外观:

\*\htmltag84 <b>\htmlrtf \b \htmlrtf0
\*\htmltag148 <span lang="EN-US" style="font-size:12.0pt;color:#002060;mso-fareast-language:EN-IN">\htmlrtf \lang1033 \htmlrtf0 FooBar
\*\htmltag156 </span>\htmlrtf \htmlrtf0 
\*\htmltag92 </b>\htmlrtf \htmlrtf0

当 Outlooks 发送 Internet 邮件时,它会将 RTF 转换为 text/html:

<b><span style="font-size:12.0pt;color:#002060;mso-fareast-language:EN-IN">FooBar</span></b>

我正在尝试使用RTF::HTML::Converter 做同样的事情,但它会剥离所有样式:

<b>FooBar</b>

这是脚本:

use strict;
use RTF::HTML::Converter;
my $object = RTF::HTML::Converter->new(
        output => \*STDOUT
);
local *RTF_FILE;
open RTF_FILE, "$ARGV[0]" or die $!;
$object->parse_stream( \*RTF_FILE );

我还尝试了unrtf 工具。它还剥离了样式:

<font face="Arial"><font size="3"><b>FooBar</b></font></font>

【问题讨论】:

【参考方案1】:

在您的示例中,rtf 控制字看起来是多余的,并由\htmlrtf \htmlrtf0 包装。您的用例完全剥离它们并仅使用 html 标记可能就足够了。 (如果您有更高级的格式或嵌入图像等,这种幼稚的方法可能会失败。)

use strict;
use warnings;


while (my $line = <>)
    $line =~ s|\\htmlrtf.*?\\htmlrtf0||;
    $line =~ s|\\\*\\htmltag\d+([^]*)|$1|;
    print $line;

perl test.pl test.rtf
 <b>
 <span lang="EN-US" style="font-size:12.0pt;color:#002060;mso-fareast-language:EN-IN"> FooBar
 </span> 
 </b>

【讨论】:

【参考方案2】:

您需要解析 RTF 以提取 HTML,我不知道有任何库可以这样做。

如果使用Redemption 是一个选项,它会暴露RDOSession.GetMessageFromMsgFile,它会返回RDOMail 对象——你可以阅读它的HTMLBody 属性;它会为你从 RTF 中提取 HTML。

【讨论】:

以上是关于在 perl 中将 Outlook htmlrtf 转换为 html的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Visual Studio 中将 Outlook 项目保存为 pdf?

MailChimp 只是,总是将“颜色:继承!重要”放在链接上,在 Outlook 中将它们变成蓝色

如何在 Perl 中将日期转换为纪元时间?

如何在 Perl 中将命令行参数视为 UTF-8?

在 Perl 脚本中将电子表格文件读入数据库

在 Perl 中将纪元时间转换为标准约定的问题