Itextsharp Header html只显示一行

时间:2016-10-11 06:15:33

标签: pdf-generation itext

这是我看到的标题:

enter image description here

这是我的实际标题:

enter image description here

这是我的代码:

    public override void OnStartPage(PdfWriter writer, Document document)
    {
        base.OnStartPage(writer, document);
        ColumnText ct = new ColumnText(writer.DirectContent);
        XMLWorkerHelper.GetInstance().ParseXHtml(new ColumnTextElementHandler(ct), new StringReader((string)System.Web.HttpContext.Current.Session["encabezado"]));
        int? columnas = ct.LinesWritten;
        int? columnas2 = ct.LinesWritten;

        ct.SetSimpleColumn(document.Left, document.Top, document.Right, document.GetTop(-20), 10, Element.ALIGN_MIDDLE);
        ct.Go();
    }

1 个答案:

答案 0 :(得分:1)

ColumnText对象定义矩形时,您没有提供足够的空间:

document.Left, document.Top, document.Right, document.GetTop(-20)

你有两个段落:

<p style="text-align: center;">header Ants Nit: [Nit organizacion]</p>
<p style="text-align: center;">secon line: [Nombre organizacion]</p>

您没有定义字体,字体大小或前导,因此默认值使用:

Helvetica
12pt
18pt

你有两个段落,每个段落都适合一行,所以你需要至少36个用户单位,以确保两条线条适合矩形。

您正在定义一个跨越页面整个宽度的矩形,但这只是20个用户单位高。 20个用户单位仅对一行足够,这与您看到的一致:只有一行。

如果要显示两条线,则需要定义一个更大的矩形,例如:

ct.SetSimpleColumn(
    document.Left, document.Top,
    document.Right, document.GetTop(-40));

现在是时候说:等一下!我有两个额外的问题!

  1. 定义了一个领先者,不要在10方法中看到参数SetSimpleColumn()吗?是的,我确实看到了这个参数,但[1]你的字体大小为12,并且小于字体大小的前导将导致文本丑陋,[2]我怀疑XML Worker在复合模式中添加段落,在哪种情况下,列的前导被忽略,以支持段落的前导。对齐方式也是如此(您在HTML中使用了text:align: center来实现此目的),这就是我从setSimpleColumn()方法中删除了两个未使用的参数的原因。

  2. 如果我按照您的建议,我的标题与实际内容重叠。这是正确的,因为默认的上边距是36个用户单位高,并且您定义了一个高达40个用户单位的标题矩形。如果您想避免上边距与实际内容重叠,则必须扩大上边距。

  3. 我有一个反问题:为什么你在使用XML Worker来创建标题。你的标题非常简单。我不明白为什么您要使用两个<p>标记来定义标题。只需定义两个Paragraph对象,您就可以省去解析HTML的麻烦。

    最后:我必须指出你正在犯的错误。您不应该只使用OnStartPage()方法在OnEndPage()方法中添加内容。

      

    在文档中,我们非常清楚地表明它是禁止的   在onStartPage()方法中添加内容;内容只能是   在onEndPage()方法中添加。我们也非常清楚地说明了这一点   传递给页面事件方法的Document对象   只读目的。即使在document.add()方法中,禁止也使用onEndPage()

         

    不幸的是,许多开发人员完全忽略了文档,   这导致了以下问题:

         

    此外,您可能会删除有关LinesWritten的奇怪行。我不明白为什么它们会有用。