web-dev-qa-db-ja.com

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

PDFローカルプリント(CUPS)とGoogleクラウドプリンティングの品質に問題があります。GCPの方が優れています。CUPSを使用すると、サイズ、文字、フォントが正しくありません。そのため、 CUPSはあります!)

プリンターは、application/pdf(≥1.0、≤1.7)、image/jpeg、image/tiff、image/pwg-rasterの2つの形式をネイティブに処理できます。

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

すべての場合で、PDFエラーで印刷されますが、完全ではありませんが、印刷は役に立たないものになります。何が起こるか:ページが2〜3ページから始まって、最大30%拡大され、フォントが取得されます混同、文字が記号に変わる、段落が太字で印刷されるなど...

同じプリンタでGoogleクラウドプリントを介して印刷すると、同じPDFが優れた結果になります。 PDFを使用してUSBスティックをプリンタに直接供給することも同様に優れています。–コンピュータからの印刷でも同じ結果を得たいです!

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

  • 実際のプリンターに送信する前に、各CUPSプリンターが自分のマシンでどのパイプラインを使用するかを知りたいです。フォーマットを検出しますか?どうやって?再びPDFに再変換されますか?どのPPDが使用されますか?パイプラインは他にどのような決定を行い、どのような変換を行いますか?
  • 合格した印刷ジョブから知りたい:CUPSは何を検出しましたか?どのような変換を行いましたか?生成された中間出力はどこで取得できますか?

これまでのところ、CUPSデバッグ/リバースエンジニアリングの適切なエントリポイントは見つかりませんでした(myの質問を念頭に置いて)...

6
Robert Siemer

私はあなたの質問の一部だけに答えています。あなたは壁を登るためにいくつかの隠されたフックを見せられるだけでよい鋭い心を使っているようです:

  1. 「どのPPDを使用しますか?」

    Printqueue printernameがローカルにインストールされている場合(および「raw」キューでない場合)、PPD /etc/cups/ppd/printername.ppdを使用します。

  2. 「フォーマットを検出しますか?どうやって?」

    はい、そうです。デバッグログを有効にしている場合(/etc/cups/cupsd.confの行LogLevel debug)、error_log reading "Auto-typing file .. 。 "。 (lp -d printername -o document-format=application/pdf my.pdfのように、ジョブがすでにmimeタイプを示している場合、自動入力は行われません。)

    さまざまなMIMEタイプを分類するためのルールは、/usr/share/cups/mime.typesおよび* .typesが付いた同じディレクトリにある他のすべてのファイルで定義されます。 (独自のルールをそこに配置して、独自のカスタムフィルターで処理する必要がある独自のカスタムMIMEタイプを定義することもできます...)

  3. 「パイプラインは他にどのような決定を下し、どのような変換を行っていますか?」

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

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

    3. 特定のMIMEタイプを処理できるフィルターは、/ usr/share/cups/mime.convsと、同じディレクトリに接尾辞*.convsが付いている可能性のある他のすべてのファイルにリストされています。 (これらのフィルターで処理したいMIMEタイプ用に独自のカスタムフィルターを配置できます...)

    4. * .convsファイルは、それぞれのフィルターが消費および生成できる入力と出力のMIMEタイプ、およびそのような変換によって発生する仮想「コスト」(整数のみ)に名前を付けます。 CUPSがapplication/alphaからapplication/zetaに移動するために構築できるさまざまなフィルタリングチェーンに直面した場合、合計コストが最も低いものを選択します。

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

    おそらくない。オリジナルに使用する印刷オプションを要求した場合を除き、PDF必要な場合:ある範囲のページのみを印刷する、1枚の用紙に2ページ以上を印刷する、拡大縮小する;ブックレット印刷などのためにページを再編成します。次に、pdftopdfフィルターを適用して、application/pdfapplication/vnd.cups-pdfに変換します。

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

    上記を参照:/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
Kurt Pfeifle

あなたの質問はあなたが使っているOSを特定していません。私の答えは、Debian 9.6と、「PDFダイレクトプリント」を処理するように指定されているネットワーク接続された京セラFS-1350DNです。カップがPDFファイルを改ざんする必要はありませんshould

確認するには、cups-debuggingを有効にする必要があります。残念ながら、_cupsctl --debug-logging_(rootとして)はエラーメッセージ_cupsctl: Forbidden_で失敗しました。ファイル/etc/cups/cupsd.confに_LogLevel debug_を設定してcupsdを再起動した後、_lpr scale.pdf_を使用して印刷ジョブを送信しました。このファイルには、CADプログラム(グレースケールなし)からのライングラフィックが含まれ、100%のスケールで印刷されました。

/ 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)を含む行は、cupsがポストプロセッサー(別名プリンタードライバー)/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、ここではfs1350という名前のPID 16571)とバックエンド(ここではsocket://fs1350.xxxx.xxxx.xxxという名前のPID 16572)を呼び出すことを伝えます。プレフィルターは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.pdf_。 10分以上の処理時間の後、プリンターは用紙を発送しました。

Raw print using netcat

Netcatを使用した生の印刷では、数字はmm単位のサイズを反映しています。

Printout using lpr→cups

Lpr→cupsを使用した印刷

Bitmap image of the file rendered with 1200 dpi

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

プリンター設定「OverrideA4/LT」に関係なく、生の印刷のスケーリングは97.7%ですが、lpr→cups印刷のスケーリングは問題ありません。生のプリントには小さなドットゲインがありますが、lpr→cupsプリントは少し貧弱です。

raw印刷前に図面のページサイズを縮小すると、縮尺が大きくなります。

0
hermannk