当前位置: 首页 > 知识库问答 >
问题:

Power Point中形状溢出时收缩文本

陶琦
2023-03-14

我有一个使用Apache POI的Java应用程序,它会生成一个PPT(PowerPoint演示文稿),上面有形状和文本。我希望这些文本能自动适应相应的形状。PowerPoint中肯定有一个选项,它工作正常,叫做“溢出时收缩文本”

有了ApachePOI,我可以从代码中设置这个选项。下面的例子:

private void drawRectWithText(XSLFSlide slide, int x, int y, int width, int height, String text) {
    XSLFAutoShape shape1 = slide.createAutoShape();
    Rectangle rect1 = new Rectangle(x, y, width, upperRectHeight);
    shape1.setAnchor(rect1.getBounds2D());
    shape1.setShapeType(ShapeType.RECT);
    shape1.setText(text);
    shape1.setTextDirection(TextDirection.HORIZONTAL);
    shape1.setVerticalAlignment(VerticalAlignment.MIDDLE);
    XSLFTextParagraph xslfTextParagraph = shape1.getTextParagraphs().get(0);
    xslfTextParagraph.setTextAlign(TextParagraph.TextAlign.CENTER);
    xslfTextParagraph.setFontAlign(FontAlign.AUTO);
    XSLFTextShape xslfTextShape = xslfTextParagraph.getParentShape();
    xslfTextShape.setTextAutofit(TextAutofit.NORMAL); // <-- This sets the 'Shrink text on overflow'
    xslfTextShape.setAnchor(rect1.getBounds2D());
}

这确实正确设置了“溢出时收缩文本”选项,但没有发生任何情况,文本不会收缩。

当我打开生成的PPT时,文本具有原始大小,并且溢出,但我可以看到设置了正确的选项。然而,如果我在这个形状上设置了任何东西,或者重置了幻灯片,文本会突然缩小。因此,该选项设置正确,直到刷新形状时才会生效。

在ApachePOI中有没有办法以某种方式强制刷新形状?或者有没有其他方法来实现“溢出收缩文本”行为?

我正在使用Apache POI 5.0。

共有1个答案

邢昊焜
2023-03-14

在Office Open XML绘图中,正常的AutoFit需要一个fontScale属性,该属性指定文本体中每次运行的原始字体大小的比例。如果省略此属性,则表示值为100%。Apache POI没有设置字体比例的方法,也不会自动计算字体比例。所以省略了。只有PowerPoint的GUI会在必要时自动计算字体比例。

为了提供一种变通方法,可以使用XSLFTextShape。resizeToFitText计算矩形的大小,该矩形需要容纳所有文本。如果该大小大于给定的大小,则计算所需的字体比例,以适合较小大小矩形中的文本。但是,XSLFTextShape。resizeToFitText将调整形状的大小,因此需要在此之后再次设置所需的大小。

例子:

import java.io.FileOutputStream;

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.sl.usermodel.*;

import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;

public class CreatePPTXTextShape {
    
 static void drawRectWithText(XSLFSlide slide, int x, int y, int width, int height, String text) {
  XSLFAutoShape shape = slide.createAutoShape();
  Rectangle rect = new Rectangle(x, y, width, height);
  shape.setAnchor(rect.getBounds2D());
  shape.setShapeType(ShapeType.RECT);
  shape.setText(text);
  shape.setTextDirection(TextShape.TextDirection.HORIZONTAL);
  shape.setVerticalAlignment(VerticalAlignment.MIDDLE);
  shape.setTextAutofit(TextShape.TextAutofit.NORMAL); // <-- This sets the 'Shrink text to overflow'
  
  // calculate the needed font scaling
  Rectangle2D rect2D = shape.resizeToFitText();
  double upscaledHeight = rect2D.getHeight(); // needed height to fit the text in
  double hScale = 1d;
  if (upscaledHeight > height) hScale = height / upscaledHeight;
  System.out.println(hScale);
  // set font scale
  shape.getTextBody().getXmlObject().getBodyPr().getNormAutofit().setFontScale(hScale * 100000);
  // shape.resizeToFitText() had resized the shape, so set wanted size again
  shape.setAnchor(rect.getBounds2D());
  
  XSLFTextParagraph xslfTextParagraph = shape.getTextParagraphs().get(0);
  xslfTextParagraph.setTextAlign(TextParagraph.TextAlign.CENTER);
 }

 public static void main(String[] args) throws Exception {

  SlideShow slideShow = new XMLSlideShow();

  XSLFSlide slide = (XSLFSlide)slideShow.createSlide();

  drawRectWithText(slide, 100, 100, 50, 50, "This is a test text.");
  
  drawRectWithText(slide, 100, 200, 100, 50, "This is a longer test text.");
  
  drawRectWithText(slide, 300, 100, 50, 100, "This is a much longer test text.");

  FileOutputStream out = new FileOutputStream("./CreatePPTXTextShape.pptx");
  slideShow.write(out);
  out.close();
  slideShow.close();
 }
}
 类似资料:
  • 我正试图找出一个PowerPoint文件的宏,在语言转换后通过CAT工具导出。在某些语言对中,由于语言长度的差异,翻译的内容无法放入源文件文本框。 因此,翻译和导出的PowerPoint文件包含多个形状/文本框,这些形状/文本框的某些内容超出了这些形状的可见区域。我想知道有什么方法可以让导出的PPT文件中的所有形状/文本框中的新导出的文本内容在整个文件中全局收缩,以适应这些形状的原始大小——仅在内

  • text-overflow属性用来设置容器内的文本溢出时,如何处理溢出的内容,取值为 clip | ellipsis,默认值为 clip。 clip 表示文本溢出时,简单的把溢出的部分裁剪掉;ellipsis 表示文本溢出时,在溢出的地方显示一个省略标记(…)。 在使用 text-overflow属性时,一定要给容器定义宽度,否则,文本只会撑开容器,而不会溢出。 事实上,text-overflow

  • 我正在寻找一种在文本中添加省略号的方法,当它超过一定数量的行。我不想使用一个插件,我从另一个答案中找到了一个纯JS代码。但是,省略号“……”应用于每一个元素,即使它没有通过数字的限制。 HTML: CSS: !!我添加了两倍于行高的高度,以使超过两行的文本溢出。如果我想要三条线,我放三倍的线高。 JS: 使用“之前”和“之后”的示例进行编辑: 前:Lorem ipsum dolor sit ame

  • 我有200个不同的文件,我需要把一列接一列的内容压缩成一个文件。这200个文件位于一个目录中,因此我尝试了以下脚本。 但它抛出以下值错误,因为每个文件的形状都不同。我想有一些解决办法。非常感谢。 这是一个错误,

  • 文字形状(TextGeometry)可以用来创建三维的文字形状。 下载使用 使用文字形状需要下载和引用额外的字体库,具体参见Three.js GitHub说明。 这里,我们以 helvetiker字体为例。我们在Three.js GitHub master/examples/fonts目录下,下载helvetiker_regular.typeface.json文件放在你的目录下,然后用以下方法加载

  • 问题内容: .flex-container { 当我删除flex属性时,它工作正常。 我想知道为什么柔韧性会影响省略号。 TIA 问题答案: 您的问题在于缺少“灵活的孩子”。这些将需要包含样式以截断元素,而不是父容器。 尝试将truncate属性移动到一个单独的类,如下所示: