int pos = offset + 8;
field_1_blipTypeWin32 = data[pos];
field_2_blipTypeMacOS = data[pos + 1];
- System.arraycopy( data, pos + 2, field_3_uid = new byte[16], 0, 16 );
+ field_3_uid = new byte[16];
+ System.arraycopy( data, pos + 2, field_3_uid, 0, 16 );
field_4_tag = LittleEndian.getShort( data, pos + 18 );
field_5_size = LittleEndian.getInt( data, pos + 20 );
field_6_ref = LittleEndian.getInt( data, pos + 24 );
public int serialize(int offset, byte[] data, EscherSerializationListener listener) {
listener.beforeRecordSerialize( offset, getRecordId(), this );
- if (_remainingData == null)
+ if (_remainingData == null) {
_remainingData = new byte[0];
+ }
LittleEndian.putShort( data, offset, getOptions() );
LittleEndian.putShort( data, offset + 2, getRecordId() );
- if (_remainingData == null) _remainingData = new byte[0];
int blipSize = field_12_blipRecord == null ? 0 : field_12_blipRecord.getRecordSize();
int remainingBytes = _remainingData.length + 36 + blipSize;
LittleEndian.putInt( data, offset + 4, remainingBytes );
{
bytesWritten = field_12_blipRecord.serialize( offset + 44, data, new NullEscherSerializationListener() );
}
- if (_remainingData == null)
- _remainingData = new byte[0];
System.arraycopy( _remainingData, 0, data, offset + 44 + bytesWritten, _remainingData.length );
int pos = offset + 8 + 36 + _remainingData.length + bytesWritten;
* 16 byte MD4 checksum.
*/
public void setUid(byte[] uid) {
- field_3_uid = uid;
+ if (uid != null && uid.length == 16) {
+ System.arraycopy(uid, 0, field_3_uid, 0, field_3_uid.length);
+ };
}
/**
* Any remaining data in this record.
*/
public void setRemainingData(byte[] remainingData) {
- _remainingData = remainingData;
+ if (remainingData == null) {
+ _remainingData = null;
+ } else {
+ _remainingData = remainingData.clone();
+ }
}
public String toString() {
return field_1_UID;
}
- public void setUID( byte[] field_1_UID )
- {
- this.field_1_UID = field_1_UID;
+ public void setUID( byte[] field_1_UID ) {
+ if (field_1_UID != null && field_1_UID.length == 16) {
+ System.arraycopy(field_1_UID, 0, this.field_1_UID , 0, 16);
+ }
}
public byte getMarker()
}
public void setPictureData(byte[] pictureData) {
- field_pictureData = pictureData;
+ if (pictureData == null) {
+ field_pictureData = null;
+ } else {
+ field_pictureData = pictureData.clone();
+ }
}
public String toString() {
/**
* Any remaining data in the record
*/
- public void setRemainingData( byte[] remainingData )
- {
- this.remainingData = remainingData;
+ public void setRemainingData( byte[] remainingData ) {
+ if (remainingData == null) {
+ this.remainingData = null;
+ } else {
+ this.remainingData = remainingData.clone();
+ }
}
}
delegate = new NDocumentInputStream(document);
}
+ @Override
public int available() {
return delegate.available();
}
+ @Override
public void close() {
delegate.close();
}
+ @Override
public void mark(int ignoredReadlimit) {
delegate.mark(ignoredReadlimit);
}
*
* @return <code>true</code> always
*/
+ @Override
public boolean markSupported() {
return true;
}
+ @Override
public int read() throws IOException {
return delegate.read();
}
+ @Override
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
return delegate.read(b, off, len);
}
* last called on this input stream. If mark() has not been called this
* method repositions the stream to its beginning.
*/
+ @Override
public void reset() {
delegate.reset();
}
+ @Override
public long skip(long n) throws IOException {
return delegate.skip(n);
}
+ @Override
public byte readByte() {
return delegate.readByte();
}
+ @Override
public double readDouble() {
return delegate.readDouble();
}
+ @Override
public short readShort() {
return (short) readUShort();
}
- public void readFully(byte[] buf) {
- readFully(buf, 0, buf.length);
- }
+ @Override
+ public void readFully(byte[] buf) {
+ readFully(buf, 0, buf.length);
+ }
+ @Override
public void readFully(byte[] buf, int off, int len) {
delegate.readFully(buf, off, len);
}
+ @Override
public long readLong() {
return delegate.readLong();
}
+ @Override
public int readInt() {
return delegate.readInt();
}
+ @Override
public int readUShort() {
return delegate.readUShort();
}
+ @Override
public int readUByte() {
return delegate.readUByte();
}
super(in, pkg);
}
- @Override
+ @SuppressWarnings("resource")
+ @Override
public boolean saveImpl(Document content, OutputStream out) {
ZipOutputStream zos = null;
if (out instanceof ZipOutputStream)
+++ /dev/null
-/* ====================================================================
- 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.openxml4j.opc.internal.signature;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
-import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.internal.ContentType;
-
-/**
- * Digital certificate part.
- *
- * @author Julien Chable
- * @version 0.1
- */
-public final class DigitalCertificatePart extends PackagePart {
-
- public DigitalCertificatePart() throws InvalidFormatException{
- super(null, null, new ContentType(""));
- // TODO: Review constructor
- }
-
- @Override
- public void close() {
- }
-
- @Override
- public void flush() {
- }
-
- @Override
- protected InputStream getInputStreamImpl() throws IOException {
- return null;
- }
-
- @Override
- protected OutputStream getOutputStreamImpl() {
- return null;
- }
-
- @Override
- public boolean load(InputStream ios) throws InvalidFormatException {
- return false;
- }
-
- @Override
- public boolean save(OutputStream zos) throws OpenXML4JException {
- return false;
- }
-}
+++ /dev/null
-/* ====================================================================
- 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.openxml4j.opc.internal.signature;
-
-/**
- * Represents a digital signature origin part.
- *
- * @author Julien Chable
- * @version 0.1
- */
-public final class DigitalSignatureOriginPart {
-
-}
+++ /dev/null
-/* ====================================================================
- 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.openxml4j.opc.signature;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
-import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.internal.ContentType;
-
-public final class PackageDigitalSignature extends PackagePart {
-
- public PackageDigitalSignature() throws InvalidFormatException {
- super(null, null, new ContentType(""));
- // TODO: Review constructor
- }
-
- @Override
- public void close() {
- }
-
- @Override
- public void flush() {
- }
-
- @Override
- protected InputStream getInputStreamImpl() throws IOException {
- return null;
- }
-
- @Override
- protected OutputStream getOutputStreamImpl() {
- return null;
- }
-
- @Override
- public boolean load(InputStream ios) throws InvalidFormatException {
- return false;
- }
-
- @Override
- public boolean save(OutputStream zos) throws OpenXML4JException {
- return false;
- }
-}
+++ /dev/null
-/* ====================================================================
- 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.openxml4j.opc.signature;
-
-public final class PackageDigitalSignatureManager {
-
-}
case 0: authorRecord = cs; break;
case 1: commentRecord = cs; break;
case 2: authorInitialsRecord = cs; break;
+ default: break;
}
} else if (r instanceof Comment2000Atom){
commentAtom = (Comment2000Atom)r;
}
// Grab the contents
- _contents = new byte[docProps.getSize()];
+ int len = docProps.getSize();
+ _contents = new byte[len];
InputStream in = dir.createDocumentInputStream("Current User");
- in.read(_contents);
+ int readLen = in.read(_contents);
+ in.close();
+ if (len != readLen) {
+ throw new IOException("Current User input stream ended prematurely - expected "+len+" bytes - received "+readLen+" bytes");
+ }
+
+
// See how long it is. If it's under 28 bytes long, we can't
// read it
if(_contents.length < 28) {
case 0x1: menuName = cs; break;
case 0x2: progId = cs; break;
case 0x3: clipboardName = cs; break;
+ default: break;
}
}
}
public abstract class RecordContainer extends Record
{
protected Record[] _children;
- private Boolean changingChildRecordsLock = Boolean.TRUE;
/**
* Return any children
* Finds the location of the given child record
*/
private int findChildLocation(Record child) {
- // Synchronized as we don't want things changing
- // as we're doing our search
- synchronized(changingChildRecordsLock) {
- for(int i=0; i<_children.length; i++) {
- if(_children[i].equals(child)) {
- return i;
- }
+ int i=0;
+ for(Record r : _children) {
+ if (r.equals(child)) {
+ return i;
}
+ i++;
}
return -1;
}
* @param newChild The child record to add
*/
private void appendChild(Record newChild) {
- synchronized(changingChildRecordsLock) {
- // Copy over, and pop the child in at the end
- Record[] nc = new Record[(_children.length + 1)];
- System.arraycopy(_children, 0, nc, 0, _children.length);
- // Switch the arrays
- nc[_children.length] = newChild;
- _children = nc;
- }
+ // Copy over, and pop the child in at the end
+ Record[] nc = new Record[(_children.length + 1)];
+ System.arraycopy(_children, 0, nc, 0, _children.length);
+ // Switch the arrays
+ nc[_children.length] = newChild;
+ _children = nc;
}
/**
* @param position
*/
private void addChildAt(Record newChild, int position) {
- synchronized(changingChildRecordsLock) {
- // Firstly, have the child added in at the end
- appendChild(newChild);
+ // Firstly, have the child added in at the end
+ appendChild(newChild);
- // Now, have them moved to the right place
- moveChildRecords( (_children.length-1), position, 1 );
- }
+ // Now, have them moved to the right place
+ moveChildRecords( (_children.length-1), position, 1 );
}
/**
- * Moves <i>number</i> child records from <i>oldLoc</i>
- * to <i>newLoc</i>. Caller must have the changingChildRecordsLock
+ * Moves {@code number} child records from {@code oldLoc} to {@code newLoc}.
* @param oldLoc the current location of the records to move
* @param newLoc the new location for the records
* @param number the number of records to move
* Add a new child record onto a record's list of children.
*/
public void appendChildRecord(Record newChild) {
- synchronized(changingChildRecordsLock) {
- appendChild(newChild);
- }
+ appendChild(newChild);
}
/**
* @param after
*/
public void addChildAfter(Record newChild, Record after) {
- synchronized(changingChildRecordsLock) {
- // Decide where we're going to put it
- int loc = findChildLocation(after);
- if(loc == -1) {
- throw new IllegalArgumentException("Asked to add a new child after another record, but that record wasn't one of our children!");
- }
-
- // Add one place after the supplied record
- addChildAt(newChild, loc+1);
+ // Decide where we're going to put it
+ int loc = findChildLocation(after);
+ if(loc == -1) {
+ throw new IllegalArgumentException("Asked to add a new child after another record, but that record wasn't one of our children!");
}
+
+ // Add one place after the supplied record
+ addChildAt(newChild, loc+1);
}
/**
* @param before
*/
public void addChildBefore(Record newChild, Record before) {
- synchronized(changingChildRecordsLock) {
- // Decide where we're going to put it
- int loc = findChildLocation(before);
- if(loc == -1) {
- throw new IllegalArgumentException("Asked to add a new child before another record, but that record wasn't one of our children!");
- }
-
- // Add at the place of the supplied record
- addChildAt(newChild, loc);
+ // Decide where we're going to put it
+ int loc = findChildLocation(before);
+ if(loc == -1) {
+ throw new IllegalArgumentException("Asked to add a new child before another record, but that record wasn't one of our children!");
}
+
+ // Add at the place of the supplied record
+ addChildAt(newChild, loc);
}
/**
public void moveChildrenBefore(Record firstChild, int number, Record before) {
if(number < 1) { return; }
- synchronized(changingChildRecordsLock) {
- // Decide where we're going to put them
- int newLoc = findChildLocation(before);
- if(newLoc == -1) {
- throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
- }
-
- // Figure out where they are now
- int oldLoc = findChildLocation(firstChild);
- if(oldLoc == -1) {
- throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
- }
+ // Decide where we're going to put them
+ int newLoc = findChildLocation(before);
+ if(newLoc == -1) {
+ throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
+ }
- // Actually move
- moveChildRecords(oldLoc, newLoc, number);
+ // Figure out where they are now
+ int oldLoc = findChildLocation(firstChild);
+ if(oldLoc == -1) {
+ throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
}
+
+ // Actually move
+ moveChildRecords(oldLoc, newLoc, number);
}
/**
*/
public void moveChildrenAfter(Record firstChild, int number, Record after) {
if(number < 1) { return; }
+ // Decide where we're going to put them
+ int newLoc = findChildLocation(after);
+ if(newLoc == -1) {
+ throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
+ }
+ // We actually want after this though
+ newLoc++;
- synchronized(changingChildRecordsLock) {
- // Decide where we're going to put them
- int newLoc = findChildLocation(after);
- if(newLoc == -1) {
- throw new IllegalArgumentException("Asked to move children before another record, but that record wasn't one of our children!");
- }
- // We actually want after this though
- newLoc++;
-
- // Figure out where they are now
- int oldLoc = findChildLocation(firstChild);
- if(oldLoc == -1) {
- throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
- }
-
- // Actually move
- moveChildRecords(oldLoc, newLoc, number);
+ // Figure out where they are now
+ int oldLoc = findChildLocation(firstChild);
+ if(oldLoc == -1) {
+ throw new IllegalArgumentException("Asked to move a record that wasn't a child!");
}
+
+ // Actually move
+ moveChildRecords(oldLoc, newLoc, number);
}
/**
val = LittleEndian.getShort(_data, pos); pos += 2;
textOffsets[bits[i]-8] = val;
break;
+ default:
+ break;
}
}
}
isClosed = true;
numPoints++;
break;
+ default:
+ logger.log(POILogger.WARN, "Ignoring invalid segment type "+type);
+ break;
}
it.next();
for (HSLFShape shape : getShapes()) {
if(shape instanceof HSLFTextShape){
HSLFTextShape tx = (HSLFTextShape)shape;
- if (tx != null && tx.getRunType() == type) {
+ if (tx.getRunType() == type) {
return tx;
}
}
} else {
int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
setEscherProperty(opt, EscherProperties.LINESTYLE__COLOR, rgb);
- setEscherProperty(opt, EscherProperties.LINESTYLE__NOLINEDRAWDASH, color == null ? 0x180010 : 0x180018);
+ setEscherProperty(opt, EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x180018);
}
}
infoAtom.setJump(InteractiveInfoAtom.JUMP_NONE);
infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_SlideNumber);
break;
+ default:
+ logger.log(POILogger.WARN, "Ignore unknown hyperlink type : "+link.getTitle());
+ break;
}
infoAtom.setHyperlinkID(link.getId());
case EscherContainerRecord.SP_CONTAINER:
spr = c.getChildById(EscherSpRecord.RECORD_ID);
break;
+ default:
+ break;
}
if(spr != null) spr.setShapeId(allocateShapeId());
}
// if the removed slide had notes - remove references to them too
- int notesId = (removedSlide != null) ? removedSlide.getSlideRecord().getSlideAtom().getNotesID() : 0;
+ int notesId = removedSlide.getSlideRecord().getSlideAtom().getNotesID();
if (notesId != 0) {
SlideListWithText nslwt = _documentRecord.getNotesSlideListWithText();
records = new ArrayList<Record>();
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.poifs.crypt.Decryptor;
import org.apache.poi.poifs.crypt.EncryptionInfo;
-import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.crypt.cryptoapi.CryptoAPIDecryptor;
import org.apache.poi.poifs.crypt.cryptoapi.CryptoAPIEncryptor;
import org.apache.poi.util.BitField;
}
assert(r instanceof DocumentEncryptionAtom);
this.dea = (DocumentEncryptionAtom)r;
+ decryptInit();
- CryptoAPIDecryptor dec = (CryptoAPIDecryptor)dea.getEncryptionInfo().getDecryptor();
String pass = Biff8EncryptionKey.getCurrentUserPassword();
if(!dec.verifyPassword(pass != null ? pass : Decryptor.DEFAULT_PASSWORD)) {
throw new EncryptedPowerPointFileException("PowerPoint file is encrypted. The correct password needs to be set via Biff8EncryptionKey.setCurrentUserPassword()");
// create password record
if (dea == null) {
dea = new DocumentEncryptionAtom();
+ enc = null;
}
+ encryptInit();
EncryptionInfo ei = dea.getEncryptionInfo();
byte salt[] = ei.getVerifier().getSalt();
- Encryptor enc = ei.getEncryptor();
if (salt == null) {
enc.confirmPassword(password);
} else {
recordMap.put(pdr.getLastOnDiskOffset(), r);
}
+
+ assert(uea != null && pph != null && uea.getPersistPointersOffset() == pph.getLastOnDiskOffset());
+
recordMap.put(pph.getLastOnDiskOffset(), pph);
recordMap.put(uea.getLastOnDiskOffset(), uea);
- assert(uea != null && pph != null && uea.getPersistPointersOffset() == pph.getLastOnDiskOffset());
-
if (duplicatedCount == 0 && obsoleteOffsets.isEmpty()) {
return records;
}
(DocumentEntry)directory.getEntry("PowerPoint Document");
// Grab the document stream
- _docstream = new byte[docProps.getSize()];
- directory.createDocumentInputStream("PowerPoint Document").read(_docstream);
+ int len = docProps.getSize();
+ _docstream = new byte[len];
+ InputStream is = directory.createDocumentInputStream("PowerPoint Document");
+ int readLen = is.read(_docstream);
+ is.close();
+
+ if (len != readLen) {
+ throw new IOException("Document input stream ended prematurely - expected "+len+" bytes - received "+readLen+" bytes");
+ }
}
/**
HSLFSlideShowEncrypted decryptData = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom());
DocumentEntry entry = (DocumentEntry)directory.getEntry("Pictures");
- byte[] pictstream = new byte[entry.getSize()];
+ int len = entry.getSize();
+ byte[] pictstream = new byte[len];
DocumentInputStream is = directory.createDocumentInputStream(entry);
- is.read(pictstream);
+ int readLen = is.read(pictstream);
is.close();
+ if (len != readLen) {
+ throw new IOException("Picture stream ended prematurely - expected "+len+" bytes - received "+readLen+" bytes");
+ }
+
int pos = 0;
// An empty picture record (length 0) will take up 8 bytes
}
cos.close();
- assert(usr != null && ptr != null);
+ if (usr == null || ptr == null) {
+ throw new HSLFException("UserEditAtom or PersistPtr can't be determined.");
+ }
Map<Integer,Integer> persistIds = new HashMap<Integer,Integer>();
for (Map.Entry<Integer,Integer> entry : ptr.getSlideLocationsLookup().entrySet()) {
// Update and write out the Current User atom
int oldLastUserEditAtomPos = (int)currentUser.getCurrentEditOffset();
Integer newLastUserEditAtomPos = oldToNewPositions.get(oldLastUserEditAtomPos);
- if(usr == null || newLastUserEditAtomPos == null || usr.getLastOnDiskOffset() != newLastUserEditAtomPos) {
+ if(newLastUserEditAtomPos == null || usr.getLastOnDiskOffset() != newLastUserEditAtomPos) {
throw new HSLFException("Couldn't find the new location of the last UserEditAtom that used to be at " + oldLastUserEditAtomPos);
}
currentUser.setCurrentEditOffset(usr.getLastOnDiskOffset());
\r
import java.awt.Color;\r
import java.io.IOException;\r
-import java.util.*;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Iterator;\r
+import java.util.List;\r
\r
import org.apache.poi.hslf.model.PPFont;\r
-import org.apache.poi.hslf.model.textproperties.*;\r
+import org.apache.poi.hslf.model.textproperties.BitMaskTextProp;\r
+import org.apache.poi.hslf.model.textproperties.FontAlignmentProp;\r
+import org.apache.poi.hslf.model.textproperties.IndentProp;\r
+import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp;\r
+import org.apache.poi.hslf.model.textproperties.TextAlignmentProp;\r
+import org.apache.poi.hslf.model.textproperties.TextPFException9;\r
+import org.apache.poi.hslf.model.textproperties.TextProp;\r
+import org.apache.poi.hslf.model.textproperties.TextPropCollection;\r
import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType;\r
-import org.apache.poi.hslf.record.*;\r
+import org.apache.poi.hslf.record.ColorSchemeAtom;\r
+import org.apache.poi.hslf.record.EscherTextboxWrapper;\r
+import org.apache.poi.hslf.record.FontCollection;\r
+import org.apache.poi.hslf.record.MasterTextPropAtom;\r
+import org.apache.poi.hslf.record.OutlineTextRefAtom;\r
+import org.apache.poi.hslf.record.PPDrawing;\r
+import org.apache.poi.hslf.record.Record;\r
+import org.apache.poi.hslf.record.RecordContainer;\r
+import org.apache.poi.hslf.record.RecordTypes;\r
+import org.apache.poi.hslf.record.SlideListWithText;\r
+import org.apache.poi.hslf.record.SlidePersistAtom;\r
+import org.apache.poi.hslf.record.StyleTextProp9Atom;\r
+import org.apache.poi.hslf.record.StyleTextPropAtom;\r
+import org.apache.poi.hslf.record.TextBytesAtom;\r
+import org.apache.poi.hslf.record.TextCharsAtom;\r
+import org.apache.poi.hslf.record.TextHeaderAtom;\r
+import org.apache.poi.hslf.record.TextRulerAtom;\r
+import org.apache.poi.hslf.record.TextSpecInfoAtom;\r
import org.apache.poi.sl.draw.DrawPaint;\r
import org.apache.poi.sl.usermodel.AutoNumberingScheme;\r
import org.apache.poi.sl.usermodel.PaintStyle;\r
import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;\r
import org.apache.poi.sl.usermodel.TextParagraph;\r
-import org.apache.poi.util.*;\r
+import org.apache.poi.util.LocaleUtil;\r
+import org.apache.poi.util.POILogFactory;\r
+import org.apache.poi.util.POILogger;\r
+import org.apache.poi.util.StringUtil;\r
+import org.apache.poi.util.Units;\r
\r
/**\r
* This class represents a run of text in a powerpoint document. That\r
}\r
\r
Iterator<HSLFTextRun> runIter = htp.getTextRuns().iterator();\r
- HSLFTextRun htr = runIter.next();\r
- htr.setText("");\r
- assert (htr != null);\r
- while (runIter.hasNext()) {\r
- runIter.next();\r
- runIter.remove();\r
+ if (runIter.hasNext()) {\r
+ HSLFTextRun htr = runIter.next();\r
+ htr.setText("");\r
+ while (runIter.hasNext()) {\r
+ runIter.next();\r
+ runIter.remove();\r
+ }\r
+ } else {\r
+ HSLFTextRun trun = new HSLFTextRun(htp);\r
+ htp.addTextRun(trun);\r
}\r
\r
return appendText(paragraphs, text, false);\r