itext 7 c# 中的多行页脚

Multiple line footer in itext 7 c#

我想使用 C# 在 itext7 中添加动态页脚。页脚可以包含 1 到 6 行文本。我已经能够实现单行页脚,但长文本被截断了。

请帮忙。

添加页脚的代码:

class CustomEventHandler : IEventHandler
{
    protected Document doc;
    private Table table;


    public CustomEventHandler(Document doc)
    {
        this.doc = doc;
    }

    public CustomEventHandler(Table table)
    {
        this.table = table;
    }


    public void HandleEvent(Event currentEvent)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)currentEvent;
        Rectangle pageSize = docEvent.GetPage().GetPageSize();
        PdfFont font = null;
        try
        {
            font = PdfFontFactory.CreateFont(StandardFonts.HELVETICA_OBLIQUE);
        }
        catch (IOException e)
        {
            Console.Error.WriteLine(e.Message);
        }

        float coordX = pageSize.GetLeft() + doc.GetLeftMargin();

        float headerY = pageSize.GetTop() - doc.GetTopMargin() + 10;
        float footerY = doc.GetBottomMargin();
        Canvas canvas = new Canvas(docEvent.GetPage(), pageSize);
        canvas
            .SetFont(font)
            .SetFontSize(5)
            .ShowTextAligned("this is a header", coordX, headerY, TextAlignment.CENTER)
            .ShowTextAligned("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", coordX, footerY, TextAlignment.LEFT)
            .Close();

    }
}

谢谢 朴雅卡

您必须分解文本以使其适合而不被截断。 canvas 不知道如何换行或换行,因此您必须手动执行此操作。

如果您需要自动换行,请使用 ColumnText 而不是 Canvas。看到这个 example

要继续使用 canvas,请先在一定数量的字符后将文本拆分,您可以通过反复试验来确定有多少。以下是您可以用来执行此操作的方法

static List<string> Split(string str, int chunkSize)
{
    return Enumerable.Range(0, str.Length / chunkSize)
        .Select(i => str.Substring(i * chunkSize, chunkSize)).ToList();
}

取自这个answer to a different question

然后从那里,将每个返回的字符串插入到 canvas

Canvas canvas = new Canvas(docEvent.GetPage(), pageSize)
        .SetFont(font)
        .SetFontSize(5);
List<string> chunks = Split("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", 50);//splitting after every 50 characters, for example

for(int i=0; i<chunks.Count; i++)
{
    canvas = canvas.ShowTextAligned(new Paragraph(chunks[i]),
             coordX, footerY-(i*5), TextAlignment.LEFT, VerticalAlignment.MIDDLE);
    //where each line is separated by 5 units
}
canvas.Close();

您可能需要检查所有六行是否都适合您的底部边距,否则您需要尝试使用 footerX 的初始值或行间距来获得您需要的内容

如果你想让 itext 自己换行,你应该用段落包装文本,然后通过 Canvas#add 方法将其添加到 canvas:

Paragraph p = new Paragraph("");
//put the paragraph in the very bottom of the canvas
p.SetFixedPosition(0, 0, pageSize.getWidth()); 
canvas.Add(p);