2010年9月16日木曜日

用紙定義を使ってPDF文書を作成する:(1)

定義情報を読み込む
以前作成した、GEFを使ったRCPサンプル(用紙定義ツール)は、用紙定義を行うものでした。この定義ファイルを他のアプリケーションで利用してPDF 文書を作成したいと思います。

PDF 文書は iText を使って作成します。よって、アプリケーションのプロジェクトパスに iText のライブラリを追加する必要があります。

連絡先管理アプリケーションなど、住所データを扱うアプリケーションはたくさんあります。住所情報と用紙定義情報を使って宛名印刷を行う場合を考えます。

例えば下の図に示すように、連絡先管理アプリケーションの連絡先一覧表示で、選択されている連絡先の宛名を印刷する場合を考えてみましょう:


メニューから宛名印刷を選択すると、ファイル選択ダイアログが表示されるので、印刷したい宛名用紙の定義ファイルを選択します。選択した用紙定義ファイルの内容は例えば以下のようなものとします。
$,C:/$mydoc/_用紙定義/用紙画像/封筒茶表96DPI.jpg,96
------------------------------------
1,123-4567,164,38,HG祥南行書体|28|標準|黒,横,-1,有,左
2,宛先住所1,265,99,HG祥南行書体|28|標準|黒,縦,0,有,左
3,宛先住所2,230,117,HG祥南行書体|28|標準|黒,縦,0,有,左
4,宛先住所3,195,192,HG祥南行書体|28|標準|黒,縦,0,有,左
5,宛名氏名1,148,98,HG祥南行書体|32|標準|黒,縦,0,有,左
.
$,C:/$mydoc/_用紙定義/用紙画像/封筒茶裏96DPI.jpg,96
------------------------------------
1,123-4567,169,181,HG祥南行書体|14|標準|黒,横,-1,無,左
2,東京都千代田区,206,212,HG祥南行書体|18|標準|黒,縦,0,無,左
3,千代田1-2-3,183,221,HG祥南行書体|18|標準|黒,縦,0,無,左
4,,160,250,HG祥南行書体|18|標準|黒,縦,0,無,左
5,差出人氏名,139,289,HG祥南行書体|24|標準|黒,縦,0,無,左
.


用紙定義のモデルは、GEFで使ったモデルからGEF関連情報を除いたものです。

ページ定義:
/**
* PDFページ定義クラス.
* PDFページ定義ファイルから読み取った定義情報を保存する。
*/
public class PageDef {

   private String name;
   private String imageFileName; // 用紙画像の絶対パス
   private int scanDPI;            // 画像をスキャンしたときのDPI
   private List<ItemDef> itemList = new ArrayList<ItemDef>();

...

}

項目定義:
/**
* PDF項目定義クラス
* PDF項目定義ファイルの情報を保管する。
*/
public class ItemDef {
  
   //用紙定義ファイルの項目定義データの内容
   //0:ID, 1:項目名, 2:x, 3:y, 4:フォント名, 5:サイズ, 
   //6:方向, 7:スタイル, 8:色, 9:ピッチ, 10:置き換え
   public static final int C_ID = 0;
   public static final int C_NAME = 1;
   public static final int C_X = 2;
   public static final int C_Y = 3;
   public static final int C_FONT = 4;
   public static final int C_HOKO = 5;
   public static final int C_PITCH = 6;
   public static final int C_OKIKAE = 7;
   public static final int C_ALIGN = 8;
  
   public static final int E_NAME = 0;
   public static final int E_SIZE = 1;
   public static final int E_STYLE = 2;
   public static final int E_COLOR = 3;   

   private String id;
   private String name;
   private int x;
   private int y;
   private String fontStr="HG祥南行書体|12|標準|黒";
   private String hoko = "横"; // 縦, 横
   private float pitch;
   private String okikae = "無"; // 0:置き換える
   private String align = "左";

...

}


以下のメソッドにより、指定した定義ファイルから定義情報を読み込みます。
    public static List<PageDef> readFile(File file) {

       // PdfYoshiDef Listを作成
       List<PageDef> yoshiList = new ArrayList<PageDef>();

       Scanner scanner = null;
       try {
           scanner = new Scanner(file);
       } catch (FileNotFoundException e) {
           // エラーの場合定義リストは空
           return null;
       }
       scanner.useDelimiter(System.getProperty("line.separator"));
       String line;
       int count = 1;
       int x0 = 30;
       while (scanner.hasNext()) {
           line = scanner.next();
           if (line.startsWith("--")) {
               // 注釈行は読み飛ばす
               continue;
           }
           if (line.startsWith("$")) {
               // PDF用紙情報を取得 $,画像ファイルパス,スキャンDPIの構造を想定
               PageDef pageDef = new PageDef();
               String[] heads = ToolUtil.getTokenArray(line, new String[] {
                       "", "", "200" }, "\\s*,\\s*");
               pageDef.setName(file.getName() + " - " + count);
               pageDef.setImageFileName(heads[1]);
               pageDef.setScanDPI(Integer.parseInt(heads[2]));

               double keisu = 1.0;
               while (scanner.hasNext()) {
                   line = scanner.next();
                   if (line.startsWith("."))
                       break;

                   if (line.startsWith("--")) {
                       // 注釈行は読み飛ばす
                       continue;
                   } else {
                       ItemDef itemDef = parseLine(line);
                       int x = (int) (itemDef.getX() * keisu);
                       int y = (int) (itemDef.getY() * keisu);
                       pageDef.getItemList().add(itemDef);
                   }
               }
               yoshiList.add(pageDef);
               count++;
           }
       }
       scanner.close();
       return yoshiList;
   }


上記コード中の parseLine()メソッドは、リード行を解析して、項目定義オブジェクトを返します。

次は読み込んだ用紙定義を使って PDF 文書を作成します。

0 件のコメント: