【问题标题】:Add hyperlink to apache.poi.xslf autoshape添加超链接到 apache.poi.xslf autoshape
【发布时间】:2014-07-25 07:31:33
【问题描述】:

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

我可以通过将文本添加到自选图形并创建如下所示的超链接来做到这一点。

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 中,您可以右键单击自选图形,然后将其链接到另一张幻灯片。这会链接自动形状,如果您单击自动形状中的任何位置,它会将您带到链接的幻灯片,它也不会以蓝色下划线格式显示文本。这就是我想要达到的效果。

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

如果有办法,请告诉我。

在此先感谢您。

【问题讨论】:

  • 不知道如何使用您正在使用的库来执行此操作,但是您正在为形状内运行的文本而不是形状本身创建超链接,这就是您得到的原因你看到的结果。
  • 是的。没有将超链接添加到形状的方法。谢谢。

标签: java apache-poi slideshow powerpoint


【解决方案1】:

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

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;
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2016-03-15
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    相关资源
    最近更新 更多