Drawを帳票ツールとして使う

##はじめに
やってまいりました。
[LibreOfficeアドベントカレンダー2014](http://www.adventar.org/calendars/507)の季節です。
[Shinji Enoki](https://twitter.com/eno_eno)さんに続き15日目担当です。


##テーマはDraw
みなさん、知ってましたか？
DrawでPDF作成できるですよ。
それもPDFフォームも作れてしまいます。

ExcelやWordで作っているお申込みフォーム、
あれは本来PDFフォームでスマートにやるべきです。

DrawでPDFを作ってみます。
###DrawでPDFを作成する

名前のテキストボックスと
性別のドロップダウンリストを作って
PDFで保存しましょう。

####起動
1. LibreOffice Drawを起動
 - 用紙設定はA4縦に設定されています。
 - そのまま行きましょう。

####テキストボックスを作る
1. [表示] > フォームコントロール
  - フォームコントロールツールバーがでます。
  - 手のマーク、デザインモードをOnにします。
2. テキストボックスを選択して用紙に書きます。
  - 用紙の端から端まで大きく
  - そのまま右クリック
3. コントロールを選択
 - 名前に name と入れます。
 - フォントを少し大きくしておきましょう。
 - フォントを選択
 - フォントサイズを32ptにします。
4. ×で閉じます

####コンボボックスを作る
1. 次にコンボボックスを選択して用紙に書きます。
2. そのまま右クリック
3. コントロールを選択
  - 全般タブの名前にgenderと入れます。
  - 全般タブの下の方のリストの項目に入力します。
  - 不明と書き[Shift]+[Enter]
  - 男と書き[Shift]+[Enter]
  - 女と書き[Shift]+[Enter] 
  - 適応不能と書き[Shift]+[Enter]
  - フォントを選択しフォントサイズを32ptにします。
4. ×を押して閉じます。

性別なのに何で、不明とか適応不能とかあるんだ？
詳しい説明は[こちらの記事にて](http://qiita.com/yuba/items/567f8f47c9bb5a20200e)

####PDFに書き出し
1. これをPDFに書き出します。
 - [ファイル] > [PDFとしてエクスポート]を選択
 - デスクトップに名前を付けて保存します。

これで完成です。
作成したPDFを開いて自分の名前が書けるか、
性別が選べるか確認してみましょう。

##PDFフォームを帳票テンプレートに
このPDFフォームを帳票テンプレートにしてしまいます。
フォームに内容を挿入できるプログラムが書ければ、
帳票ツールとして機能するはずです。

###エンドユーザーにも使える帳票設計ツールを
JavaならiText、
C#ならiTextSharp、
PHPならTCPDF等とPDFを生成するAPIはありますが、
全てこの座標軸に文字を置くといったような、
プログラムでレイアウトを記述しないといけません。

End User(一般社員)では無理です。
でもDrawで作るPDFであれば、
End Userも使えて自由にレイアウト変更ができるでしょう。

レイアウト変更は現場から挙がってきます。
現場で変更してあげるようにしてやれば、
情報システム部のような人が他の業務を止めて、
ヒアリングをして帳票設計をする。
相互理解が足りなかったので作り直し…
といった面倒な時間を節約することができます。

###プログラムでPDFフォームにデータ挿入
私の調査では、以下の言語のライブラリーであれば入力フォームに
データを差し込むことができるようです。

- Java
    - iText
- C#
    - iTextSharp
- Perl
    - CAM::PDF
- Python
    - fpdfgen + pdftk.exe

ここでちゃんと試せたのはJavaだけです。
Javaのソースコードを書いて置きます。

```java:AcroFieldを使ってフォームに差し込み

package fillpdfform;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 *PDFフォームに任意の値を入れる
 * 
 * @author yusuke
 */
public class ITextPDFForm {
    
    public static final String pdfform="C:/Users/yusuke/pdfform.pdf";
    public static final String fillpdfform="C:/Users/yusuke/fillpdfform.pdf"; 
    
    public void manipulatePdf(String src,String dest)throws IOException,DocumentException{
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(dest));
        AcroFields form = stamper.getAcroFields();
        //フォームにテキストを挿入する処理
        form.setField("name", "荒川さん"); //TextBox
        form.setField("gender","男"); //ComboBox
        stamper.close();
    }

    /**
     * @param args the command line arguments
     * @throws com.itextpdf.text.DocumentException
     * @throws java.io.IOException
     */
    public static void main(String[] args) throws DocumentException, IOException {
        // TODO code application logic here
        ITextPDFForm example = new ITextPDFForm();
        example.manipulatePdf(pdfform,fillpdfform);
    }
}
```

ソースはGitHubに置いておきます。
[iTextFillPDFFrom](https://github.com/arachan/iTextFillPDFFrom)

本当はPerl,Pythonでもやってみたかったのですが、
今回は時間切れです。


##参考サイト
[ITEXT IN ACTION: CHAPTER 8: FILLING OUT INTERACTIVE FORMS
PART2.CHAPTER08.TEXTFIELDS](http://itextpdf.com/examples/iia.php?id=157)


次は、16日目 [Souichiro.ishikawa](https://www.facebook.com/souichirho.ishikawa)さん
[Calcで指数平滑 | Techinal Convolution](http://www.sawakaze.net/sishikawa/?p=273)です。