SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaの標準機能だけで実現する帳票印刷

指定幅に文章を書くための追い出し禁則処理

Javaの標準機能だけで実現する帳票印刷 第7回

  • X ポスト
  • このエントリーをはてなブックマークに追加

追い出し禁則プログラムを呼ぶ

 上の説明で元の文字列zstrにあたるものがbunです。AdjustStringのインスタンスを作ると内部に最初の一行に書ける部分文字列strが保持されます。次のsetOidashiIfNeeded()で禁則処理が必要ならstrを一文字分減らします。文字列に続きがあるなら均等割付、なければ左寄せで書きます。続きがなくなるまで続けます。

Tsuuchi.javaの禁則処理を呼び出す部分
String kinsoku = "、。,.";
float fh = g2.getFont().getSize2D()*pt2mm*1.2f;
int ln=0;
vm += fh+2f;
if ( bundata!=null ){
    for(String bun :bundata){
        int bgpt=0;
        do{
            ads = new AdjustString(g2,bun,hwall-4f,bgpt);
            ads.setOidashiIfNeeded(kinsoku);
            if(ads.hasNext()) ads.drawKintou(hbas2+2f,vm+fh*(++ln));
            else              ads.drawLeft  (hbas2+2f,vm+fh*(++ln));
        }while((bgpt=ads.getNextPt()) > 0);
    }
}

 細かなことは不要とは思いますが、hbas2は文章を入れる枠の左辺のX座標、vmは上辺のY座標(float)です。fhは改行の幅(高さ)で、フォントサイズの1.2倍としています。lnは現在の行数で、枠内の1行目は「所見」の文字が入るため、2行目から書くようになっています。bundataは文字列のListです。bgptは文字列bunの何文字目から処理するかの数で0から始まります。getNextPt()は残りがなくなると-1を返します。

姓名の均等割付

 姓名の間を半角スペースで区切った文字列を均等割付すると姓と名の間が空きすぎます。そこで半角スペースの後は均等割付の隙間を省くようにしてみました。次の図は3つの名前をそれぞれ今までの均等割付(上)と、半角スペース後に省く均等割付(下)で比較したものです。均等割付の隙間は点線で囲っています。

姓名の均等割付
姓名の均等割付

 好みの問題もあろうかと思いますが、今回の目的のためにはこれでいいかと、AdjustStringにメソッドを追加しました。

 半角スペースが複数あっても、それぞれ省きます。

AdjustString.javaに追加する禁則処理
/**半角スペースでは字間スペースを入れない。姓 名 の均等割付に使用*/
public void drawKintouSx(float hm, float vm) {
    float hpp = 0;
    int strlen = str.length();
    if (cpct>1){
        String[] tmp = str.split(" ");
        int spct = tmp.length-1;
        float gapmmtmp = remm/(cpct-1-spct);
        int i=0;
        int nexti = 0;
        int ct = 0;
        while (strlen>i){ 
            nexti = str.offsetByCodePoints(i,1);
            g2.drawString(str.substring(i,nexti)
                    ,(hm+gapmmtmp*(ct))*mm2pt+hpp,vm*mm2pt);
            hpp = fm.stringWidth(str.substring(0,nexti));
            if (! str.substring(i,nexti).equals(" ") ) ct++;
            i=nexti;
        }
    }else{
        drawCenter(hm, vm);
    }
}

採用しなかった別の姓名の割付方法

 ワープロも一般的でなかった時代に印刷業者に依頼すると姓名の割付は次のうちのどちらかでした。1つめはは全角6文字分、2つめは7文字分で姓、名を別々に割り付けています。

 6~7文字分の幅が確保できることが分かっていれば良い方法ですが、AdjustStringのように印字幅を自由に設定する場合には、姓、名を別々にすると入らないが、全体だと入るなどという場合も想定されて場合分けが面倒です。逆に印字幅からフォントサイズを決めて配置するというのが良いかもしれません。

 どちらにしても今回はこの方法は採用しませんでした。

姓名の均等割付
全角6文字分に半角スペースを使って割り付ける
姓名の均等割付
全角7文字分に全角スペースを使って割り付ける

縦の均等割付の詳細

 縦の均等割付については、前回ですでに紹介していますが、宛名だったので、それほど細かいところまで気にしていませんでした。今回は罫線で枠を作りその中に入れるので、今更ですが解説しておきます。

 最初に出てくる「教科」の文字を例に説明します。

AdjustStringV.javaを呼び出す部分
adv = new AdjustStringV(g2, "教科",vtdtop-vthtop-6f);
adv.drawTtoB(hbas+hwkyo/2f,vthtop+3f);

 縦方向では、記入枠の縦幅はvtdtop-vthtopですが、上下に3mmずつ余白を取りたいのでコンストラクタの引数にするときは6を引きます。fはリテラルをfloatにするためです。整数ならなくても構いません。drawTtoB()メソッドの引数である縦方向の印字開始位置はvthtop+3にします。

縦の均等割付
縦の均等割付の変数の説明(縦位置)

 横方向では、記入枠の横位置はhbasから始まる幅hwkyoの部分です。drawTtoB()メソッドの横位置はこの中心を指定して、hbas+hwkyo/2です。

姓名の均等割付
縦の均等割付の変数の説明(横位置)

次のページ
教科と科目

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaの標準機能だけで実現する帳票印刷連載記事一覧

もっと読む

この記事の著者

安達 順一(アダチ ジュンイチ)

私立高校に理科・情報の教員として勤めていました。Linuxサーバー/クライアントの授業システムを作り、移動プロファイルで運用していました。教員用にもLinuxサーバーを用意し成績処理プログラムを書きました。情報の学校設定科目ではウェブページ制作とjavaのプログラミングの初歩の授業を作りました。情報...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12119 2020/08/28 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング