gpt4 book ai didi

c# - PDFSharp:使用自动换行测量长文本的高度

转载 作者:太空狗 更新时间:2023-10-30 00:32:47 30 4
gpt4 key购买 nike

PDFSharp 支持在绘制长文本部分时自动换行:

textFormatter.DrawString(text, font, XBrushes.Black, new XRect(x, y, textAreaWidth, 1000), XStringFormats.TopLeft);

如果文本长于 textAreaWidth,这将换行。

如何获取刚刚绘制的文字的高度?

我用 gfx.MeasureString() 试过了,但是没有支持指定最大宽度的重载。 gfx.MeasureString() 返回没有文本换行的文本大小。

感谢任何提示。

最佳答案

PdfSharp 的这个扩展不太适合我。不知道为什么,但我的高度一直比预期的高(几乎是所需高度的两倍)。所以我决定为 XGraphics 对象编写一个扩展方法,我可以在其中指定 maxWidth 并在内部计算软换行符。该代码使用默认的 XGraphics.MeasureString(string, XFont) 到内联文本宽度,并与文本中的单词聚合以计算换行符。计算软换行符的代码如下所示:

/// <summary>
/// Calculate the number of soft line breaks
/// </summary>
private static int GetSplittedLineCount(this XGraphics gfx, string content, XFont font, double maxWidth)
{
//handy function for creating list of string
Func<string, IList<string>> listFor = val => new List<string> { val };
// string.IsNullOrEmpty is too long :p
Func <string, bool> nOe = str => string.IsNullOrEmpty(str);
// return a space for an empty string (sIe = Space if Empty)
Func<string, string> sIe = str => nOe(str) ? " " : str;
// check if we can fit a text in the maxWidth
Func<string, string, bool> canFitText = (t1, t2) => gfx.MeasureString($"{(nOe(t1) ? "" : $"{t1} ")}{sIe(t2)}", font).Width <= maxWidth;

Func<IList<string>, string, IList<string>> appendtoLast =
(list, val) => list.Take(list.Count - 1)
.Concat(listFor($"{(nOe(list.Last()) ? "" : $"{list.Last()} ")}{sIe(val)}"))
.ToList();

var splitted = content.Split(' ');

var lines = splitted.Aggregate(listFor(""),
(lfeed, next) => canFitText(lfeed.Last(), next) ? appendtoLast(lfeed, next) : lfeed.Concat(listFor(next)).ToList(),
list => list.Count());

return lines;
}

有关完整代码,请参阅以下要点:https://gist.github.com/erichillah/d198f4a1c9e8f7df0739b955b245512a

关于c# - PDFSharp:使用自动换行测量长文本的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15461052/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com