■PDFを検索対象に
PDFファイルをNamazuの検索対象に加えるにはxpdfに含まれるpdftotextというプログラムを使用する必要があります。pdftotextはPDFに含まれているtextを抽出するツールです。これまでは日本語の処理に不十分な面があった感じでしたので、個人的には別のツールを使ってPDFのインデックス化をしていました。しかし、2002年2月1日にリリースされたxpdf-1.00から日本語や中国語、韓国語などのLanguage Support Packageが提供されるようになり、機能的にも十分なツールになった感があります。
詳細はhttp://www.foolabs.com/xpdf/(英文)を参照してください。

Namazu2.0.12のリリースに伴い、pdfファイルの文書フィルタであるpdf.plがxpdf1.00以降のpdftotextのオプション変更に対応しました。xpdfのバージョンを判定し、pdftotextに与えるオプションを自動的に変更してくれます。また、xpdfに同梱されているpdfinfoというコマンドを新たに使用するようになっていますので、pdfinfo.exeをパスが通ったディレクトリに置いておく必要があります。

ただ、Namazu2.0.12に同梱されているpdf.plは、98、MeのWindows9x系でうまく動作しませんでした(pdf.plにMS-DOSのコマンドラインで使用できない標準エラー出力をリダイレクトする記述があるのが原因のようです)。XPは問題ありませんでしたので、おそらくNT系は大丈夫だと思います(NT、2000は今、手元に実験環境がないので、確認していません)。9x系の暫定的な対応策は下の方に書いておきます。



PDFファイルの検索を実現するのにはまず、xpdf本体と日本語用Language Support Packageの2ファイルを入手します。(xpdfのバージョンが1.00から1.01に上がりました。さらに2.00、2.01、2.02、2.03、3.00とリリースされています)

入手先
xpdf本体3.00  ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.00-win32.zip
Language Support Package  ftp://ftp.foolabs.com/pub/xpdf/xpdf-japanese.tar.gz


xpdfのインストール先はパスが通っているディレクトリであれば、どこでも構いません。ここではCドライブにxpdfというディレクトリ(C:\xpdf)を作成します。ZIP形式で圧縮されているxpdf本体を展開(解凍)し、展開されたファイルをすべてC:\xpdfディレクトリにコピーします。

C:\xpdfディレクトリにあるsample-xpdfrcをxpdfrcにリネームします。

9x系はC:\Autoexec.batファイルをテキストエディタで編集し、行末にSET PATH=C:\xpdf;"%PATH%"と記述した上で上書き保存します。PATH=という行があれば、そこにC:xpdfを加えても構いません(区切り記号はセミコロンです)。Autoexec.batの設定はPCを再起動した後に有効になります。これでC:\xpdfへのパスが通り、フルパスを記述しなくてもpdftotextが実行できるようになります。NT系は環境変数のシステム変数のPATHの値にC:\xpdfを追加してください。

続いて日本語のLanguage Support Packageを解凍しますが、ここでUNIX系OSを使ったことがない人には見慣れないtar.gzという「拡張子」が付いた圧縮ファイルが登場します。これはUNIX系OSで一般的に使われているtarコマンドで複数ファイルをアーカイブ(ひとまとめにすること)し、gzipコマンドで圧縮したファイルです。解凍するにはtar.gzに対応した解凍ツールが必要ですが、Windows用でもかなりの数の解凍、圧縮ツールが対応しているようです。個人的にはWindows上でtar.gzファイルを解凍する場合はArchwayというアプリケーションを使っています。

統合アーカイバ(http://www.csdinc.co.jp/archiver/)からTAR32.DLLをダウンロードしてWindowsのsystemフォルダに入れる必要がありますが、これだけで気軽にtar.gzを解凍できます。Vectorあたりで使いやすそうな解凍ツールを探してみてください。

また、「Namazuの検索結果のカスタマイズ」で紹介しているcygwin(Windows上でUNIXライクな環境を実現するアプリケーション)をWindowsにインストールすれば、UNIX系OSと同様にtar zxvf xpdf-japanese.tar.gzとすることでtar.gzが展開できます。

xpdf-japanese.tar.gzを展開すると、xpdf-japaneseというディレクトリができるので、ディレクトリ名をjapaneseにリネームして、ディレクトリごとC:\xpdfディレクトリにコピーします。

C:\xpdf\japaneseディレクトリのadd-to-xpdfrcをテキストエディタで開きます。標準の設定は次のようになっています。

#----- begin Japanese support package (2002-jan-16)
cidToUnicode Adobe-Japan1 /usr/local/share/xpdf/japanese/Adobe-Japan1.cidToUnicode
unicodeMap ISO-2022-JP /usr/local/share/xpdf/japanese/ISO-2022-JP.unicodeMap
unicodeMap EUC-JP /usr/local/share/xpdf/japanese/EUC-JP.unicodeMap
unicodeMap Shift-JIS /usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap
cMapDir Adobe-Japan1 /usr/local/share/xpdf/japanese/CMap
toUnicodeDir /usr/local/share/xpdf/japanese/CMap
displayCIDFontX Adobe-Japan1 "-*-fixed-medium-r-normal-*-%s-*-*-*-*-*-jisx0208.1983-0" ISO-2022-JP
#----- end Japanese support package

これを次のように書き換えます。それぞれのファイルの場所を示すパスをUNIX式の表記からWindows形式の表記に変更するだけです。各ファイルはC:\xpdf\japaneseにコピーしたので、

#----- begin Japanese support package (2002-jan-16)
cidToUnicode Adobe-Japan1 C:\xpdf\japanese\Adobe-Japan1.cidToUnicode
unicodeMap ISO-2022-JP C:\xpdf\japanese\ISO-2022-JP.unicodeMap
unicodeMap EUC-JP C:\xpdf\japanese\EUC-JP.unicodeMap
unicodeMap Shift-JIS C:\xpdf\japanese\Shift-JIS.unicodeMap
cMapDir Adobe-Japan1 C:\xpdf\japanese\CMap
toUnicodeDir C:\xpdf\japanese\CMap
displayCIDFontX Adobe-Japan1 "-*-fixed-medium-r-normal-*-%s-*-*-*-*-*-jisx0208.1983-0" ISO-2022-JP
#----- end Japanese support package

のように変更します。変更内容を確認したらadd-to-xpdfの内容をすべてコピーし、C:\xpdfディレクトリのxpdfrcをテキストエディタで開いて行末にペーストします。xpdfrcは次のようになります。

#========================================================================
#
# Sample xpdfrc file
#
# The Xpdf tools look for a config file in two places:
# 1. ~/.xpdfrc
# 2. in a system-wide directory, typically /usr/local/etc/xpdfrc
#
# This sample config file demonstrates some of the more common
# configuration options. Everything here is commented out. You
# should edit things (especially the file/directory paths, since
# they'll likely be different on your system), and uncomment whichever
# options you want to use. For complete details on config file syntax
# and available options, please see the xpdfrc(5) man page.
#
# Also, the Xpdf language support packages each include a set of
# options to be added to the xpdfrc file.
#
# http://www.foolabs.com/xpdf/
#
#========================================================================
#----- display fonts
# These map the Base-14 fonts to standard X server fonts.
# These are default mappings, built into xpdf - they're shown here
# purely as examples.
#displayFontX Courier "-*-courier-medium-r-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Courier-Bold "-*-courier-bold-r-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Courier-BoldOblique "-*-courier-bold-o-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Courier-Oblique "-*-courier-medium-o-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Helvetica "-*-helvetica-medium-r-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Helvetica-Bold "-*-helvetica-bold-r-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Helvetica-BoldOblique "-*-helvetica-bold-o-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Helvetica-Oblique "-*-helvetica-medium-o-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Symbol "-*-symbol-medium-r-normal-*-%s-*-*-*-*-*-adobe-fontspecific" Symbol
#displayFontX Times-Bold "-*-times-bold-r-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Times-BoldItalic "-*-times-bold-i-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Times-Italic "-*-times-medium-i-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX Times-Roman "-*-times-medium-r-normal-*-%s-*-*-*-*-*-iso8859-1" Latin1
#displayFontX ZapfDingbats "-*-zapfdingbats-medium-r-normal-*-%s-*-*-*-*-*-*-*" ZapfDingbats
# These map the Base-14 fonts to the Type 1 fonts that ship with
# ghostscript. You'll almost certainly want to use something like
# this, but you'll need to adjust this to point to wherever
# ghostscript is installed on your system.
#displayFontT1 Times-Roman /usr/local/share/ghostscript/fonts/n021003l.pfb
#displayFontT1 Times-Italic /usr/local/share/ghostscript/fonts/n021023l.pfb
#displayFontT1 Times-Bold /usr/local/share/ghostscript/fonts/n021004l.pfb
#displayFontT1 Times-BoldItalic /usr/local/share/ghostscript/fonts/n021024l.pfb
#displayFontT1 Helvetica /usr/local/share/ghostscript/fonts/n019003l.pfb
#displayFontT1 Helvetica-Oblique /usr/local/share/ghostscript/fonts/n019023l.pfb
#displayFontT1 Helvetica-Bold /usr/local/share/ghostscript/fonts/n019004l.pfb
#displayFontT1 Helvetica-BoldOblique /usr/local/share/ghostscript/fonts/n019024l.pfb
#displayFontT1 Courier /usr/local/share/ghostscript/fonts/n022003l.pfb
#displayFontT1 Courier-Oblique /usr/local/share/ghostscript/fonts/n022023l.pfb
#displayFontT1 Courier-Bold /usr/local/share/ghostscript/fonts/n022004l.pfb
#displayFontT1 Courier-BoldOblique /usr/local/share/ghostscript/fonts/n022024l.pfb
#displayFontT1 Symbol /usr/local/share/ghostscript/fonts/s050000l.pfb
#displayFontT1 ZapfDingbats /usr/local/share/ghostscript/fonts/d050000l.pfb
# If you need to display PDF files that refer to non-embedded fonts,
# you should add one or more fontDir options to point to the
# directories containing the font files. Xpdf will only look at .pfa,
# .pfb, and .ttf files in those directories (other files will simply
# be ignored). #fontDir /usr/local/fonts/bakoma
#----- PostScript output control # Set the default PostScript file or command.
#psFile "|lpr -Pmyprinter"
# Set the default PostScript paper size -- this can be letter, legal,
# A4, or A3. You can also specify a paper size as width and height
# (in points).
#psPaperSize letter
#----- text output control
# Choose a text encoding for copy-and-paste and for pdftotext output.
# The Latin1, ASCII7, and UTF-8 encodings are built into Xpdf. Other
# encodings are available in the language support packages.
#textEncoding UTF-8
# Choose the end-of-line convention for multi-line copy-and-past and
# for pdftotext output. The available options are unix, mac, and dos.
#textEOL unix
#----- misc settings # Set the anti-aliasing mode for t1lib and FreeType. These can be low
# or high (anti-aliasing), plain (no anti-aliasing), or none (disable
# the rasterizer entirely).
#t1libControl low
#freetypeControl low
# Set the command used to run a web browser when a URL hyperlink is
# clicked.
#urlCommand "netscape -remote 'openURL(%s)'"
#----- begin Japanese support package (2002-jan-16)
cidToUnicode Adobe-Japan1 C:\xpdf\japanese\Adobe-Japan1.cidToUnicode
unicodeMap ISO-2022-JP C:\xpdf\japanese\ISO-2022-JP.unicodeMap
unicodeMap EUC-JP C:\xpdf\japanese\EUC-JP.unicodeMap
unicodeMap Shift-JIS C:\xpdf\japanese\Shift-JIS.unicodeMap
cMapDir Adobe-Japan1 C:\xpdf\japanese\CMap
toUnicodeDir C:\xpdf\japanese\CMap
displayCIDFontX Adobe-Japan1 "-*-fixed-medium-r-normal-*-%s-*-*-*-*-*-jisx0208.1983-0" ISO-2022-JP
#----- end Japanese support package

Namazu2.0.12をインストールした場合、以下の--ここから--、--ここまで--の間に記述してあるpdf.plの編集は必要ありません。Namazu2.0.10以前の場合は必要です。

--ここから--

次いでC:\namazu\share\namazu\filterにあるpdf.plを編集します。pdftotextのオプションの使い方が少し変更されたためです。filterディレクトリにあるplという拡張子のファイルはすべてperl(パール)というプログラミング言語で書かれていますが、中身はテキストファイルです。テキストエディタで簡単に編集できます。73行目あたりにある

system("$pdfconvpath -q -eucjp -raw $tmpfile $tmpfile2");

を次のように変更します。

system("$pdfconvpath -q -enc EUC-JP -raw $tmpfile $tmpfile2");

--ここまで--



Namazu2.0.12を9x系にインストールした場合のpdf.plの不具合と暫定的な対応策

--ここから--

Namazu2.0.12をWindows98など9x系にインストールした場合、新しいpdf.plがうまく動作しませんでした。mknmzを実行すると、各フィルタをロードする時点(?)で

コマンドまたはファイル名が違います.

とDOS窓にメッセージが出ます。その後、インデックス作成自体は進みますが、pdfファイルはすべてUnable to convert pdf file (maybe copying protection)になります。xpdfが1.00以前と認識され、-enc EUC-JPでなく、-eucjpオプションで処理されてしまっているようです。暫定的な対処方法を次に示します。

pdf.plの44-47行目の

my $ret = `$pdfconvpath 2>&1`;
if ($ret =~ /^pdftotext\s+version\s+([0-9]+\.[0-9]+)/) {
$pdfconvver = $1;
}



#my $ret = `$pdfconvpath 2>&1`;
#if ($ret =~ /^pdftotext\s+version\s+([0-9]+\.[0-9]+)/) {
#$pdfconvver = $1;
#}
$pdfconvver = 1.01;

と書き換えます。

44-47行目はpdftotextをオプションなしで実行して標準エラー出力を変数に入れ、エラー出力の先頭部分にあるバージョンを示す値を、正規表現を使って取り出しているのですが、2>&1という記述はMS-DOSのコマンドラインではできないため、バージョンを示す値が取得できず、$pdfconvverの値が0になってしまいます。このため、上で示した暫定的な対応ではバージョンを示す値を取り出す処理の部分(44-47行目)をコメントアウト(行頭に#を付ける)し、次の行(48行目)に$pdfconvver = 1.01;(1以上の値なら何でもOKです。xpdf3.00は3.00)を記述し、強制的にバージョンを示す値を与えています。

もし、xpdf1.00以前の0.93などを使っている場合は48行目の値を0.93などと1未満の数値にしてください。

なお、Namazu2.0.10のpdf.plをxpdf1.00以降用に書き換え、これをNamazu2.0.12のC:\namazu\share\namazu\filterにコピーしても動作します。

ついでに、もう1点書いておきます。新しいpdf.plはpdfinfoというコマンドを使ってpdfのタイトルや作成者などの属性情報を取り出すようになりましたが、タイトルや作成者に日本語が含まれている場合、日本語部分が「無視」されてしまうようです。どうも、pdf.plの中で、この処理をしている120行目当たりの

system("$pdfinfopath $tmpfile");

に原因がありそうです。pdfinfoのhelpを見ると、

Usage: pdfinfo [options] <PDF-file>
-meta : print the document metadata (XML)
-enc <string> : output text encoding name
-opw <string> : owner password (for encrypted files)
-upw <string> : user password (for encrypted files)
-cfg <string> : configuration file to use in place of .xpdfrc
-v : print copyright and version info
-h : print usage information
-help : print usage information
--help : print usage information
-? : print usage information

と-enc(エンコード)オプションが使えるようなので、試しに-enc EUC-JPをオプションとして加えて、インデックスを作成してみたところ、無事、日本語のタイトルや作成者が表示されるようになりました。

system("$pdfinfopath -enc EUC-JP $tmpfile");

なお、十分に動作確認しているわけではないので、あくまでも自己責任でトライしてみてください。

--ここまで--

設定が完了したらMS-DOSプロンプトでmknmz -Cを実行してみます。対応メディアタイプにapplication/pdfが加わっているのを確認します。これでPDFファイルが検索対象に加わったはずです。適当なファイルで実際にインデックスが生成できるか確かめてみましょう。

pdftotextをC:\namazu\binにコピーして使う場合は編集したxpdfrcとjapaneseディレクトリもC:\namazu\binに置くのが分かりやすいでしょう。Namazu2.0.12ではこれに加え、xpdfに同梱されているpdfinfo.exeも一緒にコピーする必要があります。その上でxpdfrcの追加部分のパスをC:\namazu\bin\japanese\Adobe-Japan1.cidToUnicodeなどと書き換えてください。

Xpdfを3.00にバージョンアップしたところ、手元の環境ではmknmzの際にpdftotextが

Error: Unknown config file command 'displayCIDFontX' (C:\xpdf\xpdfrc:118)
Error: -- Xpdf no longer supports X fonts

というエラーを出すようになりました。インデックスは作成されているので、問題はないのですが、気分的に良くありません。

#displayCIDFontX Adobe-Japan1 "-*-fixed-medium-r-normal-*-%s-*-*-*-*-*-jisx0208.1983-0" ISO-2022-JP

とxpdfrcの最後の行を#でコメントアウトしてしまいましょう。詳細に原因を追求していないので、何とも言えないのですが、少なくともX Window Systemを利用していないWindowsでは関係ない設定だと思います。(2004/01/29追記)

TOPに戻る miyazawat@hotmail.com