使用perl实现RTF到文本的转换

使用perl实现RTF到文本的转换,perl,text,rtf,perl-module,Perl,Text,Rtf,Perl Module,有人能告诉我如何使用perl编程语言将rtf文件转换成包含所有标记、表格和格式化数据的文本吗 @Ahmad Bilal,@petersergeant:我一直在使用下面的代码进行RTF到TXT的转换,并且我能够转换成文本。但问题是我无法捕获表格或图像格式,甚至输入文件中的所有实体也无法使用该程序捕获 use 5.8.0; use strict; use warnings; use Getopt::Long; use Pod::Usage; use RTF::HTMLConverter; #---

有人能告诉我如何使用perl编程语言将rtf文件转换成包含所有标记、表格和格式化数据的文本吗

@Ahmad Bilal,@petersergeant:我一直在使用下面的代码进行RTF到TXT的转换,并且我能够转换成文本。但问题是我无法捕获表格或图像格式,甚至输入文件中的所有实体也无法使用该程序捕获

use 5.8.0;
use strict;
use warnings;
use Getopt::Long;
use Pod::Usage;
use RTF::HTMLConverter;

#-------------------------------------------------------------------
#Variable Declarions
#-------------------------------------------------------------------
my $tempfile = "";
my $Outfile = "";
my $txtfile = "";
my $URL = "";
my $Format = "";
my $TreeBuilder = "";
my $Parsed = "";
my $line = "";


my %opts;
GetOptions(
  "help|h|?"     => \$opts{help},
  "man|m"        => \$opts{man},
  "dom=s"        => \$opts{dom},
  "noimages|n"   => \$opts{noimages},
  "imagedir|d=s" => \$opts{imagedir},
  "imageuri|u=s" => \$opts{imageuri},
  "encoding|e=s" => \$opts{encoding},
  "indented|i=i" => \$opts{indented},
);

pod2usage(-verbose => 1, -exitval => 0) if $opts{help};
pod2usage(-verbose => 2, -exitval => 0) if $opts{man};

my %params;
if($opts{dom}){
  eval "require $opts{dom}";
  die $@ if $@;
  $params{DOMImplementation} = $opts{dom};
}else{
  eval { require XML::GDOME };
  if($@){
    eval { require XML::DOM };
    die "Can't load either XML::GDOME or XML::DOM\n" if $@;
    $params{DOMImplementation} = 'XML::DOM';
  }
}

if($opts{noimages}){
  $params{discard_images} = 1;
}else{
  $params{image_dir} = $opts{imagedir} if defined $opts{imagedir};
  $params{image_uri} = $opts{imageuri} if defined $opts{imageuri};
}

$params{codepage} = $opts{encoding} if $opts{encoding};
$params{formatting} = $opts{indented} if defined $opts{indented};

#-----------------------------------------------
# Converting RTF to HTML
#-----------------------------------------------

if(defined $ARGV[0]){
  open(FR, "< $ARGV[0]") or die "Can't open '$ARGV[0]': $!!\n";
    $params{in} = \*FR;
    $tempfile = $ARGV[0];
    $tempfile =~ /^(.*?)rtf/;
    $Outfile = $1."html";
    $txtfile = $1."txt";

  open(FW, "> $Outfile") or die "Can't open '$Outfile': $!!\n";
   $params{out} = \*FW;
   print "\n$Outfile - HTML Created\n"

}

my $parser = RTF::HTMLConverter->new(%params);
$parser->parse();


close FW;

#-----------------------------------------------
# Opening HTML and TXT files
#-----------------------------------------------

open (FILE1, ">$txtfile") or die "Can't open '$txtfile': $!!\n";
open (FILE2, "$Outfile") or die "Can't open '$Outfile': $!!\n";

#-----------------------------------------------
# Converting HTML to TXT file
#-----------------------------------------------

local $/ = undef;
while ($line = <FILE2>) {
    $line =~ s/\n//g;
    $line =~ s/(<!DOCTYPE HTML.*><html><head>.*<\/style>)/<sectd>/;
    $line =~ s/<font.*?>//g;
    $line =~ s/<\/font>//g;
    $line =~ s/<table .*?>/\n<table>\n/g;
    $line =~ s/<\/table>/\n<\/table>/g;
    $line =~ s/<td .*?>/\n<td>/g;
    $line =~ s/<tr>/\n<tr>/g;
    $line =~ s/<\/tr>/\n<\/tr>/g;
    $line =~ s/<ul.*?>/\n<ul>/g;
    $line =~ s/<li.*?>/\n<li>/g;
    $line =~ s/<\/ul>/\n<\/ul>/g;
    $line =~ s/<\/body><\/html>//g;
    $line =~ s/<p.*?>/\n<p>/g;
    $line =~ s/<p>(&nbsp;|\*|\s)+<\/p>//g;
    $line =~ s/&nbsp;//g;
  $line =~ s/(<sectd>\n?.*?)<\/head><body>/$1/g;

#-------------------
#  Entity Conversion
#-------------------
  $line =~ s/&rsquo;/&#x2018;/g;
  $line =~ s/“/&#x201C;/g;
  $line =~ s/”/&#x201D;/g;
  $line =~ s/¶/&para;/g;

    print FILE1 $line;
}

print "$txtfile - TXT file Created \n";

close FILE1;
close FILE2;

unlink ("$Outfile");
使用5.8.0;
严格使用;
使用警告;
使用Getopt::Long;
使用Pod::用法;
使用RTF::HTMLConverter;
#-------------------------------------------------------------------
#可变偏角
#-------------------------------------------------------------------
我的$tempfile=“”;
我的$Outfile=“”;
我的$txtfile=“”;
我的$URL=“”;
我的$Format=“”;
我的$TreeBuilder=“”;
我的$Parsed=“”;
我的$line=“”;
我的%opts;
获取选项(
“help | h |?”=>\$opts{help},
“man | m”=>\$opts{man},
“dom=s”=>\$opts{dom},
“noimages | n”=>\$opts{noimages},
“imagedir | d=s”=>\$opts{imagedir},
“imageuri | u=s”=>\$opts{imageuri},
“encoding | e=s”=>\$opts{encoding},
“缩进| i=i”=>\$opts{indented},
);
pod2usage(-verbose=>1,-exitval=>0)如果$opts{help};
如果$opts{man},则pod2usage(-verbose=>2,-exitval=>0);
我的%params;
if($opts{dom}){
eval“需要$opts{dom}”;
死亡$@如果$@;
$params{DOMImplementation}=$opts{dom};
}否则{
eval{requirexml::GDOME};
如果($@){
eval{requirexml::DOM};
如果$@,则die“无法加载XML::GDOME或XML::DOM\n”;
$params{dominimplementation}='XML::DOM';
}
}
如果($opts{noimages}){
$params{discard_images}=1;
}否则{
$params{image_dir}=$opts{imagedir}(如果定义为$opts{imagedir});
$params{image_uri}=$opts{imageuri}(如果定义为$opts{imageuri});
}
$params{codepage}=$opts{encoding}如果$opts{encoding};
$params{formatting}=$opts{indented}(如果定义为$opts{indented});
#-----------------------------------------------
#将RTF转换为HTML
#-----------------------------------------------
如果(定义为$ARGV[0]){
打开(FR“<$ARGV[0]”)或死亡“无法打开“$ARGV[0]”:$!!\n”;
$params{in}=\*FR;
$tempfile=$ARGV[0];
$tempfile=~/^(.*)rtf/;
$Outfile=$1.“html”;
$txtfile=$1.“txt”;
打开(FW,“>$Outfile”)或死亡“无法打开“$Outfile”:$!!\n”;
$params{out}=\*FW;
打印“\n$Outfile-已创建HTML\n”
}
my$parser=RTF::HTMLConverter->new(%params);
$parser->parse();
关闭FW;
#-----------------------------------------------
#打开HTML和TXT文件
#-----------------------------------------------
打开(文件1,“>$txtfile”)或死亡“无法打开“$txtfile”:$!!\n”;
打开(文件2,“$Outfile”)或死亡“无法打开“$Outfile”:$!!\n”;
#-----------------------------------------------
#将HTML转换为TXT文件
#-----------------------------------------------
本地$/=undef;
而($line=){
$line=~s/\n//g;
$line=~s/(.*)/;
$line=~s///g;
$line=~s///g;
$line=~s/\n\n/g;
$line=~s/\n/g;
$line=~s/\n/g;
$line=~s/\n/g;
$line=~s/\n/g;
$line=~s/\n
    /g; $line=~s/\n
  • /g; $line=~s/\n/g; $line=~s///g; $line=~s/\n/g; $line=~s/(|\*\s)+//g; $line=~s///g; $line=~s/(\n?*?)/$1/g; #------------------- #实体转换 #------------------- $line=~s/&x2018;/g; $line=~s/“/“;/g; $line=~s/“/”;/g; $line=~s/`s/¶;/g; 打印文件1$行; } 打印“$txtfile-已创建的TXT文件\n”; 关闭文件1; 关闭文件2; 取消链接(“$Outfile”);
您需要使用如下模块:


您需要使用如下模块:


我是链接模块的作者。不要用它。如果可能的话,请使用真正的RTF到文本转换器,如Pandoc。

我是链接模块的作者。不要用它。如果可能的话,请使用真正的RTF-to-text转换器,如Pandoc。

它不会给出RTF-to-text的完整概念。你能给我更详细的解释吗?从cpan(谷歌如何)安装模块。在脚本中添加“use RTF::TEXT::Converter;”行,并将RTF文件声明为字符串($name=“../path/file”,并遵循该页所述的语法。RTF::Parser的文档将其描述为“一个不推荐使用的事件驱动RTF解析器”。因此,这可能不是最好的建议:-/它不会给出RTF到文本的完整概念。你能给我更详细的解释吗?从cpan(google how)安装模块。在脚本中添加“use RTF::text::Converter;”行,并将RTF文件声明为字符串($name='../path/file',并遵循该页所述的语法。RTF::Parser的文档将其描述为“一个不推荐使用的事件驱动RTF解析器”。因此,可能不是推荐的最佳选项:-/Pandoc没有-f读取器(截至2014.12年2月1日)。它将编写rtf,但要求的是rtf->格式化文本。理论上,在未来的某个时候,Pandoc将是正确的答案;唉,时间还没有…:(@petersergeant,我知道你也是:你仍然(2020)建议我们不要将这些工具用于rtf->TXT转换吗?Pandoc没有-f阅读器(截至2014.12.1.13.02)。它将编写rtf,但要求的是rtf->格式化文本。理论上,在未来的某个时候,Pandoc将是正确的答案;唉,时间还没有到……:(@petersergeant,我知道你也是:你(2020)仍然建议我们不要将这些工具用于rtf->TXT转换吗?