CUPSプリンタ/印刷ジョブをリバースエンジニアリングする方法は?

CUPSプリンタ/印刷ジョブをリバースエンジニアリングする方法は?

ローカルPDF印刷(CUPS)とGoogleクラウドプリントの間に品質の問題があります。 (GCPが良いです。CUPSを使用すると、間違ったサイズ、間違った文字、フォントが表示されますので、CUPSが何をしているのか疑問に思います!)

プリンタ自体は複数のフォーマットを扱うことができます:application / pdf(≥1.0、≤1.7)、image / jpeg、image / tiff、image / pwg-raster

数ヶ月間、私はさまざまな方法でCUPSにプリンタを追加してきましたが、CUPSがローカルネットワーク自体からプリンタを検出する「ドライバレス」方式も使用しました。

すべての場合でPDFを印刷するとエラーが発生します。正確ではありませんが、印刷は私には役に立ちません。結果:ページが約30%拡大され、2ページまたは3ページからフォントが混在し、文字が記号に変わり、段落が太字で印刷されます。

同じプリンタで Google Cloud Print で同じ PDF を印刷すると、効果が非常に良いです。 PDFをUSBスティックプリンタに直接送信することもお勧めします。 - 私のコンピュータでも同じように良い結果を印刷できることを願っています!

私の質問は次のとおりです

  • 各CUPSプリンタが実際のプリンタに送信される前に、自分のコンピュータでどのパイプラインを使用しているかを知りたいです。フォーマットを検出しますか?どのように? PDFに戻りますか?どのようなPPDを使用しますか?パイプラインはどのような他の決定を下し、どのような変換を行いますか?
  • 合格した印刷ジョブで知りたいです。 CUPSは何を検出しましたか?どんな変化を起こしますか?生成された中間出力はどこで入手できますか?

これまで、私はCUPSデバッグ/リバースエンジニアリングのための良いエントリポイントを見つけることができませんでした。私のもの私の心の中に質問があります)...

答え1

あなたは鋭い精神を持っていて壁を登ることができる隠された輪を見せればいいので、質問の一部だけに答えます。

  1. 「どんな種類のPPDを使うのか?」

    印刷キューの場合printernameローカルにインストールされます(「raw」キューではない場合)。 PPDを使用してください。/etc/cups/ppd/printername.ppd

  2. 「形式を検出できますか?どうすれば?」

    はい、そうです。デバッグロギングを有効にすると(ラインLogLevel debug存在する/etc/cups/cupsd.conf)、線が見えるエラー履歴読む「自動的にファイルをインポート...」。 (ジョブが無言のタイプを宣言した場合、自動的に入力されません。lp -d printername -o document-format=application/pdf my.pdf.)

    さまざまなMIMEタイプの分類規則は、以下に定義されています。/usr/share/cups/mime.typesおよびサフィックスと同じディレクトリにある可能性がある他のファイル*.タイプ。 (また、独自のルールを入れて、カスタムフィルタで処理する必要があるカスタムMIMEタイプを定義することもできます...)

  3. 「他のどの決定が下され、パイプラインによってどのような変化が起こりますか?」

    1. PPDに次のいずれかで始まる行がない場合*cupsFilter:またはcupsFilter2:キーワードは、最終印刷デバイスがPostScriptプリンタであると仮定します。したがって、すべてをPostScriptに変換し、PostScriptに送信するわけではありません。

    2. 1 つ以上の行がキーワードで始まる場合*cupsFilter:または*cupsFilter2:この行では、印刷デバイスが使用できるMIMEタイプを読み取り、適切なフィルタチェーンを適用して対応するMIMEタイプを作成します。

    3. 特定のMIMEタイプを処理できるフィルタは、次のリストにリストされています。/usr/share/cups/mime.convsおよびサフィックスと同じディレクトリにある可能性がある他のファイル*.変換。 (これらのフィルタで処理したいMIMEタイプにカスタムフィルタを配置できます...)

    4. これ*.変換ファイルには、そのフィルタが使用および生成できる入力および出力MIMEタイプと、この変換で発生する仮想「コスト」(整数)の名前が割り当てられます。 CUPSが構築できるさまざまなフィルタチェーンに直面すると、総コストが最も低いフィルタチェーンがapplication/alpha選択されます。application/zeta

  4. 「再びPDFに変換されますか?」

    おそらくそうではありません。要求されない限り、必要なオリジナルPDFの印刷オプションを使用してください。 1枚に2ページ以上を印刷し、小冊子を印刷するためにページを並べ替えます。それからpdftopdfフィルタを適用して次のものに変換できます。application/pdf到着application/vnd.cups-pdf

  5. 「CUPSは何を検出しましたか?」

    上記を参照してください。 「autotype file」文字列を検索してください。/var/log/error_log:

    sudo grep -A 2 "Auto-typing file" /var/log/error_log
    
  6. 「どんな変化をもたらしますか?」

    よりerror_logもう一度、次を含む行を検索します。Started filter:

    sudo grep "Started filter" /var/log/error_log
    
  7. 「生成された中間出力はどこで取得できますか?」

    これを直接行うことはできません。中間形式を作成するには、CUPSの各フィルタに対して操作を実行する必要があります。 (私できるやってみてください。準備されたレシピがありますが、それを適用するには費用を支払う必要があります。 )

    したがって、中間出力を取得するのはおそらくあなたの範囲を超えているので、他のことを行うことができます。アナログフィルタチェーンCUPSはどんな職業にも採用します。

    マニュアルページを読むと、これを行う方法がわかります。cupsfilter。 CUPSがすべての印刷キューに使用するフィルタのみを一覧表示することもできます。

    cupsfilter           \
        --list-filters    \
        -d <printername>   \
        -i <inputmime/type> \
        -m <outputmime/type> \
        -o "number-up=4 page-ranges=3-5,7,11" \
         <filename>
    

答え2

あなたの質問には、使用しているオペレーティングシステムは記載されていません。私の答えは、「PDF直接印刷」を処理するように指定されたDebian 9.6とネットワーク接続を持つKyocera FS-1350DNについてです。そこしなければならないカップPDFファイルを操作する必要はありません。

これを確認するには、カップデバッグを有効にする必要があります。残念ながらcupsctl --debug-logging(ルートとして)エラーメッセージで失敗しますcupsctl: Forbidden。 /etc/cups/cupsd.confファイルにcupdを設定しLogLevel debug、cupdを再起動した後lpr scale.pdf

/var/log/cups/error_log(合計300行)の関連行は次のとおりです。


D [11/Dec/2018:17:50:02 +0100] [Job 319] Request file type is application/pdf.
D [11/Dec/2018:17:50:02 +0100] [Job 319] 3 filters for job:
D [11/Dec/2018:17:50:02 +0100] [Job 319] pdftopdf (application/pdf to application/vnd.cups-pdf, cost 66)
D [11/Dec/2018:17:50:02 +0100] [Job 319] pdftops (application/vnd.cups-pdf to application/vnd.cups-postscript, cost 100)
D [11/Dec/2018:17:50:02 +0100] [Job 319] - (application/vnd.cups-postscript to printer/fs1350, cost 0)
I [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter /usr/lib/cups/filter/pdftopdf (PID 16570)
I [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter /usr/lib/cups/filter/pdftops (PID 16571)
I [11/Dec/2018:17:50:02 +0100] [Job 319] Started backend /usr/lib/cups/backend/socket (PID 16572)
D [11/Dec/2018:17:50:02 +0100] [Job 319] pdftops - copying to temp print file \"/tmp/040bb5c158ce7\"
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16570 (/usr/lib/cups/filter/pdftopdf) exited with no errors.
D [11/Dec/2018:17:50:02 +0100] [Job 319] 319 h scale.pdf 1 \'finishings=3 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf\'
D [11/Dec/2018:17:50:02 +0100] [Job 319] Running command line for gs: gs -q -dNOPAUSE -dBATCH -dSAFER -dNOMEDIAATTRS -sDEVICE=ps2write -sOUTPUTFILE=%stdout -dLanguageLevel=3 -r1200 -dCompressPages=false -dCompressFonts=false -dNoT3CCITT -dNOINTERPOLATE -c \'save pop\' -f /tmp/040bb5c158ce7
D [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter gs (PID 16577)
D [11/Dec/2018:17:50:02 +0100] [Job 319] Started post-processing (PID 16578)
D [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter pstops (PID 16579)
D [11/Dec/2018:17:50:02 +0100] [Job 319] %!PS-Adobe-3.0
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%BoundingBox: 0 0 595 842
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%HiResBoundingBox: 0 0 595.00 842.00
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%Creator: GPL Ghostscript 920 (ps2write)
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%LanguageLevel: 2
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%CreationDate: D:20181211175002+01\'00\'
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%Pages: 1
D [11/Dec/2018:17:50:02 +0100] [Job 319] %%EndComments
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16577 (gs) exited with no errors.
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16578 (Post-processing) exited with no errors.
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16579 (pstops) exited with no errors.
D [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16571 (/usr/lib/cups/filter/pdftops) exited with no errors.

含まれている行は、- (application/vnd.cups-postscript to printer/fs1350, cost 0)cupが後処理(プリンタドライバとも呼ばれます)/etc/cups/ppd/fs1350.ppdを使用していることを示します。同じプロセスの他のビューを表示するには、-コマンドを使用しますps。一つ抜粋出力

while true ; do date +'%N'>> log; ps axSfu | fgrep -v grep | egrep '^lp[[:space:]]|/usr/sbin/cupsd' >> log ; done

これは


root     15796  0.1  0.1 171440  8536 ?        Ssl  17:49   0:00 /usr/sbin/cupsd -l
lp       16571  0.0  0.0  77632  5728 ?        S    17:50   0:00  \_ fs1350 319 h scale.pdf 1 finishings=3 number-up=1 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf
lp       16577  0.0  0.2 129760 20836 ?        R    17:50   0:00  |   \_ gs -q -dNOPAUSE -dBATCH -dSAFER -dNOMEDIAATTRS -sDEVICE=ps2write -sOUTPUTFILE=%stdout -dLanguageLevel=3 -r1200 -dCompressPages=false -dCompressFonts=false -dNoT3CCITT -dNOINTERPOLATE -c save pop -f /tmp/040bb5c158ce7
lp       16578  0.0  0.0  77632   924 ?        S    17:50   0:00  |   \_ fs1350 319 h scale.pdf 1 finishings=3 number-up=1 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf
lp       16579  0.0  0.0  75424  5288 ?        S    17:50   0:00  |   \_ fs1350 319 h scale.pdf 1 finishings=3 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf
lp       16572  0.0  0.0  79792  5900 ?        S    17:50   0:00  \_ socket://fs1350.xxxx.xxxx.xxx 319 h scale.pdf 1 finishings=3 number-up=1 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf

cupsプリフィルタ(pdftops、PID 16571、ここではfs1350と呼ばれる)とバックエンド(PID 16572、ここではソケット://fs1350.xxxx.xxxx.xxxと呼ばれる)を呼び出すように指示します。事前フィルタ呼び出しgs。全体の処理時間は0.2秒未満なので、出力をファイルに収集することをお勧めします。date +'%N'タイミングを理解するだけです。

明らかに不要なスケーリング(コメントに書いた内容)はevince→Print→Print Setup→Scale→100%次のとおりです。静かに覆われて合格evince→Print→Page Handling→Fit to Printable Area。したがって、印刷クライアントを再確認してください。

ああ、それはすべてではありません。カップをバイパスし、プリンタの「PDF直接印刷」機能を使用するためにファイルを直接送信しました。nc fs1350.xxxx.xxxx.xxx 9100 < scale.pdf10分以上の処理時間が経過した後、プリンタは用紙を送りました。

netcatを使用した生印刷

生の印刷にはnetcatを使用してください。数字はミリメートル単位の寸法を表します。

lpr→cupsを使用して出力を印刷する

lpr→cupsを使用して出力を印刷する

1200dpiでレンダリングされたファイルのビットマップイメージ

ファイルのビットマップイメージ(1200dpi)

プリンタ設定「オーバーレイA4/LT」にかかわらず、原稿印刷の倍率は97.7%ですが、lpr→cups印刷の倍率は正常です。元の印刷物のドットゲインは小さいが、lpr→cups印刷物のドットゲインは少し少ない。

前の図面のページサイズを小さくする生の印刷が拡張されました。

答え3

ここに追加します...私はCUPS 2.3.3op2を使用してGentoo Linuxを実行しており、IPP Everywhereを介してXerox VersaLink C405にタスクを送信します。プリンタはデフォルトでPDF、PCL6、PCL5e、およびXPSだけでなく、PostScript(エミュレーションではなく実際のAdobe PostScript 3)もサポートしています。

ログのデバッグ情報で判断すると、CUPSは入力形式に関係なくPostScriptをコンピュータに送信しています。 PDFデータを次にパイプするときに表示される内容は次のとおりですlp(読みやすくするために日付は削除されます)。

[Job 61] 3 filters for job:
[Job 61] pdftopdf (application/pdf to application/vnd.cups-pdf, cost 66)
[Job 61] pdftops (application/vnd.cups-pdf to application/vnd.cups-postscript, cost 100)
[Job 61] - (application/vnd.cups-postscript to printer/vlc405, cost 0)

PDFをプリンタに直接送信するには、CUPSを完全にバイパスし、netcatを使用してプリンタのポート9100に直接データを送信できます(有効になっていると仮定)。

nc 192.0.2.0 9100 < file.pdf

(IPアドレスをプリンタのIPアドレスに置き換えてください。)

お使いのコンピュータがPostScriptまたはPDFを直接サポートしていない場合、この方法は適用されません。本物のAdobe PostScript 3は、一般的に事務用に限定された高度なレーザープリンタをサポートしています。コンシューマプリンタは、PWG RasterまたはPDFを使用してIPP Everywhereを実装できます。一部は信頼できないPostScript 3を模倣しています。 (Adobe リファレンスの実装はライセンスコストが高いため、エミュレーションが頻繁に使用されます.)

関連情報