iText 5では、document.add()
を使用すると、iTextはコンテンツの座標を追跡します。絶対位置にコンテンツを追加することで自分でコントロールすることができます(例えばColumnText
を使用するなど)が難しいです。多くのことを自分で追跡しなければならないためです(たとえば、内容が一番下に来たときにページ区切りを導入する必要がありますページの)。
座標の制御をiTextに任せると、ページイベントを使用してこれらの座標にアクセスできます。
Paragraph
の開始点と終了点をonParagraph()
とonParagraphEnd()
メソッドで追跡する例を見てください。このコードサンプルは分かりにくいですが、テキストブロックの周囲に矩形を描きたい場合など、iText 5のParagraph
の座標を取得する唯一の方法です。そのページの最後にあるように、iText 7はこの要件を満たすのがずっと簡単です。
iText 5を使用すると、汎用タグを使用して場所を定義する方がずっと簡単です。 GenericFieldsの例を参照してください。ここでは、結果としてフィールドに空のChunk
が使用されます。あなたがあなたのケースではAdd PdfPCell to Paragraph
を参照して、結果のスクリーンショットを見たい場合は、私は別の行にまたがるChunk
を含むParagraph
を作成したい、と私はページのonGenericTag()
方法でフィールドを追加したいですイベント。
我々は、次のテキストファイルがあるとします。青い枠を注意
:私たちはこのようになりますPDFに変換するにはどうすればよいjekyll_hyde.txt
をそれはタイトルに追加され、ページ番号は各ページの下部に表示されます。
class MyPageEvents extends PdfPageEventHelper {
protected float startpos = -1;
protected boolean title = true;
public void setTitle(boolean title) {
this.title = title;
}
@Override
public void onEndPage(PdfWriter writer, Document document) {
Rectangle pagesize = document.getPageSize();
ColumnText.showTextAligned(
writer.getDirectContent(),
Element.ALIGN_CENTER,
new Phrase(String.valueOf(writer.getPageNumber())),
(pagesize.getLeft() + pagesize.getRight())/2,
pagesize.getBottom() + 15,
0);
if (startpos != -1)
onParagraphEnd(writer, document,
pagesize.getBottom(document.bottomMargin()));
startpos = pagesize.getTop(document.topMargin());
}
@Override
public void onParagraph(PdfWriter writer, Document document,
float paragraphPosition) {
startpos = paragraphPosition;
}
@Override
public void onParagraphEnd(PdfWriter writer, Document document,
float paragraphPosition) {
if (!title) return;
PdfContentByte canvas = writer.getDirectContentUnder();
Rectangle pagesize = document.getPageSize();
canvas.saveState();
canvas.setColorStroke(BaseColor.BLUE);
canvas.rectangle(
pagesize.getLeft(document.leftMargin()),
paragraphPosition - 3,
pagesize.getWidth() - document.leftMargin() - document.rightMargin(),
startpos - paragraphPosition);
canvas.stroke();
canvas.restoreState();
}
}
我々はPDFにテキストファイルを変換し、PdfWriter
にページイベントを導入するには、次のコードを使用することができます:
public void createPdf(String dest)
throws DocumentException, IOException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
MyPageEvents events = new MyPageEvents();
writer.setPageEvent(events);
document.open();
BufferedReader br = new BufferedReader(new FileReader(TEXT));
String line;
Paragraph p;
Font normal = new Font(FontFamily.TIMES_ROMAN, 12);
Font bold = new Font(FontFamily.TIMES_ROMAN, 12, Font.BOLD);
boolean title = true;
while ((line = br.readLine()) != null) {
p = new Paragraph(line, title ? bold : normal);
p.setAlignment(Element.ALIGN_JUSTIFIED);
events.setTitle(title);
document.add(p);
title = line.isEmpty();
}
document.close();
}
ソースiTextの5では、これらの要素は、ページのイベントを使用して追加されます:developers.itextpdf.com
私はあなたがお勧めするものを見ていきます! – curious1
ブルーノ、ありがとう。私はあなたのリンクを見て、あなたが言ったことを作るのが難しいと感じている "あなたの場合は、別の行にまたがるチャンクを含む段落を作成し、ページイベントのonGenericTag()メソッドでフィールドを追加したい"はい、段落の後ろに複数行入力ボックスを入れたいと思います。そのような例がオンラインにありますか?ベスト。 – curious1
'GenericFields'の例は、' Paragraph'の中にフィールド*を追加したいときにどのように処理されるかを示しています。 'Chunk'が完全な' Paragraph'に及ぶようにその例を適応させてください。それは難しいことではありません。 –