ITextSharp - 在ColumnText中渲染HTML时,它已经消失了

时间:2017-07-03 08:24:41

标签: html itext

我正在使用ITextSharp来创建PDF文档。作为创建文档的一部分,我必须在特定页面的窗口中呈现HTML块。我使用以下代码来呈现HTML。令人惊讶的是它没有呈现HTML。 我附上了HTML Here

public override Rectangle Draw(Rectangle curRectangle)
    {
        try
        {
            var column = new ColumnText(this.DocRenderer.PdfDocContentByte);
            string css = "p {font-family:HELVETICA; font-style:normal; color:black; font-size:10px}"
                + " li {font-family:HELVETICA; font-style:normal; color:black;font-size:10px}";
            foreach (var element in XMLWorkerHelper.ParseToElementList(FileContents of guide.html, css))
            {
                column.AddElement(element);
            }

            curRectangle = this.SimulateHeight(curRectangle, column);
            column.SetSimpleColumn(curRectangle);
            column.Go(false);
        }
        catch (Exception ex)
        {
            Logger.LogError(ex.Message, ex);
        }
        return curRectangle;
    }

    private Rectangle SimulateHeight(Rectangle curRectangle,ColumnText column)
    {

        float top = 15;
        column.SetSimpleColumn(curRectangle.Left, curRectangle.Bottom, curRectangle.Right, top);
        int status = column.Go(true);
        top = column.YLine-1;
        return new Rectangle(curRectangle.Left, curRectangle.Bottom, curRectangle.Right, top);
    }

1 个答案:

答案 0 :(得分:1)

即使它只是模拟,你的行

int status = column.Go(true);

如果所有内容都适合矩形,则会吞下添加到column的所有复合内容。 (这样可以轻松地模拟将更多复合内容绘制到同一ColumnText。)

因此,如果status值为ColumnText.NO_MORE_TEXT,则您必须再次添加,例如像这样:

private iTextSharp.text.Rectangle SimulateHeight(iTextSharp.text.Rectangle curRectangle, ColumnText column)
{
    var compositeContent = new List<IElement>(column.CompositeElements);
    float top = 15;
    column.SetSimpleColumn(curRectangle.Left, curRectangle.Bottom, curRectangle.Right, top);
    int status = column.Go(true);
    if (ColumnText.NO_MORE_TEXT == status)
    {
        foreach (var element in compositeContent)
        {
            column.AddElement(element);
        }
    }
    top = column.YLine - 1;
    return new iTextSharp.text.Rectangle(curRectangle.Left, curRectangle.Bottom, curRectangle.Right, top);
}

实际上即使对于其他status值,列表可能部分清空了适合的顶级元素。但是,在你的情况下,只有一个顶级元素div,所以如果它不完全适合,它仍然存在。

另外,您使用位于页面实际底部附近的top值,因此它实际上是底部y坐标。这样的命名很容易引起误解。