这是我看到的标题:
这是我的实际标题:
这是我的代码:
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();
}
答案 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));
现在是时候说:等一下!我有两个额外的问题!
我我定义了一个领先者,不要在10
方法中看到参数SetSimpleColumn()
吗?是的,我确实看到了这个参数,但[1]你的字体大小为12,并且小于字体大小的前导将导致文本丑陋,[2]我怀疑XML Worker在复合模式中添加段落,在哪种情况下,列的前导被忽略,以支持段落的前导。对齐方式也是如此(您在HTML中使用了text:align: center
来实现此目的),这就是我从setSimpleColumn()
方法中删除了两个未使用的参数的原因。
如果我按照您的建议,我的标题与实际内容重叠。这是正确的,因为默认的上边距是36个用户单位高,并且您定义了一个高达40个用户单位的标题矩形。如果您想避免上边距与实际内容重叠,则必须扩大上边距。
我有一个反问题:为什么你在使用XML Worker来创建标题。你的标题非常简单。我不明白为什么您要使用两个<p>
标记来定义标题。只需定义两个Paragraph
对象,您就可以省去解析HTML的麻烦。
最后:我必须指出你正在犯的错误。您不应该只使用OnStartPage()
方法在OnEndPage()
方法中添加内容。
在文档中,我们非常清楚地表明它是禁止的 在
onStartPage()
方法中添加内容;内容只能是 在onEndPage()
方法中添加。我们也非常清楚地说明了这一点 传递给页面事件方法的Document
对象 只读目的。即使在document.add()
方法中,禁止也使用onEndPage()
。不幸的是,许多开发人员完全忽略了文档, 这导致了以下问题:
此外,您可能会删除有关LinesWritten
的奇怪行。我不明白为什么它们会有用。