4

Table および Cell クラスを使用して iText 7 で表を作成すると、表のセルにはデフォルトでパディングが組み込まれています。生成されたドキュメントを見る限り、約 2 PDF ユニットのようです。

この値を取得して計算に使用する方法はありますか? また、このデフォルトを変更して、すべてのセルで個別に設定するのではなく、すべてのテーブルのすべてのセルで使用する独自のパディングを設定できる方法はありますか?

4

3 に答える 3

6

iText 7: Building Blocksチュートリアルをご覧ください。

始める前に」セクションでは、すべての構成要素が という名前のクラスから派生していることがわかりますElementPropertyContainer。このクラスはプロパティのコンテナです。

クラスの場合Cell、パディングを定義する一連のプロパティがあります。これらのプロパティは、次のような一般的な方法 (AbstractElementクラスのメソッドを使用)で取得できます。

System.out.println(cell.getProperty(Property.PADDING_LEFT));
System.out.println(cell.getProperty(Property.PADDING_RIGHT));
System.out.println(cell.getProperty(Property.PADDING_TOP));
System.out.println(cell.getProperty(Property.PADDING_BOTTOM));

BlockElementしかし、クラスで利用可能な便利なメソッドを単純に使用できるのであれば、なぜそれが難しくなるのですか?

System.out.println(cell.getPaddingLeft());
System.out.println(cell.getPaddingRight());
System.out.println(cell.getPaddingTop());
System.out.println(cell.getPaddingBottom());

チュートリアルでわかるように、CellクラスはクラスのサブクラスですBlockElement。クラスのBlockElementサブクラスですAbstractElement。クラスはクラスのAbstractElementサブクラスですElementPropertyContainer

パディング (または余白) を変更したい場合は、そのチュートリアルの第 5 章をお読みください。CellMarginPaddingという名前の例があります。

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    Table table = new Table(new float[]{2, 1, 1});
    table.setBackgroundColor(Color.ORANGE);
    table.setWidthPercent(80);
    table.setHorizontalAlignment(HorizontalAlignment.CENTER);
    table.addCell(
        new Cell(1, 3).add("Cell with colspan 3")
            .setPadding(10).setMargin(5).setBackgroundColor(Color.GREEN));
    table.addCell(new Cell(2, 1).add("Cell with rowspan 2")
        .setMarginTop(5).setMarginBottom(5).setPaddingLeft(30)
        .setFontColor(Color.WHITE).setBackgroundColor(Color.BLUE));
    table.addCell(new Cell().add("row 1; cell 1")
        .setFontColor(Color.WHITE).setBackgroundColor(Color.RED));
    table.addCell(new Cell().add("row 1; cell 2"));
    table.addCell(new Cell().add("row 2; cell 1").setMargin(10)
        .setFontColor(Color.WHITE).setBackgroundColor(Color.RED));
    table.addCell(new Cell().add("row 2; cell 2").setPadding(10)
        .setFontColor(Color.WHITE).setBackgroundColor(Color.RED));
    document.add(table);
    document.close();
}

これは次のようになります。

ここに画像の説明を入力

少し目を痛めたら申し訳ありませんが、これらの色を使用すると、マージンとパディングの違いを説明するのに最適な方法のように思えました。

ほとんどのプロパティは継承されます。たとえば、 のフォントを設定するとDiv、そのフォントは、その に追加されたすべての要素のデフォルト フォントになりますDiv。ただし、いくつかの例外があります。パディングもその一つです。Cellこれは、クラスに固有のプロパティのデフォルト値がどのように定義されたかです:

@Override
public <T1> T1 getDefaultProperty(int property) {
    switch (property) {
        case Property.BORDER:
            return (T1) (Object) DEFAULT_BORDER;
        case Property.PADDING_BOTTOM:
        case Property.PADDING_LEFT:
        case Property.PADDING_RIGHT:
        case Property.PADDING_TOP:
            return (T1) (Object) 2f;
        default:
            return super.<T1>getDefaultProperty(property);
    }
}

ご覧のとおり、セル全体にパディング値はありません。パディングは、偶然にもデフォルトで同一の 4 つの値で構成されます。

それぞれのデフォルトとは異なるパディングを定義したくない場合はCell、 のサブクラスを作成してCellそれを呼び出しますMyCustomCellgetDefaultProperty()クラスをオーバーライドして、選択したパディングを使用するという意味でカスタムにします。

チュートリアルでは、角を丸くするたびにレンダラーを宣言する必要がないように、角を丸くした境界線でセルを描画するサブクラスの例を見つけることができます。

私はそのドキュメントの最初の作成者です。CelliText 7の およびその他のオブジェクトに関するこれらの質問やその他の質問への回答が役立つことを願っています。

于 2016-08-17T16:21:31.883 に答える
0

@Bruno LowagieオーバーライドルートごとにC#でこれを行い、デフォルトをパディングなし、ボーダーなしに設定しました:

public class BorderlessCell : Cell
    {
        public BorderlessCell(int rowSpan, int colSpan) : base(rowSpan, colSpan) { }
        public BorderlessCell() : base() { }
        public override T1 GetDefaultProperty<T1>(int property) 
        {
            switch (property) 
            {
                case Property.BORDER:
                    return (T1)(Object)(Border.NO_BORDER);
                case Property.PADDING_BOTTOM:
                case Property.PADDING_LEFT:
                case Property.PADDING_RIGHT:
                case Property.PADDING_TOP:
                   return (T1)(Object)(0);
                default:
                    return base.GetDefaultProperty<T1>(property);
            }
        }
    }
于 2016-09-23T18:27:24.830 に答える