如何从ApachePOIXSLF获取文本框的线宽?

dldeef67  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(425)

使用ApachePOI5.0.0从pptx文件获取简单文本框的线宽的正确方法是什么?我用maven apache poi、poi ooxml和poi scratchpad创建了一个小项目。
当我创建一个名为 test.pptx 有三个文本框
无边框(宽度为0.0)
默认边框(宽度为0.75)
宽度为2.0的边框
然后输出以下代码

FileInputStream fis = new FileInputStream("test.pptx");
    XMLSlideShow ppt = new XMLSlideShow(fis);
    fis.close();

    for (XSLFSlide slide : ppt.getSlides()) {
        for (XSLFShape shape : slide.getShapes()) {

            if (shape instanceof XSLFTextBox) {
                XSLFTextBox textBox = (XSLFTextBox) shape;

                String text = textBox.getText();
                System.out.println(text);

                double borderWidth = textBox.getLineWidth();
                System.out.println("line: "+borderWidth+", "+textBox.getLineColor());

            }
        }
    }

无边框: line: 0.0, null 违约: line: 0.0, java.awt.Color[r=91,g=155,b=213] 边框2.0: line: 2.0, java.awt.Color[r=91,g=155,b=213] 在文件中说宽度 0.0 没有边界。但是,当两者都返回时,如何区分无边框和默认边框呢 0.0 . 从颜色来看,此值不应为空。

ut6juiuv

ut6juiuv1#

如果 PowerPoint 形状使用默认线宽设置线条,则不设置宽度。只有线条本身设置了颜色设置。在形状中 XML 这看起来像:

<p:sp>
...
 <p:spPr>
 ...
  <a:ln>
   <a:solidFill>
    <a:schemeClr val="..."/>
   </a:solidFill>
  </a:ln>
  ...
 </p:spPr>
 ...
</p:sp>

但是一条线也可能有渐变色,那么这个看起来像:

<p:sp>
 ...
 <p:spPr>
 ...
  <a:ln>
   <a:gradFill>
    <a:gsLst>
    ...
    </a:gsLst>
    <a:lin scaled="1" ang="5400000"/>
   </a:gradFill>
  </a:ln>
  ...
 </p:spPr>
 ...
</p:sp>

然后不设置显式线条颜色 XSLFSimpleShape.getLineColor 会回来的 null .
因此,检查是否设置了线条颜色并不总是得到是否有线条。
正确的方法是检查形状属性中是否设置了线。但在高层次上还没有这样的方法 apache poi 班级。所以只有使用底层的低层 org.openxmlformats.schemas.presentationml.x2006.main.* 班级。
检查形状是否具有线集的方法示例:

boolean isShapeLineSet(XSLFShape shape) {
  boolean result = false;
  org.apache.xmlbeans.XmlObject shapeXmlObjekt = shape.getXmlObject();
  if (shapeXmlObjekt instanceof org.openxmlformats.schemas.presentationml.x2006.main.CTShape) {
   org.openxmlformats.schemas.presentationml.x2006.main.CTShape cTShape = (org.openxmlformats.schemas.presentationml.x2006.main.CTShape)shapeXmlObjekt;
   if (cTShape.getSpPr() != null) {
    if (cTShape.getSpPr().getLn() != null) {
     result = true;
    }
   }       
  }
  return result;     
 }

相关问题