我一直在努力使用iText7创建布局。我读了很多并尝试了很多变化,但我仍然无法按照我需要的方式得到它。如果有人可以帮忙......这就是我所拥有的:
在这张图片中有一些我仍然无法解决的问题。
我尝试并阅读了很多我提到的内容,其中之一,但绝对不限于:
这是生成PDF的代码:
private static Cell GetCell(int position, ...)
{
var cell = new Cell();
var isEven = (position + 1) % 2 == 0;
if (image != null && record != null)
{
var paragraph = new Paragraph(
$"t1\n"
);
if (!string.IsNullOrEmpty(t2))
paragraph.Add($"t2\n");
// ...
image.SetProperty(Property.FLOAT, isEven ? FloatPropertyValue.LEFT : FloatPropertyValue.RIGHT);
cell.Add(image)
.Add(paragraph.SetPaddingLeft(5))
.SetVerticalAlignment(VerticalAlignment.MIDDLE);
}
cell.SetBorder(Border.NO_BORDER);
cell.SetBackgroundColor(isEven ? WebColors.GetRGBColor("#DEDEDE") : WebColors.GetRGBColor("#FFFFFF"));
return cell;
}
var table = new Table(1);
table.SetWidth(TableWidth).SetHeight(TableHeight);
table.SetFontSize(7);
table.SetBorder(new SolidBorder(WebColors.GetRGBColor("#333333"), 2));
// add cells to table
关于我在这里做错了什么的任何想法?我有点脱头发出来了...感谢任何帮助。
由于
答案 0 :(得分:1)
iText中的浮动元素功能基于CSS概念,行为非常相似。让我解释一下这里的一些细节。
我将首先回答第二个问题。要在图像和包围它的内容之间获得一些间距,您应该使用浮动图像的边距属性。例如。在你的情况下它是image.setMarginRight(5)
。
浮动元素使内容环绕它们,但是块框定位不受影响,块被定位为好像根本没有浮动。因此,当您为段落指定填充时,它仍然存在,但它位于图像的“下方”。
查看此HTML代码段,演示在iText布局中应用的相同行为: https://jsfiddle.net/cah7uzed/2/ 注意在图像下方工作的填充。
你的第一个问题更棘手。问题是垂直对齐同时应用于单元格的整个内容,将其所有子元素视为单个块。因此,文本与浮动图像的上边缘一起移动,同时对齐此单个大块。
目前,您的用例没有开箱即用的简单解决方案。我认为你需要的是CSS flex
属性的某种模拟,它允许对齐位于一行中的所有块,但iText目前不支持它。
我可以想到一个解决方法。您可以使用Div
元素包装段落,其固定高度等于浮动元素高度,并另外指定此Div
的垂直对齐方式。
如果您希望高度根据内容保持动态,则可以预先计算容器的高度,如下面的答案所示:https://stackoverflow.com/a/41788843/4495409。所示的技术适用于所有模型元素,包括Paragraph
。
一般情况下,您希望预先计算浮动元素和段落高度,并选择较大的一个。为了简化一点,根据您的具体情况并假设您知道图像高度总是大于文本高度,您可以简单地指定Div的图像高度。在这种情况下,您的代码将如下所示:
private static Cell GetCell(int position, ...)
{
var cell = new Cell();
var isEven = (position + 1) % 2 == 0;
if (image != null && record != null)
{
var paragraph = new Paragraph(
$"t1\n"
);
if (!string.IsNullOrEmpty(t2))
paragraph.Add($"t2\n");
// ...
// This gives the original image height,
// it doesn't take into account any set properties.
float imageHeight = image.GetImageHeight();
var div = new Div()
.Add(paragraph)
.SetHeight(imageHeight)
.SetVerticalAlignment(VerticalAlignment.MIDDLE);
if (isEven) {
image.SetMarginRight(5);
} else {
image.SetMarginLeft(5);
}
image.SetProperty(Property.FLOAT, isEven ? FloatPropertyValue.LEFT : FloatPropertyValue.RIGHT);
cell.Add(image)
.Add(div)
.SetVerticalAlignment(VerticalAlignment.MIDDLE);
}
cell.SetBorder(Border.NO_BORDER);
cell.SetBackgroundColor(isEven ? WebColors.GetRGBColor("#DEDEDE") : WebColors.GetRGBColor("#FFFFFF"));
return cell;
}