在 Powerpoint 中缩小形状上的溢出文本
Shrink text on overflow on a shape in Power Point
我有一个使用 Apache POI 的 Java 应用程序,它生成一个 PPT(PowerPoint 演示文稿),其中包含形状和这些形状上的文本。我希望这些文本自动适合相应的形状。在 PowerPoint 中肯定有一个选项,它工作正常并称为 'Shrink text on overflow'
使用 Apache POI,我可以从代码中设置此选项。示例如下:
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时,文本是原来的大小,并且溢出了,但是我可以看到设置了正确的选项。但是,如果我在此形状上设置任何内容或重置幻灯片,文本会突然缩小。所以选项设置正确它只是在我刷新形状之前不会生效。
Apache POI 中有没有办法以某种方式强制刷新形状?或者是否有任何其他方法可以实现“溢出时收缩文本”行为?
我正在使用 Apache POI 5.0。
在 Office Open XML 绘图中,Normal 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();
}
}
我有一个使用 Apache POI 的 Java 应用程序,它生成一个 PPT(PowerPoint 演示文稿),其中包含形状和这些形状上的文本。我希望这些文本自动适合相应的形状。在 PowerPoint 中肯定有一个选项,它工作正常并称为 'Shrink text on overflow'
使用 Apache POI,我可以从代码中设置此选项。示例如下:
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时,文本是原来的大小,并且溢出了,但是我可以看到设置了正确的选项。但是,如果我在此形状上设置任何内容或重置幻灯片,文本会突然缩小。所以选项设置正确它只是在我刷新形状之前不会生效。
Apache POI 中有没有办法以某种方式强制刷新形状?或者是否有任何其他方法可以实现“溢出时收缩文本”行为?
我正在使用 Apache POI 5.0。
在 Office Open XML 绘图中,Normal 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();
}
}