トップ «前日 最新 翌日» 編集
RSS feed

ただのにっき


2010-11-13(土) [長年日記]

「jQueryクックブック」を自炊した(再々) - PDFから余白の除去に成功するの巻

そろそろ自炊用のタグをつけるべきか。というか、ScanSnapを買った時、べつに蔵書をPDF化するわけではないとか書いてたくせに、自炊街道まっしぐらという雰囲気が濃厚になってきているのはどういうわけですか。

そんなこんなでこないだの続き。(Kindleで読むために)余白をもっと削りたい。

で、「PDF トリミング」みたいなキーフレーズでいろいろ調べていたんだけど、これはもう、Adobe Acrobatの独壇場(あとはソースネクストの「いきなりPDF」もできそう?)。Acrobatを個人で買うとか勘弁して欲しいので、できるとこまで無償ソフトでいきたいんだが……とこぼしていたらPDFCROPというプロジェクトを教えてもらう。

そうか、探すべきキーワードは「crop」だったのか!

で、上のPDFCROPはオプションすらないビミョーなツールで、動かしてみたけどエラーの原因もよくわからない。ただ、「PDF crop」で探してみると同名かつ同目的の違うソフトがあるらしい。で、こっちはDebianにもパッケージがある。

pdfcropはtexlive-extra-utilsパッケージに入っているようなのでaptitudeでインストール。ところがこれが「PDFCROP 1.5, 2004/06/2」という古いファイルで、公式配布元であるCTAN(TeX版のCPAN?)にあるのが「PDFCROP 1.31, 2010/09/17」。バージョンのつけ方が変わってて「えっ」と思ったけど、1.31の方が新しいということか。少なくともつい最近更新があったくらいなので生きているプロジェクトらしい。lennyのパッケージはなんでこんなに古いんだ?

というわけで、最新版を落としてきて使ってみる。依存関係は先の(古い)pdfcropがなんとかしてくれるのでいちおう入れておく:

% sudo aptitude install texlive-extra-utils
% wget http://mirror.ctan.org/support/pdfcrop/pdfcrop.pl
% mv pdfcrop.pl pdfcrop
% chmod +x pdfcrop
% ./pdfcrop --verbose test1.pdf out.pdf
PDFCROP 1.31, 2010/09/17 - Copyright (c) 2002-2010 by Heiko Oberdiek.
* PDF header: %PDF-1.3
* Running ghostscript for BoundingBox calculation ...
GPL Ghostscript 8.62 (2008-02-29)
Copyright (C) 2008 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 475.
Page 1
Error: /undefined in /90ms-RKSJ-H
(以下略)

なにやらエラー。「90ms-RKSJ-H」をググってみると、PDFで使われている文字コードの表記(?)で、Windowsで作られた日本語PDFという程度の意味合いか。日本語フォントがないという意味だろうな。あー……これはフォントの泥沼にはまるヨカン……。そういうのは全力で避けたい方向。

そこで、ここはいったん諦めて、ふたたびWindowsオンリーでなんとかしようと考えた。

Adobe ReaderやFoxit ReaderのようなPDFビューアで余白がなくなるくらいの倍率で「拡大印刷」し、それをpdf995PrimoPDFのようなプリンタドライバを介してトリミング済みのPDFを入手しようという作戦に。

pdf995で作成したPDFファイルはむやみやたらとファイルサイズがデカくなってしまい(5倍以上)、PrimoPDFだと倍程度に収まったのでよしよしと思っていたのだが、困ったことに画像情報しか残ってない。よく考えてみればプリンタへ印刷するという機能を使っているんだから、決して印刷されない透明な文字の情報がプリンタドライバに渡るわけがないではないか。

おまけにこうして作ったPDFファイルを、Kindleを持っている知人に試してもらったところ、起動に5分かかるという結果に。なんじゃそら。なんかこう、PDFの作りがいろいろおかしいということか。やっぱまっとうな方法でPDFファイルを直接いじるしかないのかね。

というわけで、ふたたびLinux環境に舞い戻る。ちょっと調べてみると、「gs-cjk-resource」というのが見つかった。これを入れればいいのか。aptitude installしてからリトライ:

% sudo aptitude install gs-cjk-resource
% ./pdfcrop --verbose test1.pdf out.pdf
PDFCROP 1.31, 2010/09/17 - Copyright (c) 2002-2010 by Heiko Oberdiek.
* PDF header: %PDF-1.3
* Running ghostscript for BoundingBox calculation ...
GPL Ghostscript 8.62 (2008-02-29)
Copyright (C) 2008 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 475.
Page 1
Substituting CID font resource/Adobe-Japan1 for /MSMincho.
Error: /undefinedresource in findresource

お、「MSMincho」なんてキーワードが登場するようになりましたな。ようするに、PDFファイルに「MSMincho」という名前が埋め込まれてるけど、マッピングできないと言ってるんだろう。マッピングのためにはなんらかの代替TrueTypeフォントを入れてやればいい。ここはおなじみ東風フォントでいいのかな。さらに調べると、cidfmapというファイルでそのマッピングを指定してやるらしい:

% sudo aptitude install ttf-kochi-mincho
% sudo vi /usr/share/ghostscript/8.62/lib/cidfmap
(ごにょごにょ)
% tail -1 /usr/share/ghostscript/8.62/lib/cidfmap
/MSMincho << /FileType /TrueType /Path (/usr/share/fonts/truetype/ttf-japanese-mincho.ttf) /SubfontID 3 /CSI [(Japan1) 2] >> ;

これで準備完了(のはず)。pdfcropを再実行:

% ./pdfcrop --verbose test1.pdf out.pdf
PDFCROP 1.31, 2010/09/17 - Copyright (c) 2002-2010 by Heiko Oberdiek.
* PDF header: %PDF-1.3
* Running ghostscript for BoundingBox calculation ...
GPL Ghostscript 8.62 (2008-02-29)
Copyright (C) 2008 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 2.
Page 1
%%BoundingBox: 0 0 498 658
* Page 1: 0 0 498 658
%%BoundingBox: 0 0 498 658
%%HiResBoundingBox: 0.000000 0.000000 497.285985 657.485980
%%HiResBoundingBox: 0.000000 0.000000 497.285985 657.485980
Page 2
%%BoundingBox: 0 0 498 659
* Page 2: 0 0 498 659
%%BoundingBox: 0 0 498 659
%%HiResBoundingBox: 0.000000 0.000000 497.753985 658.925980
%%HiResBoundingBox: 0.000000 0.000000 497.753985 658.925980
* Running pdfTeX ...
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6)
 %&-line parsing enabled.
entering extended mode
(./tmp-pdfcrop-10192.tex [1 <./test1.pdf>] [2 <./test1.pdf>] )
Output written on tmp-pdfcrop-10192.pdf (2 pages, 197614 bytes).
Transcript written on tmp-pdfcrop-10192.log.
==> 2 pages written on `out.pdf'.

できた! で、開いてみるとなにも変わってない

いや、予想はしていたんだ。自炊PDFは画像が一面に埋まってるわけで、余白を検出できないんだろう。メッセージにある「HiResBoundingBox」がそのヒントだ。これを--bboxオプションで適当な値に狭めてやればいい。試行錯誤の末、こんな感じにするときれいに余白が消えたPDFができた。

% ./pdfcrop --bbox "50 40 447 627" test1.pdf out.pdf

前回の記事と比べると一目瞭然。バンザイ!

[スクリーンショット]余白が消えた自炊PDF

--bboxオプションには奇数ページと偶数ページを別々に指定できる機能もあるので、左右でマージンが大きく異なる本でもなんとかなりそうだ。これでKindleを買う権利ができた!(←権利?)

Tags: ebook
関連する日記: 2010-11-19(金)
本日のツッコミ(全8件) [ツッコミを入れる]
kou (2010-11-14(日) 10:13)

元のPDFって単なる画像なんですか?それともテキストデータも残っているんですか?
画像だけならRuby/Popplerというのとrcairoでもできると思います!(今さら)

ただただし (2010-11-14(日) 10:25)

ScanSnapで取り込むと、OCRして文字情報を透明なレイヤーにして重ねてくれるの。ちゃんと検索なんかもできるんだよ。だから画像としてだけ処理するツールは使えない。

kou (2010-11-14(日) 10:47)

おぉ!すごい!
というか、テキスト云々関係なかったです。
こんなスクリプトで
https://ruby-gnome2.svn.sourceforge.net/svnroot/ruby-gnome2/ruby-gnome2/trunk/poppler/sample/pdfcrop.rb
これが
http://pub.cozmixng.org/~kou/archives/rabbit/rabbit-0.9.0.pdf
こうなります。
http://pub.cozmixng.org/~kou/archives/rabbit/rabbit-0.9.0-croped.pdf

ただただし (2010-11-14(日) 10:52)

おー、すばらしい。これってghostscriptには依存してない? Linuxでいろいろ苦労するのはあの周辺に依存してるからなので、今はとりあえず希望したことはできるようになったからいいけど、cairoがそういう存在ならそっちに移行したほうがいいかなー、とは思う。

kou (2010-11-14(日) 11:12)

Ghostscriptは必要ないです!
cairoはフォントまわりのバックエンドがPangoになっていて、Pangoのバックエンドがfontconfigとかなので~/.fonts.confとかそのあたりで設定することになります。
fontconfigまわりはGNOMEとかのデスクトップでも使われるのでだいたいは勝手にうまい具合に設定されています。なので、Ghostscriptのフォントまわりみたいにはまることは少ないと思います。

ただただし (2010-11-14(日) 14:47)

fontconfigにもいい思い出ないけど(笑)、ghostscript関係ないのはいいねぇ。単一パッケージにしてWindowsでも簡単に使えたら、自炊派にうけるかも。
トリミング専門Webサービス……は権利的にまずいか。

馴染めない (2010-11-17(水) 22:01)

(自炊)と言う言い方、馴染めない、もっとセンスの良い言葉ないもんでしょうか

ただただし (2010-11-17(水) 22:03)

[警告] 「センス」が未定義です。


トップ «前日 最新 翌日» 編集
RSS feed