添加到apache.poi.xslf autoshape的超链接

时间:2014-06-04 15:03:00

标签: java apache-poi slideshow powerpoint

我正在使用apache poi xslf库创建一个Powerpoint presentaion。我需要创建一个Autoshape,当点击自动形状时,它应该转到特定的幻灯片。

我可以通过向自动形状添加文本并创建如下所示的超链接来完成此操作。

XMLSlideShow ppt = new XMLSlideShow();
XSLFSlide slide1 = ppt.createSlide();
XSLFSlide slide2 = ppt.createSlide();
XSLFSlide slide3 = ppt.createSlide();
XSLFAutoShape sh1 = slide1.createAutoShape();
sh1.setAnchor(new Rectangle(100, 50, 100, 50));
XSLFTextRun r2 = sh1.addNewTextParagraph().addNewTextRun();
XSLFHyperlink link2 = r2.createHyperlink();
r2.setText("Go to Slide 3");
link2.setAddress(slide3);

但问题是当我创建这样的自动形状时,它实际上链接文本而不是形状。此外,当我从Powerpoint打开它时,它会显示蓝色下划线文本的超链接,这是我不想要的。

在Powerpoint中,您可以右键单击Autoshape,然后将其链接到其他幻灯片。这会链接自动形状,如果您单击自动形状中的任何位置,它会将您带到链接的幻灯片,也不会以蓝色下划线格式显示文本。这就是我想要达到的效果。

我需要使用org.apache.poi.xslf库。我找到了一种在org.apache.poi.hslf库中做类似事情的方法。但我无法使用它,因为我需要XSLF库来实现其他功能。

如果有办法,请告诉我。

先谢谢你。

1 个答案:

答案 0 :(得分:0)

您可以将自选图形链接到特殊幻灯片,因此您必须使用一些自己的逻辑:

CTShapeNonVisual shapeProperty = XmlObjectReaderUtil.getElementValue(sh1.getXmlObject(), CTShapeNonVisual.class, XmlObjectReaderUtil.NEW_CT_SHAPE_NON_VISUAL);
CTNonVisualDrawingProps cNvPr = shapeProperty.getCNvPr();
CTHyperlink hlinkClick = cNvPr.getHlinkClick();
if (hlinkClick == null) {
  hlinkClick = cNvPr.addNewHlinkClick();
}
PackageRelationship rel = autoShape.getSheet()
                   .getPackagePart()
                   .addRelationship(slide3.getPackagePart().getPartName(),
                            TargetMode.INTERNAL,
                            XSLFRelation.SLIDE.getRelation());
hlinkClick.setId(rel.getId());
hlinkClick.setAction("ppaction://hlinksldjump");

//Helper class
public final class XmlObjectReaderUtil {

  public static final String NEW_CT_SHAPE_NON_VISUAL = "declare namespace main='http://schemas.openxmlformats.org/presentationml/2006/main' main:nvSpPr";

  private XmlObjectReaderUtil() {
    //Static-Service Class
  }

  @SuppressWarnings("unchecked")
  public static <T extends XmlObject> T getElementValue(XmlObject xmlObject, Class<T> clazz, String xquery) {
    XmlObject[] rs = xmlObject.selectPath(xquery);
        if (rs.length == 0) {
          return null;
        }
        return (clazz.isInstance(rs[0])) ? (T)rs[0] : null;
  }
}