【问题标题】:How to create pptx file for Link-Video in Slide using Apache-POI如何使用 Apache-POI 为幻灯片中的链接视频创建 pptx 文件
【发布时间】:2020-11-29 13:21:57
【问题描述】:

我想使用 Apache-poi 在幻灯片中创建带有链接视频的 pptx 文件。

我在 Apache-Examples 代码中有一个示例

poi-4.1.2\src\scratchpad\testcases\org\apache\poi\hslf\model\TestMovieShape。

使用此示例,我可以创建 .ppt 文件,但不能创建 .pptx 文件。

同样使用此示例,媒体控件不可见。

【问题讨论】:

  • 我还没有验证这是否仍然有效,但请查看stackoverflow.com/a/16322340/2066598
  • 上面提到的例子是嵌入式视频演示。但我的要求是创建链接视频演示文稿。
  • 我会通过 Powerpoint 手动创建链接视频。解压缩 .pptx,因为这是一个 .zip 文件。检查 slide1.xml(假设示例只有一张幻灯片)并在形状条目下重新创建 xml 结构。通过链接的答案,您知道如何操作 xml - 所以在您知道幻灯片 xml 的外观之前,基本上都是反复试验。
  • 以前我也是这样想的,我解压PPT,在\ppt\slides文件夹中找到slide1.xml文件。但是我在这个文件中没有找到任何链接,我可以通过它使用一个作为示例并通过替换媒体文件的链接来创建另一个。甚至我在任何 XML 中都找不到媒体链接。
  • 我在嵌入视频演示示例中做了一些更改。

标签: java apache-poi powerpoint


【解决方案1】:

embedded video case相反,只需要更改几行。
视频 URI 不是真正的 URI,而只是同一目录中的相对 .mp4 文件名。虽然我还没有测试过,但绝对文件 URI 也应该可以工作。

我还没有实现帧提取,正如嵌入式示例中提到的那样 - 所以要么查找 xuggler 的存档版本,要么找到一个不同的库来提取预览图像。

使用 Powerpoint 2016 / POI 5.0.0-Snapshot 测试。

import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.drawingml.x2006.main.CTHyperlink;
import org.openxmlformats.schemas.presentationml.x2006.main.*;

import javax.xml.namespace.QName;
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import static org.apache.poi.openxml4j.opc.PackageRelationshipTypes.CORE_PROPERTIES_ECMA376_NS;

public class LinkVideoToPptx {
    public static void main(String[] args) throws IOException, URISyntaxException {
        XMLSlideShow pptx = new XMLSlideShow();

        String videoFileName = "file_example_MP4_640_3MG.mp4";
        XSLFSlide slide1 = pptx.createSlide();

        PackagePart pp = slide1.getPackagePart();
        URI mp4uri = new URI("./"+videoFileName);
        PackageRelationship prsEmbed1 = pp.addRelationship(mp4uri, TargetMode.EXTERNAL, "http://schemas.microsoft.com/office/2007/relationships/media");
        PackageRelationship prsExec1 = pp.addRelationship(mp4uri, TargetMode.EXTERNAL, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/video");


        File previewJpg = new File("preview.jpg");
        XSLFPictureData snap = pptx.addPicture(previewJpg, PictureData.PictureType.JPEG);
        XSLFPictureShape pic1 = slide1.createPicture(snap);
        pic1.setAnchor(new Rectangle(100, 100, 500, 400));

        CTPicture xpic1 = (CTPicture)pic1.getXmlObject();
        CTHyperlink link1 = xpic1.getNvPicPr().getCNvPr().addNewHlinkClick();
        link1.setId("");
        link1.setAction("ppaction://media");


        CTApplicationNonVisualDrawingProps nvPr = xpic1.getNvPicPr().getNvPr();
        nvPr.addNewVideoFile().setLink(prsExec1.getId());
        CTExtension ext = nvPr.addNewExtLst().addNewExt();
        ext.setUri("{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}");

        String p14Ns = "http://schemas.microsoft.com/office/powerpoint/2010/main";
        XmlCursor cur = ext.newCursor();
        cur.toEndToken();
        cur.beginElement(new QName(p14Ns, "media", "p14"));
        cur.insertNamespace("p14", p14Ns);
        cur.insertAttributeWithValue(new QName(CORE_PROPERTIES_ECMA376_NS, "link"), prsEmbed1.getId());
        cur.dispose();


        CTSlide xslide = slide1.getXmlObject();
        CTTimeNodeList ctnl;
        if (!xslide.isSetTiming()) {
            CTTLCommonTimeNodeData ctn = xslide.addNewTiming().addNewTnLst().addNewPar().addNewCTn();
            ctn.setDur(STTLTimeIndefinite.INDEFINITE);
            ctn.setRestart(STTLTimeNodeRestartType.NEVER);
            ctn.setNodeType(STTLTimeNodeType.TM_ROOT);
            ctnl = ctn.addNewChildTnLst();
        } else {
            ctnl = xslide.getTiming().getTnLst().getParArray(0).getCTn().getChildTnLst();
        }
        CTTLCommonMediaNodeData cmedia = ctnl.addNewVideo().addNewCMediaNode();
        cmedia.setVol(80000);
        CTTLCommonTimeNodeData ctn = cmedia.addNewCTn();
        ctn.setFill(STTLTimeNodeFillType.HOLD);
        ctn.setDisplay(false);
        ctn.addNewStCondLst().addNewCond().setDelay(STTLTimeIndefinite.INDEFINITE);
        cmedia.addNewTgtEl().addNewSpTgt().setSpid(""+pic1.getShapeId());


        try (FileOutputStream fos = new FileOutputStream("mp4test-poi.pptx")) {
            pptx.write(fos);
        }
    }
}

【讨论】:

  • kiwiwings 抱歉,因为响应延迟,实际上我遇到了硬件问题,无法对此进行测试。今天我做了这个,它工作得非常好。谢谢你的帮助。我需要在此添加模板,我非常了解如何添加模板。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多