μm単位での用紙サイズが得られた。葉書とA4についてはMediaSizeも得られ、これからMediaSizeNameを再取得できた。MediaSizeから、MediaSizeNameと、X,Yを得られることになっている。いうメソッドがあって、用紙のサイズからMediaSizeNameを求めるもの。これも葉書とA4ではうまく行くが、長3封筒ではだめ。//iso-a4CUPSのデフォルト設定493をA4に設定し直す。Expand666は235mm÷25.4×72で72dpiでのドット数。設定頁1設定頁2設定完了A4でプログラムし、ダイアログでハガキに変えてみるMediaSizeNameをA4に設定してそこから始めているプログラムである。}このプリンタが出るのはデフォルトプリンタだから指定通りA4でマージンも指定通りここは設定できるものがないここを葉書にするとプログラムの出力。4iso-a4(5.1,4.8)->(200.0,287.0)mmportraitnormal葉書に設定したので2回目のダンプでこのようになる5japanese-postcard(5.1,4.8)->(90.0,138.0)mmportraitnormal1この逆も画面で見る限りはうまく行っている様に見えるしかし実際の印刷はこの指定のとおりにならず、A4全体に広がり文字は崩れる。MediaSizeスタートでA4MediaSizeからMediaSizeNameを得る方法は2つ。後者は大きさから近いものを選択してくれる期待をしたがそうではなかった。長3号はMediaSizeNameがないのでMediaSizeスタートする必然がある。}長3が見つからないのでA4になっていて、マージンも狂っている。あるので選択してみる。プログラムの出力では、Java側ではnullなので指定しないでダイアログを呼び出す。用紙の大きさは得られているので、Setには正しく入力されている。(110.0,225.0)はマージンを引いた長3の値。(B)null3portrait(5.1,4.8)->(110.0,225.0)mmnormalしかし、ダイアログには長3を設定しなかった分、A4になり、マージンが狂うのではないか。設定後、戻った時のSetは次のようになる。(19.944,162.95)は不明。A4でもポストカードでもない。長3に設定しなければA4になる。#3各用紙の名前と大きさJavaのマニュアルのMediaSizeNameには名前しかない。MediaSizeには長さが書いてあるので、必要なものだけ転記しておく。フィールド値10x13などのxは大文字小文字で揺れがある。mmなお、型の字を使っているが、形が正しいようだ。MediaSizeNameにない名前MediaSizeにあって、MediaSizeNameにないものは、JISの封筒関係の24件だけ。逆にMediaSizeNameにあってMediaSizeにないものが、ISOのC0,C1,C2の3件。MediaSizeには94、MediaSizeNameには73の登録がある。近い紙JIS.CHOU_3に近い大きさの封筒。Javaにあってもプリンタ(特に日本のだからか)に無い場合もある。228.6mmプリントサービスを使ってみるPrintServiceのこと。PrintRequestAttributeSetのインスタンスを観察する中、プリンタのもつ選択肢が反映されているようにも見えるが、確信が持てない。同じ選択肢が2つずつ現れる場合もある。こちらで設定したPrintRequestAttributeSetを用いての印刷はこちらから一方的にリクエストすることになるイメージがある。使用経験があまりないが、プリントサービスを使って設定にあったプリンタを探すというアプローチなら、うまく要求が伝わるかもしれない。いうことで、やってみる。プログラムの流れは、(1)設定したPrintRequestAttributeSetのインスタンスで、サービスをlookupする。}印刷もするが、画面出力は次の通りPrintRequestAttributeSetではJAPANESE_POSTCARD;を指定。プリンタ(Canon_MP493_series)のCUPSデフォルトはA4。PrintRequestAttributeSetの確認ではうまく行っているが、印刷はだめ。4portrait(5.1,4.8)->(90.0,138.0)mmjapanese-postcard1プリントサービスを使っても改善されない印刷は、はみ出すとか、拡大縮小されるとか、位置が狂うとかではなく、話にならない。あとで判明するが、次の項目を設定しなければ「Shrink」になっていて、ハガキがA4に拡大される。逆にプリンタの設定範囲以上に書かせようとすると縮小される。このため郵便番号に数字が合わなくなりCropに変更していたのが下記のスキャンを産んだ。Expandでも同様に点々になる。area)どちらにしても、MediaSizeNameの問題のないA4と葉書ですでにうまくいかない。LibreOfficeではA4デフォルトのプリンタに印刷できるし、EPSONのPX-1700FでA4,A3,B5の間でもあった(この時はShrinkだった)ことなので、OS,プリンタ,の問題ではなくJavaの問題ではないかと疑われる。プリントサービスはリクエストに合致したサービスを検索するという触れ込みだったので、PrintRequestAttributeSetを先に用意したが、サービスを選んでから設定してprint時に指定する例が多く見られる。これはこうしなければうまく行かないということなのかもしれない。用紙別にプリンタを用意するMediaSizeNameに長形3号がないのも問題ではあるが、名前のあるものを使ってもJavaから用紙の変更ができないので、最終手段。A4,葉書、長形3号のそれぞれのプリンタの設定を用意してこれを切り替えることを試みる。/etc/cups/ppdにファイルがある。これはプリンタの対応する用紙や解像度などの条件が書かれたテキストファイルで用紙のデフォルトもここに書かれている。上の「CUPSのデフォルト設定」に前回A4にしたときの様子がある。EPSON_EPSON_PX-1700F.ppd.Oこれをコピーして増やしても認識されない。その方法を探るうち新規プリンタの追加でppdファイルを指定すれば良いことを思いついた。ppdファイルを適当な所にコピーしておき、追加時にプリンタ名を適当な名前にしてからドライバ設定でそのppdファイルを指定すると/etc/cups/ppdにコピーされる。続けて言われるままにデフォルトを設定して用紙と印字品質などを変更する。設定が終わると現在値が示されるというわけで普通のプリンタと、長形3号用、A4用、ハガキ用の4つができた。sides=one-sidedPX-1700Fと合わせて5つになる。使ってみるA4用が[0]なのでこれが最初に出る。用紙設定はchou3なのだが、このMediaSizeNameを指定できないのでデフォルトのA4になっている。マージンの左と上は指定通りで指定の幅と高さをA4から引いたものが右と下なのだろう用紙はそのままにして、プリンタをchou3にしたところ、うまく印刷できた。用紙設定も変えるとマージンも変えなければ印刷範囲が異常に狭くなってしまう。目視で変更を確認できないのは不満ではあるが、用紙設定を手動で変えなくてもいいのであれば、これはこれでも容認できる。ちなみにプリンタをchou3にしなくてもうまく行くこともある。これはA4のままマージンを多く調整しているので、A4のまま印刷してもちょうどよいということらしい。A4の左側に印刷されるので、小さな紙はセンターに配置するMP493ではまずい。ハガキは齟齬が生ずるのでだめ。インスタンスを引数にプリンタを探す。PrintServiceLookup.lookupPrintServices(flavor,prset);デフォルトの用紙で選択するのではなく対応可能な用紙での選択なのですべてが選択される。A3など明らかに対応不可な条件では候補に入らないので、条件は伝わっているようではある。指定した用紙をデフォルトにするプリンタサービスを自動で特定するデフォルトの用紙を知る方法や、用紙の名前の統一など不確実なところが多いので、プリンタ名に加えた文字列で識別してサービスから一つを選び出す。これで、psvs[cdsv]が用紙が合致したプリンタということになる。ダイアログを表示する。本来は合致したプリンタ候補からプリンタを選ぶためのものらしい。インスタンスを再び指定しているのは冗長な気もする。400,400は表示する座標の指定。画面中央や相対指定はない。印刷するサービスからジョブを作り、SimpleDocをPrintableから作って、3度PrintRequestAttributeSetのインスタンスを添えて印刷する。実際にはtry-catchが必要。3度なのは、指定を反映したいということから、しつこく要求した結果である。してもだめということで、デフォルトの異なるプリンタサービスを用意したのであって、そうであるならば3度もいらないかもしれない。#31http://www.cresc.co.jp/tech/java/jps/JPS.htmhttps://www.eeb.co.jp/wordpress/?p=384印刷の手順2結局、用紙の指定がうまく行かなかったので、Service中心で考えていくメリットがなくなった。実はもっとクラスServiceUIFactoryまで考えるとできる可能性もあるのだが、今回はここまでにしておく。すると、ServiceUI.printDialog()の位置指定やSimpleDocの利用の意味が薄れる。インスタンスを引数にプリンタを探す。PrintServiceLookup.lookupPrintServices(flavor,prset);デフォルトの用紙で選択するのではなく対応可能な用紙での選択なのですべてが選択される。A3など明らかに対応不可な条件では候補に入らないので、条件は伝わっているようではある。DocFlavorなどを要求しない方法もある。今回はこれでもできる。指定した用紙をデフォルトにするプリンタサービスを自動で特定するデフォルトの用紙を知る方法や、用紙の名前の統一など不確実なところが多いので、プリンタ名に加えた文字列で識別してサービスから一つを選び出す。これで、psvs[cdsv]が用紙が合致したプリンタということになる。ダイアログを表示する。PrinterJob.getPrinterJob()でまず、何もないところからPrinterJobを取得し、それにsetPrintService()で(2)で選んだサービスを結びつける。PrinterJob#printDialog()でダイアログを出す。印刷するSimpleDocもいらず、単純になる。);印刷の手順2のプログラム途中の確認のための出力を削ったので見通しが良くなっている。}用紙の目途がついて印字品質も試してみた。するとプリンタサービスが見つからなくなる。//NORMAL;prset.add(pq);ダイアログでも常に灰色になって選択できない。ブラウザでのCUPSの設定ではQualityはNORMALとMANUAL。設定を変えても変わった様子がない。するなどすると印字時間が長くなって切り替わったことがわかる。Java側からはできていない。printableなクラス上記で使ったprintableなクラス。印刷内容はこちらで決まる前に作ったものの流用。今回はmainを使っていない。後部の手差しトレイから紙を入れる。小さい紙は中央に寄せてセットするタイプ。以下A4,長3,葉書で印刷したが、印刷範囲の比較のため、すべてA4用紙に出力した。安達順一(2018-12-10)https://dabiyone.com/。