Home • ChemFormatter • iText.NET • JFreeChart.NET • ConcatPDF • iTextFront • TIFF2PPT • J by J# • Programming J#
MSN Search

iText.NET

iText .NET
@SourceForge
ライセンス
更新履歴
ダウンロード
使い方
J# Examples
C# Examples
VB.NET Examples
コンパイル
ConcatPDF
iText (Java)
J by J#

SourceForge.net Logo

 

チュートリアル: iText.NET

はじめに
Chunk は、文書にテキストを追加するときの最小単位であり、高機能オブジェクトを構成する基本要素となります。Chunk 内は、同じ性質―フォント、サイズ、スタイル、色など―をしています。Chunk は、文書へテキストを加えるときの最小単位です。この節では、Chunk のすべての機能を記載します。
先頭に戻る
Chunk に下線、取り消し線、上線を加える
フォント の章にあるように、下線や取り消し線のための Font.UNDERLINE Font.STRIKETHRU というスタイルが定義されている。これは、RTF や HTML では、動作しますが PDF では動作しません。しかし、Chunk.setUnderline メソッドを使えばより多くのことができます。このメソッドには、二つのバリエーションがあります。
  • Chunk.setUnderline(float thickness, float yPosition) は、Chunk の長さと同じ長さの線を描きます。thickness は、ポイントで表した線の幅、yPosition は、Chunk のベースラインから上への距離です。
    Chunk underlined = new Chunk("underlined");
    underlined.setUnderline(0.2f, -2f);
    Chunk strikethru = new Chunk("strike through example");
    strikethru.setUnderline(0.5f, 3f);
  • Chunk.setUnderline(Color color, float thickness, float thicknessMul, float yPosition, float yPositionMul, int cap) は、線の色を定義します。thicknessyPosition パラメータは線の幅とベースラインからの距離を絶対座標で指定しますが、thicknessMulyPositionMul は、フォントサイズに依存します。例では、フォントサイズ以外同じサイズの Chunk に、同じ線の指定をしています。見れば解るように、いくつかの線はフォントサイズに連動していますが、そうでないものもあります。これらは、setUnderline メソッドで渡されたパラメータによります。最後に、cap パラメータは、ラインキャップのスタイルを表します。(PDF Reference Manual の Table 4.4 参照).
    line cap styles
    Chunk c = new Chunk("Multiple lines");
    c.setUnderline(new Color(0xFF, 0x00, 0x00),
    	0.0f, 0.3f, 0.0f, 0.4f,
    	PdfContentByte.LINE_CAP_ROUND);
    c.setUnderline(new Color(0x00, 0xFF, 0x00),
    	5.0f, 0.0f, 0.0f, -0.5f,
    	PdfContentByte.LINE_CAP_PROJECTING_SQUARE);
    c.setUnderline(new Color(0x00, 0x00, 0xFF),
    	0.0f, 0.2f, 15.0f, 0.0f,
    	PdfContentByte.LINE_CAP_BUTT);
例: java com.lowagie.examples.objects.chunk.Lines
Chunk への下線、取り消し線の描画: Lines.pdf
先頭に戻る
下付き、上付き
Chunk を現在の y 座標から上あるいは下に加えたいときには、setTextRise メソッドを使うことができます。例では、c.setUnderline(new Color(0xC0, 0xC0, 0xC0), 0.2f, 0.0f, 0.0f, 0.0f, PdfContentByte.LINE_CAP_BUTT); によってベースラインを引き、正の TextRise により上付きになること、負の TextRise により下付きになることを示します。
下線の定義は、TextRise には影響されないことには注意すべきです。下線は、通常のテキストと上付きのテキストが混在していても連続すべきですが、不連続になってしまいます。下付きでは、見た目は良くありません。
例: java com.lowagie.examples.objects.chunk.SubSupScript
上付き、下付き機能のデモ: SubSupScript.pdf
先頭に戻る
背景色の変更
With the methods setBackground(Color color) setBackground(Color color, float extraLeft, float extraBottom, float extraRight, float extraTop) メソッドにより、(たとえば、単語を強調するために) Chunk の背景色を変更することができます。最初のメソッドは、Chunk を囲むように塗りつぶされ、二番目のメソッドは、その四角形を大きくしたり、小さくしたりすることができます。
例: java com.lowagie.examples.objects.chunk.Background
Chiunk の背景色を変えるデモ: Background.pdf
先頭に戻る
筆書きと塗りつぶし
PDF 文法での文字(グリフ)は、塗りつぶした形とみなされています。文字の色を変えたいときには、フォントの色を変えることができますが、実際のところは '塗りつぶす' 色を変えているのです。これを、例で示します。

setTextRenderMode(int mode, float strokeWidth, Color strokeColor) メソッドによって、テキストの輪郭を変えることができます。ダイレクトコンテンツの章を読めば解りますが、線は '塗りつぶされる' のではなく、'筆書きされる'のです。strokeWidthstrokeColor パラメータにより、文字に描かれる線の太さと色が定義されます。
mode パラメータは、次のうちのひとつの値です。

  1. PdfContentByte.TEXT_RENDER_MODE_FILL: グリフは、フォント色で塗りつぶされ、strokeWidth と strokeColor は無視される。
  2. PdfContentByte.TEXT_RENDER_MODE_STROKE: strokeWidth と strokeColor で指定された輪郭で描かれる。
  3. PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE: strokeWidth と strokeColor で指定された輪郭で描かれ、フォント色で塗りつぶされる。
  4. PdfContentByte.TEXT_RENDER_MODE_INVISIBLE: グリフは、不可視になる。
このメソッドは、(たとえば、Font.Bold をサポートしないフォントを使う場合に)太字をシミュレートするために使用できます。
先頭に戻る
歪んだテキスト
setSkew(float alpha, float beta) メソッドは、(たとえば、Font.ITALIC をサポートしないフォントを使う場合に)斜字フォントをシミュレートするために使用できます。これは、単に alpha として 0f beta として 12f を指定するだけです。

Alfa は度で表したベースラインの角度です。例では、いくつかのテキストが 45f と -45f が指定されています。beta は、ベースラインにおける四辺形の角度です。

先頭に戻る
ジェネリック機能
ここまでに挙げた機能で行いたいことがまだできないならば、PageEvent onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) によってあなた自身でそれを作成することができます。つまり、PdfPageEvent インターフェイスを実装したクラスを作成することができます。最も良い方法は、PdfPageEventHelper クラスから派生されたクラスでオーバーライドした onGenericTag メソッドでカスタム機能を定義することです。
public class Generic extends PdfPageEventHelper {
  public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
    // writer is the current writer to which the Chunk is written
    // document is the document to which the Chunk was added
    // rect is the area surrounding the Chunk
    // text is the text you passed with setGenericTag
  }
}
PageEvent を設定することを忘れないように。
writer.setPageEvent(new Generic());
最初の例では、genericTag (setGenericTag(String text)) を通過するテキストを監視しています。もしも、単語が、"ellipse" ならば、Chunk のに楕円を描き、"box" ならば、Chunk のに四角を描きます。
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
  if ("ellipse".equals(text)) {
    PdfContentByte cb = writer.getDirectContent();
    cb.setRGBColorStroke(0xFF, 0x00, 0x00);
    cb.ellipse(rect.left(), rect.bottom() - 5f, rect.right(), rect.top());
    cb.stroke();
    cb.resetRGBColorStroke();
  }
  else if ("box".equals(text)) {
    PdfContentByte cb = writer.getDirectContentUnder();
    rect.setGrayFill(0.5f);
    cb.rectangle(rect);
  }
}
PDF 文法について学ぶためにも、ダイレクトコンテンツの章を呼んでください。これにより、無限の可能性が開けます。
例: java com.lowagie.examples.objects.chunk.Generic
スタイルを追加するジェネリックタグの使い方: Generic.pdf
次の例では、どの単語がどのページで使われたかの登録を保存する TreeMap を作るためにジェネリックタグを使用しています。 いったん文書が完結すると、ページを追加し索引を与えます。これは、単純な例ですが、少しの変更により、真に複雑なさまざまな用途にも使うことができます。
例: java com.lowagie.examples.objects.chunk.Glossary
ジェネリックタグのほかの使い方: 索引の作成のためのキーワードの登録: Glossary.pdf
先頭に戻る
Chunk の測量系と拡大率
Chunk のページ上での幅を知りたいときには、 getWidthPoint() メソッドを使うことができます。これは、ポイント単位の幅を返します。インチやセンチメータ単位の幅を知りたいときには、計算が必要です。
setHorizontalScaling(float scale) メソッドによって、Chunk を、縮小 (scale < 1.0f) したり拡大 (scale > 1.0f) したりできます。例では、まず通常のサイズで Chunk を印字し、次に二分の一のサイズ (scale = 0.5f) で印字しています。
例: java com.lowagie.examples.objects.chunk.Width
Chunk の測量系と拡大率: Width.pdf
先頭に戻る
行末に達したときの処理
Phrase
Chunk を文書に追加し続けていくと、あるときに行末に達します。もちろん何も定義していなくても、iText はそれなりの処理をします。既定では、iText は、復帰をします。それでは改行はどうなるのでしょう? iText は、行間にどれぐらいの間を空けるべきなのでしょうか? 二つの行(ベースライン)の間の幅は、改行幅と呼ばれ、Chunk クラスでは定義されません。このようなことを指定するときには、Paragraph のようなクラスを使う必要があります。

次の例では、あまり知られていない(不必要かもしれない)Phrase クラスを使っています。Phrase は、(異なるスタイルを持ちえる)Chunk の集まりであり、拡張パラメータとしてある改行幅を持っています。Paragraph と異なり、インデントに関する情報はありません。既定では、フォントサイズは 12であるので、改行幅として 16 が設定されています。例の最初のページを見てください。すべての Chunk は同じ行に、どんどん重ね書きされています。二ページ目では、同じ Chunk が 改行幅 16 の Phrase にグループ化され、行末に達すると、新しい行になります。

例: java com.lowagie.examples.objects.chunk.EndOfLine
行末に達したときには、どうなるか?: EndOfLine.pdf
SplitCharacter
既定では iText は、できるだけ多くの '完全な単語' を一行に入れようとします。iText は、文中のスペースやハイフンがある位置で改行を入れます。それでは、Chunk がページの幅より長いときにはどうなるのでしょうか? このような場合、iText は最初にページに収まらない文字の前で Chunk を分割します。この振る舞いは、ある場合には望ましい動作ではありません。これは、SplitCharacter インターフェースを実装したクラスを setSplitCharacter(SplitCharacter splitCharacter) を使って Chunk に登録することによって避けることができます。isSplitCharacter メソッドは、最初に思うほどは単純ではないように見えると思います。次に、既定の実装を示します。 (訳注:アジア言語の初歩的な禁則処理にも対応しています。)
public boolean isSplitCharacter(int start, int current, int end, char[] cc, PdfChunk[] ck) {
   char c;
   if (ck == null)
       c = cc[current];
   else
       c = ck[Math.min(current, ck.length - 1)].getUnicodeEquivalent(cc[current]);
   if (c <= ' ' || c == '-') {
       return true;
   }
   if (c < 0x2e80)
       return false;
   return ((c >= 0x2e80 && c < 0xd7a0)
   || (c >= 0xf900 && c < 0xfb00)
   || (c >= 0xfe30 && c < 0xfe50)
   || (c >= 0xff61 && c < 0xffa0));
}
カスタム SplitCharacter の実装はこのコードをコピーして作成することができます。次のように変更すると、iText は、ピリオドとスラッシュでも単語を分割するようになります。
if (c <= ' ' || c == '-' || c == '.' || c == '/') {
    return true;
}
ハイフネーション
この節を終わる前に、iTextは、自動的にハイフネーションをすることができるということを説明する。このためには、HyphenationAuto クラスのインスタンスを作成しなければならない。
// Hyphenating a British text
Chunk ckEN = new Chunk(textEN);
HyphenationAuto autoEN = new HyphenationAuto("en", "GB", 2, 2);
ckEN.setHyphenation(autoEN);
// Hyphenating a Dutch text
Chunk ckNL = new Chunk(textNL);
HyphenationAuto autoNL = new HyphenationAuto("nl", null, 2, 2);
ckNL.setHyphenation(autoNL);
例では、同じテキスト (初期のCharles Dickens の叙述詩 Tale of Two Cities) を最初はUKのハイフネーション規則、次に、US のハイフネーション規則にのっとって、ハイフネーションをしています。見て解るように、得られた文書には若干の違いがあります。

注意: この機能を使うときには、itext-hyph-xml.jar を CLASSPATH に加えなければなりません。この JAR には、次のようなファイルが含まれています。

  • en_GB.xml
  • en_US.xml
  • fr.xml
  • nl.xml
これらのファイルはその言語(GB 英語、US 英語、フランス語、オランダ語など) のハイフネーション規則が記述されています。見て解るように、HyphenationAuto constructor の最初の二つのパラメータは、ファイル名を表し、三つ目と四つ目は、それぞれ語頭あるいは語尾の何文字が取り残されるかを表します。

XMLファイルは、iText の開発者により作成されたものではなく、Apache FOP のために作成されたものです。iText では利便性のために、Apache FOP からダウンロードし、分離した JAR として配付していますが、そのうちのいくつかは、GPL であったり商業用には利用できないものであったりします。これらのライセンスを守るためにもそれぞれのファイルのライセンスを読んでください。もしも、お探しのハイフネーションパターンがなければ、FOP サイト記載の方法にしたがって、これをつくることもできます。XML ファイルは、com.lowagie.text.pdf.hyphenation.hyph パッケージにリソースとして配置するか、あるディレクトリに配置し、Hyphenator.setHyphenDir() を呼び出してください。

先頭に戻る
続く
Chunkについての話題はまだまだたくさんあります。Anchors と Actions を見てください。
先頭に戻る

Copyright (C) 2001-2007 Kazuya Ujihara. All rights reserved.