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));
现在是你说的时候了:等一下!我还有两个问题!
我am定义了一个leading,没看到SetSimpleColumn()
方法里面的参数10
吗?是的,我确实看到了那个参数,但是 [1] 你的字体大小是 12,小于字体大小的行距会导致文本难看,而且 [2] 我怀疑 XML Worker 在复合模式,在这种情况下,列的前导被忽略,有利于段落的前导。对齐方式也是如此(您在 HTML 中使用 text:align: center
来实现此目的),这就是为什么我从 setSimpleColumn()
方法中删除了两个未使用的参数。
如果我听从您的建议,我的 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
的奇怪行。我不明白为什么它们会有用。
这是我看到的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));
现在是你说的时候了:等一下!我还有两个问题!
我am定义了一个leading,没看到
SetSimpleColumn()
方法里面的参数10
吗?是的,我确实看到了那个参数,但是 [1] 你的字体大小是 12,小于字体大小的行距会导致文本难看,而且 [2] 我怀疑 XML Worker 在复合模式,在这种情况下,列的前导被忽略,有利于段落的前导。对齐方式也是如此(您在 HTML 中使用text:align: center
来实现此目的),这就是为什么我从setSimpleColumn()
方法中删除了两个未使用的参数。如果我听从您的建议,我的 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 theonEndPage()
method. We also made it very clear that theDocument
object passed to the page event methods was passed for read-only purposes only. It was forbidden to usedocument.add()
even in theonEndPage()
method.Unfortunately, many developers completely ignore the documentation, which led to problems such as:
此外,您可以删除有关 LinesWritten
的奇怪行。我不明白为什么它们会有用。