在iText7上正确对齐

时间:2018-04-24 04:15:36

标签: c# itext7

我一直在努力使用iText7创建布局。我读了很多并尝试了很多变化,但我仍然无法按照我需要的方式得到它。如果有人可以帮忙......这就是我所拥有的:

enter image description here

在这张图片中有一些我仍然无法解决的问题。

  1. 虽然图像是
  2. ,但文字不是垂直居中的
  3. 当图像在左侧时,文字太靠近图像
  4. 我尝试并阅读了很多我提到的内容,其中之一,但绝对不限于:

    https://developers.itextpdf.com/examples/tables/clone-alignment-indentation-leading-and-spacing-cells

    这是生成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
    

    关于我在这里做错了什么的任何想法?我有点脱头发出来了...感谢任何帮助。

    由于

1 个答案:

答案 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;
}