使用perl实现RTF到文本的转换
有人能告诉我如何使用perl编程语言将rtf文件转换成包含所有标记、表格和格式化数据的文本吗 @Ahmad Bilal,@petersergeant:我一直在使用下面的代码进行RTF到TXT的转换,并且我能够转换成文本。但问题是我无法捕获表格或图像格式,甚至输入文件中的所有实体也无法使用该程序捕获使用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; #---
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>( |\*|\s)+<\/p>//g;
$line =~ s/ //g;
$line =~ s/(<sectd>\n?.*?)<\/head><body>/$1/g;
#-------------------
# Entity Conversion
#-------------------
$line =~ s/’/‘/g;
$line =~ s/“/“/g;
$line =~ s/”/”/g;
$line =~ s/¶/¶/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转换吗?