我正在开发一个应用程序,必须重新创建PowerPoint如何适合文本(缩小到适合),以确定允许一组文本适合PowerPoint中给定文本框内所需的字体缩放。
我使用Aspose库来生成幻灯片,但Aspose计算的字体比例通常是不正确的,所以当首次打开演示文稿时,某些文本可能会显示大于预期,导致长文本流出文本框和其他相邻的文本框。
起初我尝试使用GDI MeasureString()和手动自动换行算法,但这非常不准确。我发现PowerPoint使用DirectWrite将文本渲染到屏幕,所以我尝试使用ShaprDX和TextLayout并获得了更好的结果。
我的算法涉及重复尝试在给定文本框中布局文本并减小字体比例直到它适合。
然而,我最近发现PowerPoint似乎比SharpDX具有更宽的字符间距,并不多,但是在一些字母之后,它导致PowerPoint中的文本包装比SharpDX更早。
如果您查看示例图像,我会以100%的速度截取PowerPoint幻灯片的屏幕截图,并将SharpDX的屏幕截图呈现为一个表单。我已将SharpDX图像叠加在PowerPoint图像上。
SharpDX文本较长,因为它已经“适合”给定的字体大小。
文字:ΑποτελέσματαέναντιΠαγκόσμιοΠρότυποΥψηλώνΕπιδόσεων 字体:Arial 11pt 文本框大小:444px x 24px(4.63“x 0.26”)0边缘
在PowerPoint中,没有缩小以适应,此文本将换行。
在SharpDX中,文字没有换行。
我正在使用以下公式将字体大小从点转换为像素:
像素=点数x 96f / 72f;
我还没有找到在SharpDX中设置字符间距的方法。这甚至可能吗?
答案 0 :(得分:0)
我已经观察过您的要求,并且喜欢分享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担任开发人员/传播者。