itext 7 c#中的多行页脚

Posted

技术标签:

【中文标题】itext 7 c#中的多行页脚【英文标题】:Multiple line footer in itext 7 c# 【发布时间】:2020-09-08 14:07:19 【问题描述】:

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

    

谢谢 普里扬卡

【问题讨论】:

请您向我们展示您的尝试,以便我们根据您选择的方法提供指导。或者至少向我们展示当前截断长文本的代码 我已经添加了添加页脚的代码 【参考方案1】:

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

如果您需要自动换行,请使用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 的初始值或行间距来获得您需要的确切内容

【讨论】:

感谢您的解释。有没有办法将文本放置在动态位置,因为我的页脚文本将是动态的?它可以从 2-6 行开始。 是的。位置由您的变量coordXfooterY 确定。我没有对您的代码示例中的内容进行更改。你试过这个解决方案吗?现在可以用了吗?【参考方案2】:

如果你想让 itext 自己换行,你应该用一个段落包裹文本并通过 Canvas#add 方法将它添加到画布:

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

【讨论】:

以上是关于itext 7 c#中的多行页脚的主要内容,如果未能解决你的问题,请参考以下文章

页脚中的版权符号未与其余文本一起调整大小(在 Drupal 7 中)

reportlab中的多行(段落)页脚和标题

使用 UICollectionView 页脚中的对象

CTaskDialog 页脚中的超链接

Crystal Report:报表页脚中的条件基数

返回正确大小的页脚时,部分页脚中的 UITableView 随机白线