Namazu-devel-ja(旧)


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

PDF ファイルをページごとに分割



岡埜です

自分が必要になったので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;


以上