横長の帳票を印刷時、反時計回りに90度回転した状態で印刷されてしまう

1,506 views
Skip to first unread message

Yasuyuki Uno

unread,
Jun 26, 2014, 10:47:34 PM6/26/14
to japan-jasperse...@googlegroups.com
宇野です。

A4横(Orientaton=landscape)の帳票をJavaでJRPrintServiceExporterクラス経由でプリンタ指定して直接印刷時に、用紙の向きが90度回転して印刷されてしまいます。
普通のプリンタであれば、紙がどのような方向で出てこようが手に取ってしまえば同じなのですが・・・
富士ゼロックスのDocuWorksという電子文書に出力しようとしています。

DocuWorksをインストールしたマシンには「DocuWorks Printer」という仮想プリンタが作成され、そのプリンタに対して印刷指示をかけると電子文書が作成されます。
仮想プリンタに印刷して電子文書が作成されるのは、AdobeのAcrobatや、PremoPDFのようなPDF作成アプリと同じですね。
また、本現象はDocuWorksだけでなくAcrobatやPremoPDFでも再現します。

さらに、iReportのInternalプレビューから印刷でDocuworksやPDFプリンタを選択しても90度回転した向きで電子文書が作成されてしまいます。

ひとまずiReportのプレビューから印刷時についてはなんとか解決でき、OrientationをPortraitにした上でWidthとHeightの値を入れ替えて「PortraitなのにA4横長」という状態にすれば正常な向きで作成されました。
同様に、Orientation=Portraitで且つiReportの印刷ボタン押下時に呼びだされているメソッドJasperPrintManager.printReportを使って印刷するようにすれば一応上手くいったのはいったんですが、
この方法ではプリンタ名を指定して印刷することが出来ず、デフォルトプリンタからしか出力できないのが問題です。

出来ればプリンタ名を引数として直接印刷できるJRPrintServiceExporter経由で、A4横の帳票を真っ直ぐ出したいです。何か良い方法がありましたらお願いします。

iReport、JasperReportsのライブラリともに3.6.1を使っていましたが、5.xを使っても同じような模様でした。

荒川雄介

unread,
Jun 27, 2014, 4:27:31 AM6/27/14
to japan-jasperse...@googlegroups.com
 お久しぶりです。
荒川です。

import javax.print.attribute.PrintRequestAttributeSet;

PrintRequestAttributeSet attributes =new HashPrintRequestAttributeSet();
attributes.add(OrientationRequested.Landscape);

印刷時に、こいつを食わせてもダメですか?

2014年6月27日金曜日 11時47分34秒 UTC+9 Yasuyuki Uno:

Yasuyuki Uno

unread,
Jun 27, 2014, 6:57:56 AM6/27/14
to japan-jasperse...@googlegroups.com
荒川さん、返信ありがとうございます。

attributes.add(OrientationRequested.LANDSCAPE);
を食わせてもダメですね。

帳票のOrientationをLandscapeにした状態、Portrait且つwidth/height入れ替えた状態でそれぞれ試していますが、上手くいきません。
ヤケクソで
attributes.add(OrientationRequested.PORTRAIT);
を指定してももちろんダメです。

JRPrintServiceExporterのソース(http://grepcode.com/file/repo1.maven.org/maven2/net.sf.jasperreports/jasperreports/3.6.1/net/sf/jasperreports/engine/export/JRPrintServiceExporter.java#JRPrintServiceExporter)もいじってみてるんですが・・・

中身のデータの向きはともかく、用紙の向きがA4横になってくれないんですよね。
用紙の向きがきちんと横にさえなれば、あとはなんとでもなりそうなのですが。

Acrobat経由で出したPDFを添付します。


2014年6月27日金曜日 17時27分31秒 UTC+9 荒川雄介:
回転してしまう.pdf

hozawa

unread,
Jun 29, 2014, 6:50:48 PM6/29/14
to japan-jasperse...@googlegroups.com
お早うございます。小沢です。

JasperReportの中にdemo\samples\printserver\srcに印刷サンプルプログラムがあります。
ant compileした後にant printすると印刷されます。
次にお2行を追加してDocuCenterに出力しましたが、A4横に印刷できました。ご確認をお願いします。
①import javax.print.attribute.standard.OrientationRequested;

  PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
  printRequestAttributeSet.add(MediaSizeName.ISO_A4);
 ②printRequestAttributeSet.add(OrientationRequested.LANDSCAPE);

小沢

2014年6月27日金曜日 19時57分56秒 UTC+9 Yasuyuki Uno:

Yasuyuki Uno

unread,
Nov 20, 2014, 4:24:28 AM11/20/14
to japan-jasperse...@googlegroups.com
すみません、返信するのを忘れておりました。

顛末なのですが
iReportのプレビューから印刷するときと、Javaから普通に出力するときは何が違うのだろうと
iReportのコードを読んでみました。

【iReportのプレビューから印刷時】
JasperPrintManager.printReport(print, true); で印刷してるっぽい。

【これまで僕がJavaで印刷してた方法】
JRPrintServiceExporter.exportReport(); で印刷しています。

ということで、JRPrintServiceExporterからではなくJasperPrintManagerで印刷するようにしたら上手くいきました。
なお、JasperPrintManager.printReportの第二引数はプリンタを選択するダイアログを表示するかどうかのパラメータですが、
今回はDocuWorksをデフォルトプリンタに登録するということにし、引数をfalseにしました。

宇野

2014年6月30日月曜日 7時50分48秒 UTC+9 hozawa:

Yasuyuki Uno

unread,
Nov 20, 2014, 4:32:33 AM11/20/14
to japan-jasperse...@googlegroups.com
あ、iReportで呼び出してる関数を使ったら一応上手くいったっていうのは僕が最初に投稿してたんですね。
すみません。

プリンタ名を指定して印刷するときには、ちょっと無理矢理っぽいんですがJRPrintServiceExporterを使わず、
JRPrintServiceExporterのソースコードを丸々コピーして別クラスCustomJRPrintServiceExporter.javaを作りました。

JRPrintServiceExporterの中でPageHeightとPageWidthの大小でPortraitかLandscapeか設定しているif文があったため、
コメントアウトして常にPortraitになるように書き換えました。
そうするとプリンタを指定してDocuWorksに出力するときにも一応上手く出力されるようにはなりました。

宇野

2014年11月20日木曜日 18時24分28秒 UTC+9 Yasuyuki Uno:
Reply all
Reply to author
Forward
0 new messages