Namazu-win32-users-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
どなたか Visio 用の Filter をテストして戴けないでしょうか
- From: fujiya-y@xxxxxxxxxxxxxxxxx
- Date: Sat, 20 Apr 2002 13:37:31 +0900
- X-ml-name: namazu-win32-users-ja
- X-mail-count: 01347
初投稿の藤山と申します
仕事上の検索システム検討の為、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;