Namazu-win32-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

どなたか Visio 用の Filter をテストして戴けないでしょうか



初投稿の藤山と申します

仕事上の検索システム検討の為、namazuをローカル上で
使わせて戴いていましたが、どうしてもMS Visioの
Filterが欲しくなり、Word、Excle、PowerPointのFilterを
参考に試行錯誤していました。
しかし、以下の問題があり停滞しているところ、小嶋さんの
投稿に触発され、皆さんにテストしてもらえないかと思い、
投稿させて戴きました。Perl初心者で下手なソースです。
現状の問題
1.Visioのドキュメントの状態によっては、停止してしまう。
  (特にOKだけのダイアログで、AlertResponseをOKに変えれば
   逃げられるのですが、何が出るか分からないので怖い)
2.Openした時にVisioのタイトル?が毎回表示
3.毎回Visioを停止しないと安定性ママイチ(BIGINとENDの
  コメント外し、ReadVSDの下をコメントで高速化します)
4.Visio2000しかテストしていない(2002持ってないので
  してません。5はVisibleが使えないので外せば動くかも?)

尚、試行の環境は以下で行なっています
システム: MSWin32(NT4+SP6a)
Namazu: 2.0.10
Perl: 5.006001
NKF: module_nkf
メッセージの言語: ja_JP.SJIS
言語: ja_JP.SJIS
文字コード: sjis
対応メディアタイプ:
 (中略)
  application/visio

------------------------------------------------------------------
#
# -*- Perl -*-
# $Id: olevisio.pl,v 0.01 2002/02/25 21:00:00 Y.Fujiyama Exp $
#                  v 0.10 2002/03/30 12:00:00 Y.Fujiyama BugFix
#                  v 0.10 2002/04/05 12:00:00 Y.Fujiyama Bigin Block Test

package olevisio;
#use strict;
require 'util.pl';
require 'gfilter.pl';
use Win32::OLE;
use Win32::OLE::Enum;
use Win32::OLE::Const;


#BEGIN {
#
#    my $vsd;
#    eval {$vsd = Win32::OLE->GetActiveObject('Visio.Application')};
#    die "Visio not installed" if $@;
#    unless (defined $vsd) {
#        $vsd = Win32::OLE->new('Visio.Application', sub {$_[0]->Quit;})
#            or die "Oops, cannot start Visio";
#    }
#
#    #Visible VisioWindow
#
#    $Win32::OLE::Warn = 0;
#    $vsd->{Visible} = 0;    #After Visio2000 Use Only
#    $vsd->{AlertResponse} = 2;
#
#    #Dumy ioNewDocument
#    $vsd->Documents->Add("");
#}

END {
#    eval {$vsd = Win32::OLE->GetActiveObject('Visio.Application')};
#    die "Visio not installed" if $@;
#    unless (defined $vsd) {
#        $vsd = Win32::OLE->new('Visio.Application', sub {$_[0]->Quit;})
#            or die "Oops, cannot start Visio";
#    }
    if (defined $vsd) {
        util::vprint("Visio->Quit\n");
        $vsd->Quit;
        undef $vsd;
    }
}

sub mediatype() {
    return ('application/visio');
}

sub status() {
    open (SAVEERR,">&STDERR");
    open (STDERR,">nul");
    my $const;
    $const = Win32::OLE::Const->Load("Visio 2000 Type Library*");
#    $const = Win32::OLE::Const->Load("Visio 5.0 Type Library*") unless $const;
#    $const = Win32::OLE::Const->Load("Visio 4.1 Type Library*") unless $const;
    open (STDERR,">&SAVEERR");
    return 'yes' if (defined $const);
    return 'no';
}

sub recursive() {
    return 0;
}

sub pre_codeconv() {
    return 0;
}

sub post_codeconv () {
    return 1;
}

sub add_magic ($) {
    my ($magic) = @_;

    $magic->addFileExts('\\.vsd$', 'application/visio');
    return;
}

sub filter ($$$$$) {
    my ($orig_cfile, $cont, $weighted_str, $headings, $fields) = @_;

    my $cfile = defined $orig_cfile ? $$orig_cfile : '';

    util::vprint("Processing visio file ... (using  'Win32::OLE->new Visio.Application')\n");

    $cfile =~ s/\//\\/g;
    $$cont = "";
    ReadVSD::ReadVSD($cfile, $cont, $fields);
    $cfile = defined $orig_cfile ? $$orig_cfile : '';

    gfilter::line_adjust_filter($cont);
#    gfilter::line_adjust_filter($weighted_str);
    gfilter::white_space_adjust_filter($cont);
    $fields->{'title'} = gfilter::filename_to_title($cfile, $weighted_str)
        unless $fields->{'title'};
    gfilter::show_filter_debug_info($cont, $weighted_str, $fields, $headings);

    return undef;
}


sub enum ($$$) {
    my ($enum_objs, $func, $cont) = @_;

    die "No Objects or No Function" unless ($enum_objs and $func );

    my $e = Win32::OLE::Enum->new($enum_objs);
    while(($obj = $e->Next)) {
        return 0 if (!&$func($obj, $cont));
    }
    return 1;
}

sub getProperties ($$) {
    my ($cfile, $fields) = @_;


    my $title = $cfile->Title;
    util::vprint("Title .. $title\n");
    $title = $cfile->Subject
        unless (defined $title);
    util::vprint("SubjectTitle .. $title\n");
    $fields->{'title'} = codeconv::shiftjis_to_eucjp($title)
        if (defined $title);

    my $author = $cfile->Creator;
    util::vprint("Creator .. $author\n");
    $author = $cfile->Application->{UserName}
        unless (defined $author);
    $fields->{'author'} = codeconv::shiftjis_to_eucjp($author)
        if (defined $author);


    return undef;
}

package ReadVSD;

sub ReadVSD ($$$) {
    my ($cfile, $cont, $fields) = @_;

    my $vsd;
    eval {$vsd = Win32::OLE->GetActiveObject('Visio.Application')};
    die "Visio not installed" if $@;
    unless (defined $vsd) {
        $vsd = Win32::OLE->new('Visio.Application', sub {$_[0]->Quit;})
            or die "Oops, cannot start Visio";
    }

    #Visible VisioWindow

    $Win32::OLE::Warn = 0;
    $vsd->{Visible} = 0;    #After Visio2000 Use Only
    $vsd->{AlertResponse} = 2;

    # Redirect stderr to null device, to ignore Error and Exception message.
    open (SAVEERR,">&STDERR");
    open (STDERR,">nul");

    # Load Office 97/98/2000 Constant
    my $office_consts;
    $office_consts = Win32::OLE::Const->Load("Visio 2000 Type Library*");
#    $const = Win32::OLE::Const->Load("Visio 5.0 Type Library*") unless $const;
#    $const = Win32::OLE::Const->Load("Visio 4.1 Type Library*") unless $const;

    open (STDERR,">&SAVEERR");

    my $vdoc = $vsd->Documents->OpenEx({
        'FileName' => $cfile,
        'Flags'=> 11        #OpenEx Flags ( 1:OpenCopy + 2:ReadOnly + 8:DontList      + 16:OpenMinimized???  )
        });
    die "Cannot open File $cfile" unless (defined $vdoc);

    olevisio::getProperties($vdoc, $fields);

    my $vpage = $vdoc->Pages;
    my $vpagcnt = $vpage->{Count};

    for ( my $vpageno = 1; $vpageno <= $vpagcnt; $vpageno++ ){
        my $pagename = $vpage->Item($vpageno)->{Name};
        util::vprint("Page .. $pagename\n");
        chomp($pagename);
        $$cont .= "$pagename\n" if (defined $pagename);
        my $vshapecnt = $vpage->Item($vpageno)->Shapes->{Count};
        for (my $vshapeno = 1; $vshapeno <= $vshapecnt; $vshapeno++ ){
            if ($vpage->Item($vpageno)->Shapes->Item($vshapeno)->{CharCount} > 0 ){
                my $shapetext = $vpage->Item($vpageno)->Shapes->Item($vshapeno)->Characters->{TextAsString};
                chomp($shapetext);
                $$cont .= "$shapetext\n" if (defined $shapetext);
            }
        }
        undef $vshapeno;
    }
    undef $vpageno;
    undef $vpagcnt;

    $vdoc->close();
    undef $vdoc;

#    When You Use BIGIN Block , Comment Out 3 Line.
    util::vprint("Visio->Quit\n");
    $vsd->Quit;
    undef $vsd;

    return undef;
}


#main
#use Cwd;
#$ARGV[0] = cwd().'\\'.$ARGV[0] unless ($ARGV[0] =~ m/^[a-zA-Z]\:[\\\/]/ || $ARGV[0] =~ m/^\/\//);
#$ARGV[0] =~ s|/|\\|g;

#print ReadVSD::ReadVSD("$ARGV[0]");

1;