/*
* Copyright 2015, Plutext Pty Ltd.
*
* This file is part of docx4j.
docx4j is licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package org.pptx4j.samples;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.docx4j.TraversalUtil;
import org.docx4j.TraversalUtil.CallbackImpl;
import org.docx4j.XmlUtils;
import org.docx4j.dml.CTTable;
import org.docx4j.dml.CTTableRow;
import org.docx4j.openpackaging.packages.OpcPackage;
import org.docx4j.openpackaging.packages.PresentationMLPackage;
import org.docx4j.openpackaging.parts.PartName;
import org.docx4j.openpackaging.parts.PresentationML.SlidePart;
/**
* Given a slide, find the first table, then duplicate a table row.
*
*
* @author jharrop
*
*/
public class SlideFindTable {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
String inputfilepath = System.getProperty("user.dir") + "/sample-docs/pptx/table.pptx";
PresentationMLPackage pMLPackage =
(PresentationMLPackage)OpcPackage.load(new java.io.File(inputfilepath));
SlidePart slide = (SlidePart)pMLPackage.getParts().get(new PartName("/ppt/slides/slide1.xml") );
// First, find the tables
ClassFinder dmlTableFinder = new ClassFinder(org.docx4j.dml.CTTable.class);
new TraversalUtil(slide.getJaxbElement().getCSld().getSpTree().getSpOrGrpSpOrGraphicFrame(), dmlTableFinder);
/* structure will contain:
*
org.pptx4j.pml.CTGraphicalObjectFrame
org.docx4j.dml.CTTable
org.docx4j.dml.CTTableRow
org.docx4j.dml.CTTableCell
org.docx4j.dml.CTTableCell
org.docx4j.dml.CTTableRow
org.docx4j.dml.CTTableCell
org.docx4j.dml.CTTableCell
org.docx4j.dml.CTTableRow
org.docx4j.dml.CTTableCell
org.docx4j.dml.CTTableCell
*/
if (dmlTableFinder.results.isEmpty() ) {
System.out.println(
"No org.docx4j.dml.CTTable found on this slide" );
return;
}
CTTable theTable = (CTTable)dmlTableFinder.results.get(0);
// Now copy a table row
// First, get the row to copy
CTTableRow srcRow = theTable.getTr().get(0);
// Next, copy it
CTTableRow clonedRow = XmlUtils.deepCopy(srcRow);
// Finally, insert the copy in the list
theTable.getTr().add(clonedRow); // standard Java list API
// Save the result
pMLPackage.save(new File( System.getProperty("user.dir") + "/OUT_SlideFindTable.pptx"));
}
static class ClassFinder extends CallbackImpl {
protected Class<?> typeToFind;
public ClassFinder(Class<?> typeToFind) {
this.typeToFind = typeToFind;
}
public List<Object> results = new ArrayList<Object>();
@Override
public List<Object> apply(Object o) {
// Adapt as required
if (o.getClass().equals(typeToFind)) {
results.add(o);
}
return null;
}
public List<Object> getChildren(Object o) {
if (o instanceof org.pptx4j.pml.CTGraphicalObjectFrame) {
org.docx4j.dml.Graphic graphic = ((org.pptx4j.pml.CTGraphicalObjectFrame)o).getGraphic();
if (graphic!=null
&& graphic.getGraphicData()!=null) {
return graphic.getGraphicData().getAny();
} else {
return null;
}
}
return TraversalUtil.getChildrenImpl(o);
}
}
}