在MigraDoc TextFrame中测量字符串

时间:2014-11-12 09:40:03

标签: c# asp.net migradoc

我已经尝试在他们的论坛上提出这个问题但尚未收到回复,希望有人可以帮助我。

我在asp.net中设置了一个自定义报告屏幕,人们可以在其中拖动标签和字段,Migradoc通过使用textframes和top / left / width / height属性将它们放置在拖动它们的同一位置来生成它调整大小。这一切都很好但是我遇到的一个问题是,如果文本比它在页面上运行的文本框架长,我需要页面相应地移动,同时保留其他对象。

我可以使用以下代码来测量字符串:

Style style = document.Styles["Normal"];
TextMeasurement tm = new TextMeasurement(style.Font.Clone());
float fh = tm.MeasureString(value, UnitType.Millimeter).Height;
float fw = tm.MeasureString(value, UnitType.Millimeter).Width;

但它仅用于比较宽度与框架而不是高度,因为一旦放入较小的区域,它可能会有所不同。有没有人知道如何根据绑定的宽度/高度值(即在文本框架内)测量此字符串。

2 个答案:

答案 0 :(得分:1)

查看CreateBlocks()类中的XTextFormatter方法以及它如何在循环中调用MeasureString以将文本分成多行。

我担心你必须自己实施这样的循环。

或者也许可以使用PrepareDocument()类的DocumentRenderer方法让MigraDoc完成工作,并在完成后查询维度。

BTW:在论坛上提出类似问题之前:
http://forum.pdfsharp.net/viewtopic.php?p=3590#p3590
答案包含一些源代码。

答案 1 :(得分:0)

执行此操作的一种简单方法(使用I-like-the-old-stack-overflow的链接)是将PdfWordWrapper class添加到项目中,然后按如下所示计算文本的尺寸:

var wrapper = new PdfWordWrapper(g, contentWidth); //g is your XGraphics object

wrapper.Add("My text here", someFont, XBrushes.Black);
wrapper.Process();
var dimensions = wrapper.Size; //you can access .Height or .Width
//If you want to reuse the wrapper just call .Clear() and then .Add() again with some new text