PDFファイルをKobo Glo向けのCBZファイルに変換する

Kobo Glo で PDF を読もうとしたら異様に動作が重かったです。その PDF ファイルだけかも知れませんが。

仕方が無いので CBZ ファイル(画像ファイルを ZIP でかためたもの)に変換するスクリプトを作成しました。文字情報は失われますが、検索とかコピペとかしない文書なので軽さ最優先です。

pdftocbz.sh hogehoge.pdf

と実行すると、同じ場所に最適化されたCBZファイルが出来ます。元のPDFファイルにタイトルや著者名が埋めこまれていると、それを使って「[著者名] タイトル.cbz」みたいなファイル名になります。

tdtds/kindlizer · GitHub を手本に作りました。やっと convert コマンドの使い方が分かってきた気がします、今さら。

広告

PDFを画像ファイルに

「pdfを画像ファイル」で検索してる方がいるらしいので、PDFファイルから画像を取り出す方法をちょっと調べてみました。主に Mac か Linux 環境向けです。Windows の場合は……「かんたんPDFダイエット」とか使えばいいんじゃないですかね。

Poppler (または Xpdf) を使う

Poppler に “pdftoppm” というコマンドがありますのでそれを使います。

pdftoppm hoge.pdf output

と実行すると、hoge.pdf をファイル名の先頭に output をつけた画像ファイルに出力します。
主に以下のようなオプションがあります。

-png, -jpeg  :PNG, JPEGファイルを生成
-gray    :グレースケールのPGMファイルを生成
-r 数字    :解像度 (DPI) を指定
-o      :奇数ページのみ
-e      :偶数ページのみ

-png, -jpeg, -tiff, -gray などのオプションが無いと PPM ファイルを生成するはず。その場合は ImageMagick の mogrify で変換しましょう。

mogrify -format png output*.ppm

以下、ヘルプのコピペです。

% pdftoppm --help
pdftoppm version 0.22.0
Copyright 2005-2012 The Poppler Developers - http://poppler.freedesktop.org
Copyright 1996-2011 Glyph & Cog, LLC
Usage: pdftoppm [options] [PDF-file [PPM-file-prefix]]
  -f <int>                 : first page to print
  -l <int>                 : last page to print
  -o                       : print only odd pages
  -e                       : print only even pages
  -singlefile              : write only the first page and do not add digits
  -r <fp>                  : resolution, in DPI (default is 150)
  -rx <fp>                 : X resolution, in DPI (default is 150)
  -ry <fp>                 : Y resolution, in DPI (default is 150)
  -scale-to <int>          : scales each page to fit within scale-to*scale-to pixel box
  -scale-to-x <int>        : scales each page horizontally to fit in scale-to-x pixels
  -scale-to-y <int>        : scales each page vertically to fit in scale-to-y pixels
  -x <int>                 : x-coordinate of the crop area top left corner
  -y <int>                 : y-coordinate of the crop area top left corner
  -W <int>                 : width of crop area in pixels (default is 0)
  -H <int>                 : height of crop area in pixels (default is 0)
  -sz <int>                : size of crop square in pixels (sets W and H)
  -cropbox                 : use the crop box rather than media box
  -mono                    : generate a monochrome PBM file
  -gray                    : generate a grayscale PGM file
  -png                     : generate a PNG file
  -jpeg                    : generate a JPEG file
  -tiff                    : generate a TIFF file
  -tiffcompression <string>: set TIFF compression: none, packbits, jpeg, lzw, deflate
  -freetype <string>       : enable FreeType font rasterizer: yes, no
  -aa <string>             : enable font anti-aliasing: yes, no
  -aaVector <string>       : enable vector anti-aliasing: yes, no
  -opw <string>            : owner password (for encrypted files)
  -upw <string>            : user password (for encrypted files)
  -q                       : don't print any messages or errors
  -v                       : print copyright and version info
  -h                       : print usage information
  -help                    : print usage information
  --help                   : print usage information
  -?                       : print usage information

Automator を使う (Mac OS X 限定)

Mac OS X の自動化ツール Automator に PDF 関連のアクションが結構あります。
「PDF ページをイメージとしてレンダリング」というアクションが今回の目的にあいそうです。
「奇数ページと偶数ページを抽出」というアクションもありますね。

スクリーンショット 2013-02-07 4.58.09

響 – Hibiki Radio Station – 録音スクリプト修正

Hibiki Radio Station の番組詳細ページの Windows Media Player ファイルを保存するためのスクリプトです。
本当はTOPページで rtmpdump するのがいいんでしょうけど手っ取り早いので。
asx ファイルが変わったみたいので対応しました。

02/05追記:なんだか頻繁に録音失敗するので、一回リトライするようにしました。っていうか mimms にレジュームオプションなんてあったんですね……。

02/13追記:mimmsは途中終了してもエラーにならないらしいので ”||” 演算子の意味が無い……。どんな場合でも二回mimmsするようにしました。

#!/bin/sh -e
# hibiki.sh ver.0.5.6 (2013-02-13)
# require wget, ruby, and mimms
TMPFILE="/var/tmp/tmp.$$"
trap 'rm -f ${TMPFILE}' EXIT

if [ $# -eq 1 ]; then
  STR=$1

  # save asx file
  wget -q -O - http://hibiki-radio.jp/description/${STR} | grep WMV | ruby -ruri -e 'puts URI.extract(ARGF.read, "http")' | head -1 | xargs wget -q -O ${TMPFILE}
  if [ -z ${TMPFILE} ]; then
    echo "download ERROR"
    exit 1
  fi
  TITLE=`cat ${TMPFILE} | ruby -rrexml/document -e 'puts REXML::Document.new(ARGF).elements["ASX/entry/title"].text'`
  WMVFILE=`cat ${TMPFILE} | ruby -rrexml/document -e 'puts REXML::Document.new(ARGF).elements["ASX/entry/Ref"].attributes["href"]'`
  if test a"$TITLE" = a"" ; then
    echo "asx detection failed."
    exit 1
  fi

  mimms -r ${WMVFILE} "${TITLE}.asf"
  mimms -r ${WMVFILE} "${TITLE}.asf"

else
  echo "usage: `basename $0` STRING"
fi

WebRadioRecorder/hibiki.sh at master · unot/WebRadioRecorder · GitHub