##はじめに
やってまいりました。
LibreOfficeアドベントカレンダー2014の季節です。
Shinji Enokiさんに続き15日目担当です。
##テーマはDraw
みなさん、知ってましたか?
DrawでPDF作成できるですよ。
それもPDFフォームも作れてしまいます。
ExcelやWordで作っているお申込みフォーム、
あれは本来PDFフォームでスマートにやるべきです。
DrawでPDFを作ってみます。
###DrawでPDFを作成する
名前のテキストボックスと
性別のドロップダウンリストを作って
PDFで保存しましょう。
####起動
- LibreOffice Drawを起動
- 用紙設定はA4縦に設定されています。
- そのまま行きましょう。
####テキストボックスを作る
- [表示] > フォームコントロール
- フォームコントロールツールバーがでます。
- 手のマーク、デザインモードをOnにします。
- テキストボックスを選択して用紙に書きます。
- 用紙の端から端まで大きく
- そのまま右クリック
- コントロールを選択
- 名前に name と入れます。
- フォントを少し大きくしておきましょう。
- フォントを選択
- フォントサイズを32ptにします。
- ×で閉じます
####コンボボックスを作る
- 次にコンボボックスを選択して用紙に書きます。
- そのまま右クリック
- コントロールを選択
- 全般タブの名前にgenderと入れます。
- 全般タブの下の方のリストの項目に入力します。
- 不明と書き[Shift]+[Enter]
- 男と書き[Shift]+[Enter]
- 女と書き[Shift]+[Enter]
- 適応不能と書き[Shift]+[Enter]
- フォントを選択しフォントサイズを32ptにします。
- ×を押して閉じます。
性別なのに何で、不明とか適応不能とかあるんだ?
詳しい説明はこちらの記事にて
####PDFに書き出し
- これを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のソースコードを書いて置きます。
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
本当はPerl,Pythonでもやってみたかったのですが、
今回は時間切れです。
##参考サイト
ITEXT IN ACTION: CHAPTER 8: FILLING OUT INTERACTIVE FORMS
PART2.CHAPTER08.TEXTFIELDS
次は、16日目 Souichiro.ishikawaさん
Calcで指数平滑 | Techinal Convolutionです。