itext 7 c#中的多行页脚

问题描述 投票:0回答:1

我想使用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();

    }
}

谢谢普里扬卡

c# footer itext7
1个回答
0
投票

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

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

[为了继续使用画布,请在一定数量的字符后先将文本分解,您可以反复尝试找出有多少个字符。下面是您可以用来执行此操作的方法

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 = 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的初始值或行距来获得所需的精确值

© www.soinside.com 2019 - 2024. All rights reserved.