Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
 PDF ファイルをページごとに分割
- From: OKANO Osamu <osamu2001@xxxxxxxxxxxx>
- Date: Sun, 09 Sep 2001 17:47:15 +0900
- X-ml-name: namazu-devel-ja
- X-mail-count: 01951
岡埜です
自分が必要になったのでpdfsplit.plを実装しました。
必要なオプションは--pdf-splitと-Uです
登録される文書情報がほとんど空っぽです。
当然pdftotextも使えなければいけません。
htmlsplitと同じで直接フィルタを使用しない実装に
なってしまいました。
拡張子がpdfなのに実際はPDFじゃないファイルのことについては
まったく考えていません。(注意!)
文書のページ数が1ページ多くなりますが検索結果には影響は
ないと思います。
基本的なやり方はhtmlsplitそのままで修正点も
(htmlsplitの実装がわかっていれば)わかりやすいと思います。
conf.pl:
$HTML_SUFFIX = "html?|[ps]html|html\\.[a-z]{2}";
$PDF_SUFFIX = "pdf|PDF";
mknmz:
sub postload_modules () {
    require "htmlsplit.pl" || die "unable to require \"htmlsplit.pl\"\n";
    require "pdfsplit.pl" || die "unable to require \"pdfsplit.pl\"\n";
}
muda($conf::ON_MEMORY_MAX,
省略
     $var::Opt{'noencodeurl'}, $conf::HTML_SUFFIX,$conf::PDF_SUFFIX,
省略
     );
var.pl:97
$Opt{'htmlsplit'} = 0;
$Opt{'pdfsplit'} = 0;
pdfsplit.pl(htmlsplit.plの修正)
package pdfsplit;
require "util.pl";
use strict;
sub split ($$){
  my ($fname, $base) = @_;
  my $mtime = (stat($fname))[9];
  my %info = (
    'title'    => "",
    'author'   => "",
    'anchored' => "",
    'name'     => "",
    'base'     => $base,
    'names'    => [],
  );
  my $id = 0;
  my $pdfconvpath = util::checkcmd('pdftotext');
  my $tmpfile2 = util::tmpnam('NMZ.pdf2');
  system("$pdfconvpath -q $fname $tmpfile2");
  unless (-e $tmpfile2){
    unlink $tmpfile2;
    return 'Unable to convert pdf file (maybe copying protection)';
  }
  my $fh = util::efopen($tmpfile2);
  my $cont   = join '', <$fh>;
  my @list = split(/\f/,$cont);
  for(@list){
    write_partial_file($_, $id + 1, $id, $mtime, \%info);
    $id++
  }
  return @{$info{'names'}};
}
sub write_partial_file($$$$$$) {
  my ($cont, $name, $id, $mtime, $info_ref) = @_;
  $name =~ s/^([\"\'])(.*)\1$/$2/;  # Remove quotation marks.
  my $base          = $info_ref->{'base'};
  my $fname = util::tmpnam("$base.$id");
  my $fh = util::efopen(">$fname");
  print $fh $cont;
  push @{$info_ref->{'names'}}, $name;
  $info_ref->{'name'} = $name;
  close($fh);
  utime($mtime, $mtime, $fname);
  return "";
}
1;
以上