SSブログ

[増刊号 001] PDFを2up印刷する設定 [UNIX環境]

横長のPDFドキュメントを2upで印刷してみました。
acroreadで普通にpage scalingでmultiple pages per sheetでは「印刷ページ無し」と言われるドキュメントの印刷で苦労したので、メモです。
【プリンタ】
Brother MFC-460CN

【現象】
acroreadの印刷で直接プリンタキューに送っても、CUPSのログに「印刷するページ無し」と言われる。

【方針】
acroreadから一旦PSのファイルにし、ghostscriptでページがあることを確認して、それをプリンタに送る。

1. PDF->PS化
acroreadの「印刷」で、出力をファイルに指定して実行します。但し、2upにしたいので、ここで
Page Scaling: Multiple pages per sheet
Pages Per Sheet: 2
Auto-Rotate Pages
Orientation: Portrait
とします。Auto-Rotate無しでLandscapeでもできそうですが、印刷方向の指定が分からず、縦向きに横印刷したり横向きに縦印刷になったりしたので、上記の設定にしています。

2. GhostScriptで確認
縦置きで2upになっていればOKです。上下逆さまでも問題ないです。(プリンタで穴開けたり閉じたりしないのであれば)

このPSを印刷してもやはり「印刷するページ無し」と言われてしまいました。しかたがないので、自分でフォーマット変換を行いました。

3. プリンタフィルターで変換
私のプリンタのフィルターは
/usr/lib/cups/filter/brlpdwrappermfc460cn

で、ただのシェルスクリプトでした。引数にいろいろ取るようですが、手動で起動する場合はどうでもよいものばかりのようでした。

/usr/lib/cups/filter/brlpdwrappermfc460cn
67 toshi test.ps 1 "media=BrA4_B finishings=3 number-up=2 BRBiDir=ON
BRBlue=0 BRBrightness=0 BRColorEnhancement=OFF BRColorMatching=Natural
BRColorMediaType=Plain BRColorPaperThick=Regular BRContrast=0
BRDocument=Graphics BRGreen=0 BRHalfTonePattern=Diffusion
BRMonoColor=BrColor BRRed=0 BRSlowDrying=OFF MirrorPrint=OFF
PageRegion=BrA4_B PageSize=BrA4_B Resolution=Normal" ""
4番目の引数はプリンタへの指定のようなので、付けてみました。それ以外は前回の印刷時のままです。

これはフィルターコマンドなので、標準入力からPSファイルを読み、標準出力に結果を出します。適当にリダイレクトしてください。

※ただし!Brotherから提供されているフィルタで一部バッファオーバーランのバグがあり、上の引数(長さ)だと落ちます。それを送っても印刷できないようです。修正したdiffは記事の最後に付けています。
ソースコードの取得元はここ

4. 印刷
既にプリンタのフォーマットになっているので、変換せずに直接送ればいいです。
$ lpr -Pmfc460cn -l test.mfc
結構時間がかかりましたが、なんとか出力出来ました。

--- brcupsconfig.c~ 2008-01-29 10:23:00.000000000 +0900
+++ brcupsconfig.c 2010-11-28 01:25:59.000000000 +0900
@@ -23,6 +23,7 @@
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
+#include <alloca.h>

#include "brcups_commands.h"

@@ -642,7 +643,7 @@
#define MEDIAEQ2 "PageSize="

int divide_media_token(char *input,char output[5][30]){
- char media_command[100];
+ char *media_command = alloca(strlen(input) + 1);
char *p,*pp;
int i;

@@ -661,10 +662,11 @@



+/*
media_command[sizeof(media_command)-1] = 0;
media_command[sizeof(media_command)-2] = 0;
media_command[sizeof(media_command)-3] = 0;
-
+*/

p = strchr(media_command,' ');
if(p)*p =0;
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。