[[diary/Kojima]]

・psnup -2up problem

授業の準備でこんなことをしている時間は無いはずなのに、
気になるとあれこれ追いかけてしまうのはハッカーの性(さが)だろうか。。

ちと長いPDFなファイルを2upで印刷したくなってあれこれ試したのだけど、結構大変だった記録。

PDFのレベルで2upしてくれるソフトを探したら[[pdfjam:http://freshmeat.net/projects/pdfjam/]]と
[[pdfnup:http://www.dinu-gherman.net/tmp/pdfnup-README.html]]というのが見つかった。
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

#ref("hpscan001.jpg")

ちなみに、上の方に見えてるグレーの領域は、両面印刷の裏側で黒ベタになっている部分。
テスト印刷しようとすると、こんなのがゾロゾロと出てきてちょっと絶望的な気分に。
しかも、古いバージョンの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なページを印刷することができた。

#ref("2up.jpg")

まぁ、とりあえず目的は達したからよしとするものの、使いなれているからとpsnupにこだわりすぎたのが敗因な印象で、
pdftkあたりツールを使えばPDFレベルでの2upができた気もする。
- 2upって2ページを1枚にって事ですか? 普通にepdfviewとかではダメなんでしょうか? -- [[TenForward]] &new{2011-04-04 (月) 16:06:48};
- あー、確かにepdfviewの「印刷」->「用紙」->「レイアウト」->「1画面に2ページ」だと問題なく出ますね。当初、okularで同様のことしようとしたら、こんな感じになっちゃってダメダメだったので、

#ref("okular-ng.jpg")

hplipのプリンタマネージャから2upで印刷しようとすると内部で psnup -2upを起動してたりしたので、epdfviewの方までは気が回らなかった。 -- [[kojima]] &new{2011-04-04 (月) 17:43:51};
- こりゃ大変だ。自由な道は地雷だらけ、、 -- [[きゅうる村]] &new{2011-04-04 (月) 18:23:31};
- epdfviewでもevinceでも(AdobeReaderでも)問題なく印刷されていたので全くハマった事なかったトコでした.:-) -- [[TenForward]] &new{2011-04-04 (月) 19:56:50};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS