【问题标题】:Proper alignment on iText7在 iText7 上正确对齐
【发布时间】:2018-04-24 04:15:35
【问题描述】:

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

在这张照片中,有些地方我仍然无法修复。

  1. 文本不是垂直居中的,虽然图像是
  2. 图片在左边时,文字离图片太近了

我尝试并阅读了很多我提到的东西,其中之一但绝对不限于:

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

关于我在这里做错了什么有什么想法吗?我有点头发抽不出atm...感谢任何帮助。

谢谢

【问题讨论】:

    标签: c# itext7


    【解决方案1】:

    iText 中的浮动元素功能基于 CSS 概念,其行为非常相似。让我在这里解释一些细节。

    我先回答第二个问题。要在图像和环绕它的内容之间获得一些间距,您应该使用浮动图像的边距属性。例如。在您的情况下,它是image.setMarginRight(5)。 浮动元素使内容环绕它们,但是块框的定位不受影响,块的定位就像根本没有浮动一样。因此,当您为段落指定填充时,它仍然存在,但它在图像“下方”。

    看看这个 HTML sn-p,它演示了在 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;
    }
    

    【讨论】:

    • 效果很好,谢谢!感谢您花时间写出如此详细的答案。我唯一需要改变的是使用GetImageScaledHeight 而不是GetImageHeight ,因为我正在缩放我的图像。非常感谢,div 和 margin 成功了!
    猜你喜欢
    • 2019-06-13
    • 2021-08-18
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多