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 行开始。 是的。位置由您的变量coordX
和footerY
确定。我没有对您的代码示例中的内容进行更改。你试过这个解决方案吗?现在可以用了吗?【参考方案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#中的多行页脚的主要内容,如果未能解决你的问题,请参考以下文章