From a1b8f3ff1446f1e52d9ced9de8370e10cf5e5faa Mon Sep 17 00:00:00 2001 From: Javen O'Neal Date: Sun, 12 Nov 2017 21:48:41 +0000 Subject: [PATCH] bug 61745: add support for charts in XWPF/docx. Thanks to Sandeep Tiwari for the patch git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1815047 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xwpf/usermodel/XWPFChart.java | 165 ++++++++++++++++++ .../poi/xwpf/usermodel/XWPFDocument.java | 12 ++ .../poi/xwpf/usermodel/XWPFRelation.java | 6 + .../org/apache/poi/xwpf/AllXWPFTests.java | 4 +- .../poi/xwpf/usermodel/TestXWPFChart.java | 87 +++++++++ test-data/document/61745.docx | Bin 0 -> 37030 bytes 6 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java create mode 100644 src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFChart.java create mode 100644 test-data/document/61745.docx diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java new file mode 100644 index 000000000..e7df6ec69 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFChart.java @@ -0,0 +1,165 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.apache.poi.xwpf.usermodel; + +import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; + +import javax.xml.namespace.QName; + +import org.apache.poi.POIXMLDocumentPart; +import org.apache.poi.POIXMLException; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackageRelationship; +import org.apache.poi.util.Beta; +import org.apache.poi.util.IOUtils; +import org.apache.poi.util.Internal; +import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlOptions; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace; +import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument; + +/** + * Represents a Chart in a .docx file + */ +@Beta +public class XWPFChart extends POIXMLDocumentPart { + + /** + * Root element of the Chart part + */ + private final CTChartSpace chartSpace; + + /** + * The Chart within that + */ + private final CTChart chart; + + // lazy initialization + private Long checksum; + + /** + * Construct a chart from a package part. + * + * @param part the package part holding the chart data, + * the content type must be application/vnd.openxmlformats-officedocument.drawingml.chart+xml + * + * @since POI 4.0.0 + */ + protected XWPFChart(PackagePart part) throws IOException, XmlException { + super(part); + + chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream(), DEFAULT_XML_OPTIONS).getChartSpace(); + chart = chartSpace.getChart(); + } + + @Override + protected void onDocumentRead() throws IOException { + super.onDocumentRead(); + } + + /** + * Return the underlying CTChartSpace bean, the root element of the Chart part. + * + * @return the underlying CTChartSpace bean + */ + @Internal + public CTChartSpace getCTChartSpace() { + return chartSpace; + } + + /** + * Return the underlying CTChart bean, within the Chart Space + * + * @return the underlying CTChart bean + */ + @Internal + public CTChart getCTChart() { + return chart; + } + + @Override + protected void commit() throws IOException { + XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS); + xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c")); + + try (OutputStream out = getPackagePart().getOutputStream()) { + chartSpace.save(out, xmlOptions); + } + } + + public Long getChecksum() { + if (this.checksum == null) { + InputStream is = null; + byte[] data; + try { + is = getPackagePart().getInputStream(); + data = IOUtils.toByteArray(is); + } catch (IOException e) { + throw new POIXMLException(e); + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + throw new POIXMLException(e); + } + } + this.checksum = IOUtils.calculateChecksum(data); + } + return this.checksum; + } + + @Override + public boolean equals(Object obj) { + /** + * In case two objects ARE equal, but its not the same instance, this + * implementation will always run through the whole + * byte-array-comparison before returning true. If this will turn into a + * performance issue, two possible approaches are available:
+ * a) Use the checksum only and take the risk that two images might have + * the same CRC32 sum, although they are not the same.
+ * b) Use a second (or third) checksum algorithm to minimise the chance + * that two images have the same checksums but are not equal (e.g. + * CRC32, MD5 and SHA-1 checksums, additionally compare the + * data-byte-array lengths). + */ + if (obj == this) { + return true; + } + + if (obj == null) { + return false; + } + + if (!(obj instanceof XWPFChart)) { + return false; + } + return false; + } + + @Override + public int hashCode() { + return getChecksum().hashCode(); + } +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java index 37f377d8f..e63b98995 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java @@ -96,6 +96,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { protected XWPFFootnotes footnotes; private CTDocument1 ctDocument; private XWPFSettings settings; + protected final List charts = new ArrayList<>(); /** * Keeps track on all id-values used in this document and included parts, like headers, footers, etc. */ @@ -220,6 +221,11 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { picData.onDocumentRead(); registerPackagePictureData(picData); pictures.add(picData); + } else if (relation.equals(XWPFRelation.CHART.getRelation())) { + //now we can use all methods to modify charts in XWPFDocument + XWPFChart chartData = (XWPFChart) p; + chartData.onDocumentRead(); + charts.add(chartData); } else if (relation.equals(XWPFRelation.GLOSSARY_DOCUMENT.getRelation())) { // We don't currently process the glossary itself // Until we do, we do need to load the glossary child parts of it @@ -323,6 +329,12 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { return Collections.unmodifiableList(tables); } + /** + * @return list of XWPFCharts in this document + */ + public List getCharts() { + return Collections.unmodifiableList(charts); + } /** * @see org.apache.poi.xwpf.usermodel.IBody#getTableArray(int) */ diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java index 9f628845e..f8da0c504 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRelation.java @@ -112,6 +112,12 @@ public final class XWPFRelation extends POIXMLRelation { "/word/theme/theme#.xml", null ); + public static final XWPFRelation CHART = new XWPFRelation( + "application/vnd.openxmlformats-officedocument.drawingml.chart+xml", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart", + "/word/charts/chart#.xml", + XWPFChart.class + ); public static final XWPFRelation HYPERLINK = new XWPFRelation( null, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java b/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java index e3311ff2f..00683b6ce 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java @@ -19,6 +19,7 @@ package org.apache.poi.xwpf; import org.apache.poi.xwpf.extractor.TestXWPFWordExtractor; import org.apache.poi.xwpf.model.TestXWPFHeaderFooterPolicy; +import org.apache.poi.xwpf.usermodel.TestXWPFChart; import org.apache.poi.xwpf.usermodel.TestXWPFDocument; import org.apache.poi.xwpf.usermodel.TestXWPFHeader; import org.apache.poi.xwpf.usermodel.TestXWPFHeadings; @@ -38,6 +39,7 @@ import org.junit.runners.Suite; @Suite.SuiteClasses({ TestXWPFBugs.class, org.apache.poi.xwpf.usermodel.TestXWPFBugs.class, + TestXWPFChart.class, TestXWPFDocument.class, TestXWPFWordExtractor.class, TestXWPFHeaderFooterPolicy.class, @@ -53,4 +55,4 @@ import org.junit.runners.Suite; TestPackageCorePropertiesGetKeywords.class }) public final class AllXWPFTests { -} \ No newline at end of file +} diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFChart.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFChart.java new file mode 100644 index 000000000..e2afbf4ca --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFChart.java @@ -0,0 +1,87 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.apache.poi.xwpf.usermodel; + +import java.io.IOException; +import java.util.List; + +import org.apache.poi.xwpf.XWPFTestDataSamples; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle; +import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx; +import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; + +import junit.framework.TestCase; + +public class TestXWPFChart extends TestCase { + + /** + * test method to check charts are null + * + * @throws IOException + */ + public void testRead() throws IOException + { + XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("61745.docx"); + List charts = sampleDoc.getCharts(); + assertNotNull(charts); + assertEquals(2, charts.size()); + assertNotNull(charts.get(0)); + assertNotNull(charts.get(1)); + } + + /** + * test method to add chart title and check whether it's set + * + * @throws IOException + */ + public void testChartTitle() throws IOException + { + XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("61745.docx"); + List charts = sampleDoc.getCharts(); + XWPFChart chart=charts.get(0); + CTChart ctChart = chart.getCTChart(); + CTTitle title = ctChart.getTitle(); + CTTx tx = title.addNewTx(); + CTTextBody rich = tx.addNewRich(); + rich.addNewBodyPr(); + rich.addNewLstStyle(); + CTTextParagraph p = rich.addNewP(); + CTRegularTextRun r = p.addNewR(); + r.addNewRPr(); + r.setT("XWPF CHART"); + assertEquals("XWPF CHART", chart.getCTChart().getTitle().getTx().getRich().getPArray(0).getRArray(0).getT().toString()); + } + /** + * test method to check relationship + * + * @throws IOException + */ + public void testChartRelation() throws IOException + { + XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("61745.docx"); + List charts = sampleDoc.getCharts(); + XWPFChart chart=charts.get(0); + assertEquals(XWPFRelation.CHART.getContentType(), chart.getPackagePart().getContentType().toString()); + assertEquals("/word/document.xml", chart.getParent().getPackagePart().getPartName().toString()); + assertEquals("/word/charts/chart1.xml", chart.getPackagePart().getPartName().toString()); + } +} + diff --git a/test-data/document/61745.docx b/test-data/document/61745.docx new file mode 100644 index 0000000000000000000000000000000000000000..d4e5bc827e12d7ed0ad52e2e82ef5335066867ee GIT binary patch literal 37030 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 literal 0 HcmV?d00001