itextsharp Header html 只显示一行

Itextsharp Header html only show one line

这是我看到的header:

这是我的实际 header:

这是我的代码:

    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();
    }

当您为 ColumnText object 定义矩形时,您没有提供足够的 space:

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. am定义了一个leading,没看到SetSimpleColumn()方法里面的参数10吗?是的,我确实看到了那个参数,但是 [1] 你的字体大小是 12,小于字体大小的行距会导致文本难看,而且 [2] 我怀疑 XML Worker 在复合模式,在这种情况下,列的前导被忽略,有利于段落的前导。对齐方式也是如此(您在 HTML 中使用 text:align: center 来实现此目的),这就是为什么我从 setSimpleColumn() 方法中删除了两个未使用的参数。

  2. 如果我听从您的建议,我的 header 会与实际内容重叠。这是真的,因为默认的上边距是 36 个用户单位高,而您定义了一个 header 矩形,它是 40 个用户单位高。如果您想避免上边距与实际内容重叠,则必须扩大上边距。

我有一个 counter-question:你究竟为什么要使用 XML Worker 来创建 header。你的 header 非常简单。我不明白您为什么要使用两个 <p> 标签来定义 header。只需定义两个 Paragraph object 就可以省去 CPU 解析 HTML.

的麻烦

最后:我必须指出你犯的一个错误。永远不要在 OnStartPage() 方法中添加内容,只能在 OnEndPage() 方法中添加内容。

In the documentation, we made it very clear that it was forbidden to add content in the onStartPage() method; content can only be added in the onEndPage() method. We also made it very clear that the Document object passed to the page event methods was passed for read-only purposes only. It was forbidden to use document.add() even in the onEndPage() method.

Unfortunately, many developers completely ignore the documentation, which led to problems such as:

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