web-dev-qa-db-ja.com

iText:PdfTableセルの垂直方向の配置

ヘッドセットのセルテキストをセルの高さの中央に垂直に配置しようとしています。

これは私のコードです:

    PdfPCell c1 = new PdfPCell(cerate_phrase("" ,regular_bold ));
    c1.setHorizontalAlignment(Element.ALIGN_CENTER);
    c1.setVerticalAlignment(Element.ALIGN_MIDDLE);
    c1.setBackgroundColor(BaseColor.LIGHT_GRAY);
    table_.addCell(c1);

しかし、これは機能しません。 setHorizontalAlignmentは中央に配置されますが、setVerticalAlignmentは中央に配置されません。

私は何か間違ったことをしていますか?どうすれば中央に垂直に配置できますか?

どんな助けでもありがたいです。

16
user590586

Lowagieによると:

PdfPCell cell = new PdfPCell(new Phrase("blah Blah blah");
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);

これは技術的な意味では常に正しいですが、見た目が悪い場合もあります。

中央に配置するには、オブジェクトの周囲にボックスを描画し、その中央を見つけて、周囲のオブジェクトの中央に揃えます。

したがって、iTextはフレーズの中心を見つけて、それを整列させます。しかし、人間の目はテキストの大部分に焦点を合わせることがあります。たとえば、ベースラインとキャップハイトの間のフォントの部分です。したがって、見栄えを良くするには、それを基準にして中央に配置する必要があります。

Phrase content = new Phrase("Blah blah blah", Font);

Float fontSize = content.getFont().getSize();
Float capHeight = content.getFont().getBaseFont().getFontDescriptor(BaseFont.CAPHEIGHT, fontSize);

Float padding = 5f;    

PdfPCell cell = new PdfPCell(content);
cell.setPadding(padding);
cell.setPaddingTop(capHeight - fontSize + padding);

PdfPCellメソッドsetVerticalAlignment(..)は使用されないことに注意してください。

これは必ずしも複数行のフレーズでは機能しないようですが、機能します。

Typography Line Terms

ITextが物の周りにバウンディングボックスを表示できれば、問題は明らかです(気をつけてください、あなたはcan iTextにバウンディングボックスを描画するように指示します。魔法のオン/オフスイッチよりも手間がかかります)。

このソリューションは、 Paulo Soaresからの電子メール から採用されています。

24
djeikyb

cell.setUseAscender(true)の前にc1.setVerticalAlignment(Element.ALIGN_MIDDLE);を追加します。同じ問題があります。上記のコードを追加すると、機能することがわかります。これで問題が解決することを願っています。ありがとうございます。

17
Sucy

オプションExtraParagraphSpaceを使用できます。

c1.HorizontalAlignment = Element.ALIGN_CENTER;
c1.VerticalAlignment = Element.ALIGN_MIDDLE;
c1.ExtraParagraphSpace = 2;
1
Pajoc

あなたはこのようにすることはできません:

cell.setBackgroundColor(BaseColor.GRAY);
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setUseAscender(true);
0
Arséne