以前にも書いたように自宅内のサーバ上でオープンソース全文検索サーバ Fess を利用して、自炊した書籍の検索システムを構築しています。
紙の書籍のようにバラバラとページをめくりつつ目的のページを探せなくなった代わりに、全文検索が使えるのが大きなメリットなのです。
今日、調べ物の為に検索していて、ふと気がついてしまいました。
サムネイルが表示されていない!!
サムネイル生成機能は、表紙(1ページ目)を画像に変換して検索画面に一緒に表示しするもので、検索結果の視認性が向上します。以下の画像をみれば、その違いは一目瞭然だと思います。
Contents
原因と対策
私の環境は、以下のとおりです。また、基本的にPDFファイルしか検索対象にしていない為、PDFファイルの処理部分のみ修正しています。
OS (distribution) | debian buster (10.10 Stable) |
Fess | 13.12.1 ( deb package を install) |
Elasticsearch | 7.12.1 |
ドキュメントの設定ガイドを確認して必要なパッケージが入っている事を確認し、必要なコマンドが起動できる事も確認しておきます。
1 2 3 4 5 6 7 |
$ dpkg -l | grep -w 'imagemagick ' ii imagemagick 8:6.9.10.23+dfsg-2.1+deb10u1 amd64 image manipulation programs -- binaries $ which convert /usr/bin/convert $ which pdftoppm /usr/bin/pdftoppm |
convertはImagemagick
、pdftoppmはpoppler-utils
にそれぞれ入っています。
サムネイル生成周りの挙動を調べてみると、ドキュメントから表紙のpng画像ファイルを生成するはずが、ディレクトリだけが掘られ肝心のサムネイルファイルが作成されていません。
debian packageでインストールした場合、サムネイルを生成するコマンドは、/usr/share/fess/bin/generate-thumbnail
です。
Issue 1
generate-thumbnail スクリプトが正常に動いていない。
原因
Red Hat系ディストリビューションに於いて/bin/sh
の実体はbash
である。しかし、Debian系ディストリビューションの /bin/sh
は、dash
になっている。
generate-thumbnail
コマンドの中で、bashの組み込みコマンドである[[ xxx ]]
を利用している為、Debian系ディストリビューション(Ubuntuを含む)では、期待する動作をしない。
解決策
/bin/sh
ではなく、bash
を起動するようにshebangを書き換える。
Issue 2
PDFファイルによって、サムネイル画像生成に成功したり失敗したりする。
原因
pdftoppm
コマンドが出力するファイル名にはページ数が連番で付与される。ページ数が多いPDFファイルを処理する場合、連番の桁数が期待する物では無い場合がある。結果として、generate-thumbnail
スクリプトが失敗しexitしてしまう。
※ [注意]うちの環境にインストールされている pdftoppm
コマンドのせいかもしれません。
1 2 3 4 |
$ pdftoppm -v pdftoppm version 0.71.0 Copyright 2005-2018 The Poppler Developers - http://poppler.freedesktop.org Copyright 1996-2011 Glyph & Cog, LLC |
解決策
generate-thumbnail
スクリプトのPDFファイルを処理している部分から呼び出される pdftoppm
コマンドで -singlefile
オプションを利用し、連番ファイルが付かないようにする。
issue 3
検索結果に表示される文書のサムネイル画像が歪んで表示される。
※ 動作に問題はありません。
原因
生成されるサムネイル画像がアスペクト比を無視して 100×100ピクセルに縮小される為。
対策
アスペクト比を保存しつつ縮小するようconvert
コマンドへ渡す画像サイズの指定を変更する。
修正パッチ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ diff -u0 /usr/share/fess/bin/generate-thumbnail{.orig,} --- /usr/share/fess/bin/generate-thumbnail.orig 2021-04-27 05:47:15.000000000 +0900 +++ /usr/share/fess/bin/generate-thumbnail 2021-07-06 14:11:07.015063532 +0900 @@ -1 +1 @@ -#!/bin/sh +#!/usr/bin/env bash @@ -6 +6 @@ -IMAGE_SIZE=100x100! +IMAGE_SIZE=100x100 @@ -43,2 +43,2 @@ - pdftoppm -png -l 1 ${TARGET_FILE} ${TMP_PNG_PREFIX} - TMP_PNG_FILE="${TMP_PNG_PREFIX}-1.png" + pdftoppm -png -singlefile ${TARGET_FILE} ${TMP_PNG_PREFIX} + TMP_PNG_FILE="${TMP_PNG_PREFIX}.png" @@ -50 +50 @@ - rm ${TMP_PNG_PREFIX}*png + rm -f ${TMP_PNG_PREFIX}*png |
- 5,6行目:
環境の差異を吸収する為、/usr/bin/env
を通してbash
を呼び出す。 - 8,9行目:
サイズ指定の最後に!
を付けるとアスペクト比を保存しない。 - 11-14行目:
pdftoppmで最初の1ページのみ画像化する。出力ファイルに数字は付かない。 - 16-17行目:
-f で一時ファイルの強制削除
後は更新されるのを待つか or すぐに再生成したければ文書を全てクロールし直すことで強制的に再生成されます。