・psnup -2up problem
授業の準備でこんなことをしている時間は無いはずなのに、 気になるとあれこれ追いかけてしまうのはハッカーの性(さが)だろうか。。
ちと長いPDFなファイルを2upで印刷したくなってあれこれ試したのだけど、結構大変だった記録。
PDFのレベルで2upしてくれるソフトを探したらpdfjamと pdfnupというのが見つかった。 pdfjamはシェルスクリプトだけどバックエンドにpdfLaTeXが必要なそうなので見送り、 Pythonで書かれたpdfnupをしばらくイジってみた。
ところが、こいつがpythonのez_setup.pyベースでビルドするようになっている上に、--install-dir とか--prefixを指定しても動いてくれない。結局、あきらめて sudo で実行してインストールしてみたけど、 実行しようとすると、
% pdfnup Traceback (most recent call last): File "/usr/bin/pdfnup", line 5, in <module> pkg_resources.run_script('pdfnup==0.4.1', 'pdfnup') File "/usr/lib64/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/pkg_resources.py", line 489, in run_script File "/usr/lib64/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/pkg_resources.py", line 1207, in run_script File "/usr/lib64/python2.7/site-packages/pdfnup-0.4.1-py2.7.egg/EGG-INFO/scripts/pdfnup", line 23, in <module> from pdfnup import * File "/usr/lib64/python2.7/site-packages/pdfnup-0.4.1-py2.7.egg/pdfnup.py", line 37, in <module> raise RuntimeError(_MSG) RuntimeError: Please install pyPdf first, see http://pybrary.net/pyPdf
などと言うエラーになる。pyPdfは事前にインストールして、テストスクリプトも動くのにおかしいなぁ、、と 調べたら、数年前のpyPdfを前提としているらしい。
# そー言えば、ez_setup.py でも最近のeggファイルを見つけれずにエラーになっていたのだった。。
これは付きあいきれんなぁ、、と、PDFネイティブで処理することを諦めて、いったんPS化してpsnupをすることにしたが、 psnupは64ビット版をビルドしていない :-<
しかたないのでソースコードを拾ってビルドしてみたけど、印刷しようとするとプリンタが反応しない。
あれれ、と思って、cupsd.confのloglevelをdebugにして追いかけてみると、
[Job 12] max_gray = 1, dither_grays = 2 [Job 12] max_color = 0, dither_colors = 0 [Job 12] cups_print_chunked: xflip = 0, yflip = 0, height = 1074 [Job 12] prnt/hpcups/HPCupsFilter.cpp 253: ERROR: Unsupported resolution
などと、hpcups がエラーを出している。あまり見たことが無いエラーなので、Googleで調べてみると、 hplipとcupsの新版が出ているようなので、更新すれば解決するかな、とhplip-3.11.3aとcups-1.4.6をビルドして updatepkgしてみたら、今度はプリンタ出力が真っ黒け X-P
ちなみに、上の方に見えてるグレーの領域は、両面印刷の裏側で黒ベタになっている部分。 テスト印刷しようとすると、こんなのがゾロゾロと出てきてちょっと絶望的な気分に。 しかも、古いバージョンのcupsとhplipに戻しても復旧しない。。。(;_;)
こうなると、ちょっと頭を冷した方がよさそうだ、、、としばらく放置しておいてから、 cupsとhplipをremovepkgで削除し、インストール後に更新されているスプールやキャッシュ用のディレクトリも 手動で消去してから、改めてcupsとhplipをinstallpkgしてやると、何とかプリントアウトも復旧したので、 どうやらヘンなデータがスプールに残っていたのかな、という印象。
それでもpsnupの2upが出力できない問題は解決しないので、しばらくGoogleで調べたところ、 psnupはBoundingBoxを正しく計算せず、cupsは解像度決め打ちでドライバにデータを送るけど、 hpcupsはそういう決め打ちデータでは正しく印刷できないので、"unsupported resolution" のエラー終了するようになっているらしい。 ちなみに、このあたりは実装依存らしく、ドライバによっては出力できるのもあるらしいし、ghostscriptや Okularでは特に問題なく表示できていた。
何か修正するようなパッチがあるのかなぁ、、とDebianとSuSEのソースを眺めてみたけど、Debianはlibpaper1という 紙サイズ選択用のライブラリを必要とするようなかなり大掛かりなパッチらしい。コンパイル時に-DDEBIANを指定しなければ libpaper1は不要なものの、そのバイナリで作成した2upのPSファイルは、誤ったBoundingBoxは削除されるものの、 hpcupsは "%%BoundingBox: コメントがありません!" というエラーを出して印刷不能。
SuSEのパッチはもう少し小規模だったけど、出力される2upなファイルは元のコードの出力と同じで印刷不能。
いよいよ八方塞がりになってきたので、少し視点を変えて okular から出力してみたらどうなるかな、 と試してみたら、PSファイルのまま読み込んで出力しようとするとエラーで印刷不能なものの、 okular には「PSファイルをPDFとしてインポートする」という機能があって、この機能を使って2upなPSファイルをPDFとして読み込めば、 無事、2upなページを印刷することができた。
まぁ、とりあえず目的は達したからよしとするものの、使いなれているからとpsnupにこだわりすぎたのが敗因な印象で、 pdftkあたりツールを使えばPDFレベルでの2upができた気もする。
hplipのプリンタマネージャから2upで印刷しようとすると内部で psnup -2upを起動してたりしたので、epdfviewの方までは気が回らなかった。 -- kojima 2011-04-04 (月) 17:43:51