-
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) は、線の色を定義します。thickness
と yPosition
パラメータは線の幅とベースラインからの距離を絶対座標で指定しますが、thicknessMul
と yPositionMul
は、フォントサイズに依存します。例では、フォントサイズ以外同じサイズの Chunk
に、同じ線の指定をしています。見れば解るように、いくつかの線はフォントサイズに連動していますが、そうでないものもあります。これらは、setUnderline
メソッドで渡されたパラメータによります。最後に、cap パラメータは、ラインキャップのスタイルを表します。(PDF
Reference Manual の Table 4.4 参照).
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);
下線の定義は、TextRise には影響されないことには注意すべきです。下線は、通常のテキストと上付きのテキストが混在していても連続すべきですが、不連続になってしまいます。下付きでは、見た目は良くありません。
setTextRenderMode(int mode, float strokeWidth, Color strokeColor)
メソッドによって、テキストの輪郭を変えることができます。ダイレクトコンテンツの章を読めば解りますが、線は
'塗りつぶされる' のではなく、'筆書きされる'のです。strokeWidth
と strokeColor
パラメータにより、文字に描かれる線の太さと色が定義されます。
mode パラメータは、次のうちのひとつの値です。
- PdfContentByte.TEXT_RENDER_MODE_FILL: グリフは、フォント色で塗りつぶされ、strokeWidth と strokeColor は無視される。
- PdfContentByte.TEXT_RENDER_MODE_STROKE: strokeWidth と strokeColor で指定された輪郭で描かれる。
- PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE: strokeWidth と strokeColor で指定された輪郭で描かれ、フォント色で塗りつぶされる。
- PdfContentByte.TEXT_RENDER_MODE_INVISIBLE: グリフは、不可視になる。
Alfa は度で表したベースラインの角度です。例では、いくつかのテキストが 45f と -45f が指定されています。beta は、ベースラインにおける四辺形の角度です。
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 文法について学ぶためにも、ダイレクトコンテンツの章を呼んでください。これにより、無限の可能性が開けます。
次の例では、どの単語がどのページで使われたかの登録を保存する TreeMap を作るためにジェネリックタグを使用しています。
いったん文書が完結すると、ページを追加し索引を与えます。これは、単純な例ですが、少しの変更により、真に複雑なさまざまな用途にも使うことができます。
ジェネリックタグのほかの使い方: 索引の作成のためのキーワードの登録: Glossary.pdf
setHorizontalScaling(float scale) メソッドによって、Chunk を、縮小 (scale < 1.0f) したり拡大 (scale > 1.0f) したりできます。例では、まず通常のサイズで Chunk を印字し、次に二分の一のサイズ (scale = 0.5f) で印字しています。
次の例では、あまり知られていない(不必要かもしれない)Phrase クラスを使っています。Phrase は、(異なるスタイルを持ちえる)Chunk の集まりであり、拡張パラメータとしてある改行幅を持っています。Paragraph と異なり、インデントに関する情報はありません。既定では、フォントサイズは 12であるので、改行幅として 16 が設定されています。例の最初のページを見てください。すべての Chunk は同じ行に、どんどん重ね書きされています。二ページ目では、同じ Chunk が 改行幅 16 の Phrase にグループ化され、行末に達すると、新しい行になります。
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;
}
// 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
XMLファイルは、iText の開発者により作成されたものではなく、Apache FOP のために作成されたものです。iText では利便性のために、Apache FOP からダウンロードし、分離した JAR として配付していますが、そのうちのいくつかは、GPL であったり商業用には利用できないものであったりします。これらのライセンスを守るためにもそれぞれのファイルのライセンスを読んでください。もしも、お探しのハイフネーションパターンがなければ、FOP サイト記載の方法にしたがって、これをつくることもできます。XML ファイルは、com.lowagie.text.pdf.hyphenation.hyph パッケージにリソースとして配置するか、あるディレクトリに配置し、Hyphenator.setHyphenDir() を呼び出してください。