mirror of https://github.com/apache/poi.git
Fix bug #52449 - Support writing XWPF documents with glossaries (plus fix some indenting)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1230045 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ee24b94d80
commit
57c4509faa
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.8-beta6" date="2012-??-??">
|
<release version="3.8-beta6" date="2012-??-??">
|
||||||
|
<action dev="poi-developers" type="fix">52449 - Support writing XWPF documents with glossaries (Glossaries are not yet supported, but can now be written out again without changes)</action>
|
||||||
<action dev="poi-developers" type="fix">52446 - Handle files which have been truncated by a few bytes in NPropertyTable</action>
|
<action dev="poi-developers" type="fix">52446 - Handle files which have been truncated by a few bytes in NPropertyTable</action>
|
||||||
<action dev="poi-developers" type="fix">52438 - Update CellDateFormatter to handle times without seconds</action>
|
<action dev="poi-developers" type="fix">52438 - Update CellDateFormatter to handle times without seconds</action>
|
||||||
<action dev="poi-developers" type="add">52389 - Support ?/? as well as #/# fractions, and tighten DataFormatter rules for fraction matching</action>
|
<action dev="poi-developers" type="add">52389 - Support ?/? as well as #/# fractions, and tighten DataFormatter rules for fraction matching</action>
|
||||||
|
|
|
@ -20,6 +20,7 @@ import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -188,6 +189,20 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody {
|
||||||
picData.onDocumentRead();
|
picData.onDocumentRead();
|
||||||
registerPackagePictureData(picData);
|
registerPackagePictureData(picData);
|
||||||
pictures.add(picData);
|
pictures.add(picData);
|
||||||
|
} 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
|
||||||
|
for (POIXMLDocumentPart gp : p.getRelations()) {
|
||||||
|
// Trigger the onDocumentRead for all the child parts
|
||||||
|
// Otherwise we'll hit issues on Styles, Settings etc on save
|
||||||
|
try {
|
||||||
|
Method onDocumentRead = gp.getClass().getDeclaredMethod("onDocumentRead");
|
||||||
|
onDocumentRead.setAccessible(true);
|
||||||
|
onDocumentRead.invoke(gp);
|
||||||
|
} catch(Exception e) {
|
||||||
|
throw new POIXMLException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
initHyperlinks();
|
initHyperlinks();
|
||||||
|
|
|
@ -58,6 +58,12 @@ public final class XWPFRelation extends POIXMLRelation {
|
||||||
"/word/document.xml",
|
"/word/document.xml",
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
public static final XWPFRelation GLOSSARY_DOCUMENT = new XWPFRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/glossaryDocument",
|
||||||
|
"/word/glossary/document.xml",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
public static final XWPFRelation NUMBERING = new XWPFRelation(
|
public static final XWPFRelation NUMBERING = new XWPFRelation(
|
||||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml",
|
"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml",
|
||||||
|
|
|
@ -149,6 +149,9 @@ public class XWPFSettings extends POIXMLDocumentPart {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void commit() throws IOException {
|
protected void commit() throws IOException {
|
||||||
|
if (ctSettings == null) {
|
||||||
|
throw new IllegalStateException("Unable to write out settings that were never read in!");
|
||||||
|
}
|
||||||
|
|
||||||
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
||||||
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTSettings.type.getName().getNamespaceURI(), "settings"));
|
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTSettings.type.getName().getNamespaceURI(), "settings"));
|
||||||
|
|
|
@ -70,41 +70,44 @@ public class XWPFStyles extends POIXMLDocumentPart{
|
||||||
public XWPFStyles() {
|
public XWPFStyles() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read document
|
* Read document
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void onDocumentRead ()throws IOException{
|
protected void onDocumentRead() throws IOException{
|
||||||
StylesDocument stylesDoc;
|
StylesDocument stylesDoc;
|
||||||
try {
|
try {
|
||||||
InputStream is = getPackagePart().getInputStream();
|
InputStream is = getPackagePart().getInputStream();
|
||||||
stylesDoc = StylesDocument.Factory.parse(is);
|
stylesDoc = StylesDocument.Factory.parse(is);
|
||||||
ctStyles = stylesDoc.getStyles();
|
ctStyles = stylesDoc.getStyles();
|
||||||
latentStyles = new XWPFLatentStyles(ctStyles.getLatentStyles(), this);
|
latentStyles = new XWPFLatentStyles(ctStyles.getLatentStyles(), this);
|
||||||
|
} catch (XmlException e) {
|
||||||
} catch (XmlException e) {
|
throw new POIXMLException("Unable to read styles", e);
|
||||||
throw new POIXMLException();
|
}
|
||||||
}
|
|
||||||
//get any Style
|
// Build up all the style objects
|
||||||
for(CTStyle style : ctStyles.getStyleList()) {
|
for(CTStyle style : ctStyles.getStyleList()) {
|
||||||
listStyle.add(new XWPFStyle(style, this));
|
listStyle.add(new XWPFStyle(style, this));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void commit() throws IOException {
|
protected void commit() throws IOException {
|
||||||
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
if (ctStyles == null) {
|
||||||
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTStyles.type.getName().getNamespaceURI(), "styles"));
|
throw new IllegalStateException("Unable to write out styles that were never read in!");
|
||||||
Map<String,String> map = new HashMap<String,String>();
|
}
|
||||||
map.put("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r");
|
|
||||||
map.put("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w");
|
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
|
||||||
xmlOptions.setSaveSuggestedPrefixes(map);
|
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTStyles.type.getName().getNamespaceURI(), "styles"));
|
||||||
PackagePart part = getPackagePart();
|
Map<String,String> map = new HashMap<String,String>();
|
||||||
OutputStream out = part.getOutputStream();
|
map.put("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r");
|
||||||
ctStyles.save(out, xmlOptions);
|
map.put("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "w");
|
||||||
out.close();
|
xmlOptions.setSaveSuggestedPrefixes(map);
|
||||||
}
|
PackagePart part = getPackagePart();
|
||||||
|
OutputStream out = part.getOutputStream();
|
||||||
|
ctStyles.save(out, xmlOptions);
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the ctStyles
|
* Sets the ctStyles
|
||||||
|
|
|
@ -68,8 +68,18 @@ public class TestXWPFStyles extends TestCase {
|
||||||
assertTrue(styles.styleExist(strStyleName));
|
assertTrue(styles.styleExist(strStyleName));
|
||||||
}
|
}
|
||||||
|
|
||||||
// protected void tearDown() throws Exception {
|
/**
|
||||||
// super.tearDown();
|
* Bug #52449 - We should be able to write a file containing
|
||||||
// }
|
* both regular and glossary styles without error
|
||||||
|
*/
|
||||||
|
public void test52449() throws Exception {
|
||||||
|
XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("52449.docx");
|
||||||
|
XWPFStyles styles = doc.getStyles();
|
||||||
|
assertNotNull(styles);
|
||||||
|
|
||||||
|
XWPFDocument docIn = XWPFTestDataSamples.writeOutAndReadBack(doc);
|
||||||
|
styles = docIn.getStyles();
|
||||||
|
assertNotNull(styles);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue