猫山さんの日記

写真付きで日記や趣味を書くならgooブログ

Fessを試してみよう(11)/tmpがpngだらけ

2022-06-11 | 日記

課全体のサムネイルを作ってみたら、
稀にExcelファイルでもsoffice.binが応答しなくなることがわかった。
WORD同様にExcelも/usr/share/fess/app/WEB-INF/classes/fess_thumbnail.xml
の該当部分をコメントアウトした。
Excelのサムネイルもいらないや。

次は、以前から気になっていたPDFのサムネイル作成失敗に取り組もう。
/var/log/fess/fess-thumnail.logを見ると、警告がいっぱいだ。
WARN pdfThumbnailGenerator is failed (exit code:1, timeout:false):
[${path}/generate-thumbnail, pdf, ${url}, ${outputFile}]
そして、/tmpをみるとpngファイルが一杯になっている。
png作成は成功しているのに、サムネイル作成は警告終了しているようだ。

/usr/share/fess/bin/generate-thumbnailでは、PDFからpngを作った後、
pngファイルがあるかどうかを確認し、なければ警告終了するようになっている。
でも実際にはpng作成が成功しているので、その後のpngファイル削除が実行されず、
/tmpに残ったままになるのだろう。
elif [[ x"${cmd_type}" = "xpdf" ]] ; then
  check_command convert
  check_command pdftoppm
  target_file=$(echo "$url" | sed -e "s#^file:/*#/#g")
  tmp_png_prefix=/tmp/thumbnail.png.$$
  pdftoppm -q -png -l 1 "${target_file}" ${tmp_png_prefix}
  tmp_png_file="${tmp_png_prefix}-1.png"
  if [[ ! -f ${tmp_png_file} ]] ; then
    echo "pdftoppm does not work."
    exit 1
  fi
  convert -thumbnail ${image_size} ${tmp_png_file} "${output_file}"
  rm ${tmp_png_prefix}*png

サムネイル作成に失敗しているPDFを1個ずつ取り出して、
プロパティを見てみたけれど、共通点はない。
内容についても、画像が貼り付けられたもの、文字だけのものと様々。
1ページだけのシンプルなものもある。
こんなの何で失敗するんだろう?
しかも、手動でpdftoppmを実行すると警告もなく正常終了する。
サムネイル作成に使うヒープメモリが不足して、時間がかかっているのかな?
/etc/fess/fess_config.propertiesにサムネイル用のメモリ設定があったので、
Xmsを128から256、Xmxを256から512に増やしてみた。
jvm.thumbnail.options=\
(中略)
-Xms256m\n\
-Xmx512m\n\
サムネイル作成を実行してみると、初っ端から同じ警告が出た。
これじゃないようだ。

/var/log/fess/fess-crawler.logを見てみると、
WARN Format 14 cmap table is not supported and will be ignored
という警告がたくさん出ているので、これが何か関係しているのかな?
cmap tableというのはフォントに関する内容で、難しくて理解できない。
フォントが足りないのかな、とIPAフォントその他をインストールしてみたけれど、
変化なし。これも違うみたい。
そもそも、サムネイル作成処理に進んでいるのだから、
クローラーで警告が出ていても関係ないよね。

ヒントはないかな、と検索しても手掛かりなし。
うちの環境に固有の問題なんだろうか?
朝からずーっとやっているんだけど解決できない。
もう諦めて毎日cronでrm -f /tmp/thumbnail*pngしようか。
疲れたので、ちょっと昼寝しよう。

png作成をバックグラウンド実行し、完了したら次へ進むというのはどうかな。
elif [[ x"${cmd_type}" = "xpdf" ]] ; then
  check_command convert
  check_command pdftoppm
  target_file=$(echo "$url" | sed -e "s#^file:/*#/#g")
  tmp_png_prefix=/tmp/thumbnail.png.$$
  pdftoppm -q -png -l 1 "${target_file}" ${tmp_png_prefix} &
  wait
  tmp_png_file="${tmp_png_prefix}-1.png"
  if [[ ! -f ${tmp_png_file} ]] ; then
    echo "pdftoppm does not work."
    exit 1
  fi
  convert -thumbnail ${image_size} ${tmp_png_file} "${output_file}"
  rm ${tmp_png_prefix}*png
だめだ、全然効果なし。

じゃ、sleepしてみるとか。
elif [[ x"${cmd_type}" = "xpdf" ]] ; then
  check_command convert
  check_command pdftoppm
  target_file=$(echo "$url" | sed -e "s#^file:/*#/#g")
  tmp_png_prefix=/tmp/thumbnail.png.$$
  pdftoppm -q -png -l 1 "${target_file}" ${tmp_png_prefix}
  sleep 1
  tmp_png_file="${tmp_png_prefix}-1.png"
  if [[ ! -f ${tmp_png_file} ]] ; then
    echo "pdftoppm does not work."
    exit 1
  fi
  convert -thumbnail ${image_size} ${tmp_png_file} "${output_file}"
  rm ${tmp_png_prefix}*png
これもだめ。

・・夕飯後。
pdftoppmのオプションを確認するのは何度目だろう。
-l 1 の代わりに-singlefileを使ってみよう。

elif [[ x"${cmd_type}" = "xpdf" ]] ; then
  check_command convert
  check_command pdftoppm
  target_file=$(echo "$url" | sed -e "s#^file:/*#/#g")
  tmp_png_prefix=/tmp/thumbnail.png.$$
  pdftoppm -q -png -singlefile "${target_file}" ${tmp_png_prefix}
  tmp_png_file="${tmp_png_prefix}.png"
  if [[ ! -f ${tmp_png_file} ]] ; then
    echo "pdftoppm does not work."
    exit 1
  fi
  convert -thumbnail ${image_size} ${tmp_png_file} "${output_file}"
  rm ${tmp_png_prefix}*png

やっとうまく行った。疲れた。