Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Office系フィルタでwvSummary を利用してみては? (Re:macbinary.pl)
寺西です。
Tadamasa Teranishi wrote:
>
> word7 形式のファイルを wvWare で処理すると、3つの漢字コード(?)が
> 混在する HTML ファイルが出力されます。
...
> wvWare の古いバージョンは無視するとして、だいたい 0.7 以上なら
> --charset をサポートしているはずなので、--charset=sjis で
> ShiftJIS 出力にして 2,3 の漢字コードを統一し、TITEL 文字を
> 削除するという処理を word7 形式に対して行えば、良いように思います。
日本語版 word7 形式の場合は、上記の処理を加えるようにしました。
日本語版 word7 形式を処理するには wvWare 0.7 以上が必須になります。
最後に HEAD 用の差分をしめします。
# wvSummary がパス上になくても動作はします。
> > excelやpowerpointをインデックスしなければいけない人はmswordの
> > インデックスも作る人でしょうからwvSummaryが使えるようになっている
> > 可能性は高いだろうと思います。
wvSummary で情報を取り出す部分にバグがあったので、修正しました。
主な修正内容は以下の通りです。
・Codepage を考慮しておらず、UTF-8 の場合、文字化けを起こして
いました。(このため utf8_to_eucjp() を作成。やや強引ですが)
・html::html_filter() で、title が上書きされるバグを修正しました。
・author が上書きされるバグを修正しました。
・last author を author より優先するようにしました。
$ cvs diff msword.pl
Index: msword.pl
===================================================================
RCS file: /storage/cvsroot/namazu/filter/msword.pl,v
retrieving revision 1.37
diff -r1.37 msword.pl
36a37
> my $wvsummarypath = undef;
42a44,45
> $wvsummarypath = util::checkcmd('wvSummary');
>
96a100
> my $docversion = "unknown";
106c110,114
< # Check version of word document (greater than word8 or else).
---
> # get summary info in all OLE documents.
> getSummaryInfo($tmpfile, $cont, $weighted_str, $headings, $fields);
> my $title = $fields->{'title'};
>
> # Check version of word document (greater than word7,8 or else).
108d115
< my $docversion = "unknown";
115,116c122,123
< # Only word8 format is supported for Japanese.
< $supported = 1 if ($docversion =~ /^word8$/);
---
> # Only word7,8 format is supported for Japanese.
> $supported = 1 if ($docversion =~ /^word[78]$/);
132a140,142
> if (util::islang("ja") && $docversion =~ /^word7$/) {
> @wordconvopts = ("--targetdir=$tpath", "--charset=sjis");
> }
133a144,148
> if (util::islang("ja")) {
> return _("Unsupported format: ") . $docversion
> if ($docversion =~ /^word7$/);
> }
>
149c164,169
< my @cmd = ($utfconvpath, "-Iu8", "-Oej", $tmpfile2);
---
> my @cmd;
> if ($docversion =~ /^word7$/) {
> @cmd = ($utfconvpath, "-Isj", "-Oej", $tmpfile2);
> } else {
> @cmd = ($utfconvpath, "-Iu8", "-Oej", $tmpfile2);
> }
164a185,188
> # word7 : Title shoud be removed.
> $$cont =~ s!<TITLE>.*?</TITLE>!!is
> if (util::islang("ja") && $docversion =~ /^word7$/);
>
168a193
> $fields->{'title'} = $title if (defined $title);
212a238,348
>
> return undef;
> }
>
> sub getSummaryInfo ($$$$$) {
> my ($cfile, $cont, $weighted_str, $headings, $fields)
> = @_;
>
> return undef unless (defined $wvsummarypath);
>
> my @cmd = ($wvsummarypath, $cfile);
> my ($status, $fh_out, $fh_err) = util::systemcmd(@cmd);
> my $summary = util::readfile($fh_out);
> my $orgsummary = $summary;
>
> my $size = util::filesize($fh_out);
> $fh_out->close();
> if ($size == 0) {
> return undef;
> }
> if ($size > $conf::TEXT_SIZE_MAX) {
> return 'Too large word file';
> }
>
> # Codepage
> # 932 : 0x000003a4 : Shift_JIS
> # 10001 : 0xfffffde9 : x-mac-japanese
> # 65001 : 0x00002711 : UTF-8
>
> my $codepage = "000003a4"; # Shift_JIS
> my $title = undef;
> my $subject = undef;
> my $lastauthor = undef;
> my $author = undef;
> my $keywords = undef;
>
> if ($summary =~ /^Codepage is 0x([0-9a-f]*)/m) {
> $codepage = sprintf("%8.8x", hex($1));
> }
>
> if ($codepage eq "fffffde9") {
> utf8_to_eucjp(\$summary);
> }
> else {
> codeconv::toeuc(\$summary);
> }
>
> if ($summary =~ /^The title is (.*)$/m) {
> my $orgtitle;
>
> $title = $1;
>
> # PowerPoint Only
> # $orgsummary =~ /^The title is (.*)$/m;
> # $orgtitle = $1;
> # undef $title if $orgtitle eq # which has no slide title
> # "\xbd\xd7\xb2\xc4\xde\x20\xc0\xb2\xc4\xd9\x82\xc8\x82\xb5";
> }
> if ($summary =~ /^The subject is (.*)$/m) {
> $subject = $1;
> }
> if ($summary =~ /^The last author was (.*)$/m) {
> $lastauthor = $1;
> }
> if ($summary =~ /^The author is (.*)$/m) {
> $author = $1;
> }
> if ($summary =~ /^The keywords are (.*)$/m) {
> $keywords = $1;
> }
>
> my $weight = $conf::Weight{'html'}->{'title'};
> if (defined $title) {
> $$weighted_str .= "\x7f$weight\x7f$title\x7f/$weight\x7f\n";
> }
> if (defined $subject) {
> $$weighted_str .= "\x7f$weight\x7f$subject\x7f/$weight\x7f\n";
> }
>
> $fields->{'title'} = $title;
> $fields->{'title'} = $subject unless (defined $title);
>
> $fields->{'author'} = $lastauthor;
> $fields->{'author'} = $author unless (defined $lastauthor);
>
> if (defined $keywords) {
> $weight = $conf::Weight{'metakey'};
> $$weighted_str .= "\x7f$weight\x7f$keywords\x7f/$weight\x7f\n";
> }
>
> return undef;
> }
>
> sub utf8_to_eucjp($) {
> my ($cont) = @_;
>
> return undef unless (defined $utfconvpath);
> return undef unless (util::islang("ja"));
>
> my $tmpfile = util::tmpnam('NMZ.tmp.utf8');
> {
> my $fh = util::efopen("> $tmpfile");
> print $fh $$cont;
> }
>
> my @cmd = ($utfconvpath, "-Iu8", "-Oej", $tmpfile);
> my ($status, $fh_out, $fh_err) = util::systemcmd(@cmd);
> $$cont = util::readfile($fh_out);
> codeconv::normalize_eucjp($cont);
>
> unlink $tmpfile;
--
=====================================================================
寺西 忠勝(TADAMASA TERANISHI) yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint = 474E 4D93 8E97 11F6 662D 8A42 17F5 52F4 10E7 D14E