【问题标题】:Itextsharp Header html only show one lineItextsharp Header html 只显示一行
【发布时间】:2016-10-11 06:15:32
【问题描述】:

这是我看到的标题:

这是我的实际标题:

这是我的代码:

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

【问题讨论】:

    标签: pdf-generation itext


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

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

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

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

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

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

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

    【讨论】:

    • :DD 谢谢朋友,标题内容是一个例子,内容将由客户端用富文本编辑器编辑,您的回答解决了我的问题非常感谢。
    • 好的,在这种情况下使用 HTML 是有意义的。如果它解决了您的问题,请接受答案。 (请参阅分数下方的复选标记。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多