Namazu-devel-ja(旧)


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

PDF ファイルの Title 取得



ほしのです。

 以前、namazu-users-jaで話題に挙がっていた

http://www.namazu.org/ml/namazu-users-ja/msg00979.html
Subject: [namazu-users-ja] namazu での PDF 検索について
Message-Id: <200009290248.AA02158@xxxxxxxxxxxxxxxxxxxxxxx>
X-ML-Name: namazu-users-ja
X-Mail-Count: 00980

この話題ですが、以下のようなもので対応してみたのですが、実
現の仕方に問題があるかも知れないので、アドバイスをいただき
たいのです。

手元にMS-Word->PDF変換されたものしか無いため、本当にこの方
法で良いのか解らないのですが・・・。

よろしくお願いします。


--- pdf.pl.org	Tue Oct 24 18:04:51 2000
+++ pdf.pl	Sun Nov 26 00:54:07 2000
@@ -29,6 +29,7 @@
 require 'gfilter.pl';
 
 my $pdfconvpath = undef;
+my $pdfinfopath = undef;
 
 sub mediatype() {
     return ('application/pdf');
@@ -36,8 +37,13 @@
 
 sub status() {
     $pdfconvpath = util::checkcmd('pdftotext');
-    return 'yes' if (defined $pdfconvpath);
-    return 'no';
+    if (defined $pdfconvpath) {
+        $pdfinfopath = util::checkcmd('pdfinfo');
+        return 'yes' if (defined $pdfinfopath);
+        return 'no';
+    } else {
+        return 'no';
+    }
 }
 
 sub recursive() {
@@ -61,15 +67,25 @@
       = @_;
     my $cfile = defined $orig_cfile ? $$orig_cfile : '';
 
+    my $info = '';
+
     my $tmpfile = util::tmpnam('NMZ.pdf');
     my $tmpfile2 = util::tmpnam('NMZ.pdf2');
+    my $tmpfile3 = util::tmpnam('NMZ.pdf3');
 
     my $fh = util::efopen("> $tmpfile");
     print $fh $$cont;
     undef $fh;
 
+    system("$pdfinfopath $tmpfile > $tmpfile3");
+    $fh = util::efopen("< $tmpfile3");
+    $info = util::readfile($fh);
+    undef $fh;
+    unlink $tmpfile3;
+
     if (util::islang("ja")) {
 	util::vprint("Processing pdf file ... (using  '$pdfconvpath' in Japanese mode)\n");
+	codeconv::toeuc(\$info);
 	system("$pdfconvpath -q -eucjp $tmpfile $tmpfile2");
     } else {
 	util::vprint("Processing pdf file ... (using  '$pdfconvpath')\n");
@@ -87,11 +103,46 @@
     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'};
+    get_title($info, $fields, $cfile, $weighted_str);
+    get_author($info, $fields);
     gfilter::show_filter_debug_info($cont, $weighted_str,
 			   $fields, $headings);
     return undef;
+}
+
+sub get_title ($$$$) {
+
+    my ($info, $fields, $cfile, $weighted_str) = @_;
+
+    my (@item) = split(/\n/,$info);
+
+    foreach (@item) {
+	if ($_ =~ /^Title:\s+(.*)/) {
+	    if ($1 !~ /^$/) {
+               	$fields->{'title'} = $1;
+	    } else {
+		$fields->{'title'} = gfilter::filename_to_title($cfile, $weighted_str)
+		unless $fields->{'title'};
+	    }
+	}
+    }
+
+}
+
+sub get_author ($$) {
+
+    my ($info, $fields) = @_;
+
+    my (@item) = split(/\n/,$info);
+
+    foreach (@item) {
+	if ($_ =~ /^Author:\s+(.*)/) {
+	    if ($1 !~ /^$/) {
+               	$fields->{'author'} = $1;
+	    }
+	}
+    }
+
 }
 
 1;

------
Hisashi Hoshino
mailto:panda@xxxxxxxxxxxx