我正在尝试将文本放入ColumnText对象并计算其确切高度。我正在使用iTextSharp 5.5.9
我发现在ColumnText对象的顶部似乎有一些“填充”,导致高度计算有缺陷,文本放错地方。我正在努力弄清楚到底发生了什么 - 这是我的代码:
var doc = new Document(PageSize.LETTER, DocumentRenderer.PageMarginSize, DocumentRenderer.PageMarginSize, DocumentRenderer.PageTopMarginSize, DocumentRenderer.PageMarginSize);
doc.SetPageSize(PageSize.LETTER.Rotate());
var writer = PdfWriter.GetInstance(doc, fs);
doc.Open();
var x = 5;
var y = doc.PageSize.Height - 5;
var width = doc.PageSize.Width/ 2;
var height = doc.PageSize.Height - 10;
var lines = new List<string> { "Test string", };// "Test string 2", "Test string 3", "Test string 4" };
for (int i = 0; i < 6; i++)
{
lines.Add("Test String " + i);
}
lines.Add(lines.Aggregate((a, b) => a + ", " + b));
lines.Add(lines.Aggregate((a, b) => a + "\n" + b));
PdfContentByte cb = writer.DirectContent;
cb.SetTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL);
cb.SetCMYKColorFill(DocumentRenderer.DarkColor.C, DocumentRenderer.DarkColor.M, DocumentRenderer.DarkColor.Y, DocumentRenderer.DarkColor.K);
Font ListFont = new Font(DocumentRenderer.TextFont, 12);
ColumnText ct = new ColumnText(cb);
ct.Leading = 14;
//ct.UseAscender = true;
ct.Alignment = Element.ALIGN_LEFT;
ct.SetSimpleColumn(x, y - height, x + width, y);
lines.ForEach(line =>
{
ct.AddText(new Phrase(line + "\n", ListFont));
});
ct.Go();
var height1 = (ct.LinesWritten * ct.Leading);
var height2 = y - ct.YLine;
DocumentRenderer.DrawBox(ref doc, ref writer, new BoxInfo(x, y, width, height2), DocumentRenderer.HighlightColor);
if (doc.IsOpen())
doc.Close();
我偶然发现了关于UseAscender的帖子(iText placement of Phrase within ColumnText)并通过在代码中取消注释该行来尝试它。你可以在图片右侧看到它似乎没有像我希望的那样工作。
我真正想要的是仍然正确绘制其前导的文本,但是从ColumnText的顶部开始。另外,我正在努力为文本获得准确的高度。 ct.YLine似乎给了我文本底部的一行,但是文本会稍微悬在下面。我不确定为什么这不正确但我需要知道确切的高度,如果可能的话......
任何人都知道如何实现这两件事吗?