首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将超链接添加到apache.poi.xslf自动形状

将超链接添加到apache.poi.xslf自动形状
EN

Stack Overflow用户
提问于 2014-06-04 23:03:00
回答 1查看 722关注 0票数 0

我正在用apache poi xslf库创建一个Powerpoint演示文稿。我需要创建一个自动整形,当单击自动整形时,它应该转到特定的幻灯片。

我可以通过将文本添加到autoshape并创建一个如下所示的超链接来完成此操作。

代码语言:javascript
复制
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);

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

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

我需要使用org.apache.poi.xslf库。我在org.apache.poi.hslf库中找到了一种类似的方法。但是我不能使用它,因为我需要XSLF库来实现其他一些特性。

如果有办法的话,请告诉我。

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2016-03-21 17:24:48

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

代码语言:javascript
复制
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;
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24040997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档