我正在开发一个应用程序,它必须重新创建PowerPoint如何适应文本(收缩到适合),以便确定必要的字体比例,以允许设置文本以适应PowerPoint中给定的文本框。
我使用Aspose库来生成幻灯片,但是Aspose计算的字体比例通常是不正确的,所以当第一次打开演示文稿时,一些文本可能会比预期的大,导致长文本流出文本框并进入其他相邻的文本框。
起初,我尝试使用GDI MeasureString()和手动换行算法,但这是非常不准确的。我发现PowerPoint使用DirectWrite将文本渲染到屏幕上,所以我尝试使用ShaprDX和TextLayout,并获得了更好的结果。
我的算法包括反复尝试布局给定文本框中的文本,并减小字体比例,直到适合为止。
然而,我最近发现,PowerPoint似乎比SharpDX有更宽的字符间距,但在一些字母之后,它导致PowerPoint中的文本换行早于SharpDX。
如果您查看示例图像,我以100%的比例拍摄了PowerPoint幻灯片的屏幕截图,并将SharpDX的屏幕截图渲染到了一个表单中。我已经在PowerPoint镜像上覆盖了SharpDX镜像。
SharpDX文本更长,因为它已经“适应”了给定的字体大小。
文本:ΑποτελέσματαέναντιΠαγκόσμιοΠρότυποΥψηλώνΕπιδόσεων字体: Arial 11pt文本框大小: 444px x 24px (4.63“x 0.26") 0周围页边距
在PowerPoint中,如果没有按大小缩小,则此文本将自动换行。
在SharpDX中,文本不会换行。
我使用以下公式将字体大小从点转换为像素:
像素=点数x 96f / 72f;
我还没有找到在SharpDX中设置字符间距的方法。这有可能吗?
发布于 2016-12-27 19:53:29
我已经观察到你的需求,并且想分享一下,Aspose.Slides只使用PowerPoint的内部属性来进行文本换行,比如缩小文本w.r.t形状或调整形状w.r.t以适应形状中的文本量。不存在这样的边界访问。但是,您可以获得在其中封装文本的形状的x、y、宽度和高度。
Presentation pres=new Presentation("TEST.pptx");
ISlide slide=pres.Slides[0];
//Shape holding text is an AutoShape
IAutoShape ashp=(IAutoShape)slide.Shapes[0];
float x=ashp.X;
float y=ashp.Y;
float width=ashp.Width;
float height =ashp.Height;
请注意,返回的值映射到每英寸72像素。例如,10“X 7.5”的标准幻灯片的Aspose.Slides大小相当于720 x 540。我希望这会对你有所帮助。
我在Aspose担任开发人员/布道者。
https://stackoverflow.com/questions/41281065
复制相似问题