#58144 - Behaviour for headers and footers of slides is inconsistent between slideshows created in 2003 and 2007
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1743769 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4a3acf4de0
commit
401a9fb477
@ -364,4 +364,14 @@ public interface TextParagraph<
|
|||||||
* Fetch the text runs that are contained within this block of text
|
* Fetch the text runs that are contained within this block of text
|
||||||
*/
|
*/
|
||||||
List<T> getTextRuns();
|
List<T> getTextRuns();
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Convenience method to determine if this text paragraph is part of
|
||||||
|
* the slide header or footer
|
||||||
|
*
|
||||||
|
* @return true if this paragraph is part of a header or footer placeholder
|
||||||
|
*
|
||||||
|
* @since POI 3.15-beta2
|
||||||
|
*/
|
||||||
|
boolean isHeaderOrFooter();
|
||||||
|
}
|
@ -755,7 +755,7 @@ public class XSLFTextParagraph implements TextParagraph<XSLFShape,XSLFTextParagr
|
|||||||
|
|
||||||
/* package */ CTTextParagraphProperties getDefaultMasterStyle(){
|
/* package */ CTTextParagraphProperties getDefaultMasterStyle(){
|
||||||
CTPlaceholder ph = _shape.getCTPlaceholder();
|
CTPlaceholder ph = _shape.getCTPlaceholder();
|
||||||
String defaultStyleSelector;
|
String defaultStyleSelector;
|
||||||
switch(ph == null ? -1 : ph.getType().intValue()) {
|
switch(ph == null ? -1 : ph.getType().intValue()) {
|
||||||
case STPlaceholderType.INT_TITLE:
|
case STPlaceholderType.INT_TITLE:
|
||||||
case STPlaceholderType.INT_CTR_TITLE:
|
case STPlaceholderType.INT_CTR_TITLE:
|
||||||
@ -1047,4 +1047,19 @@ public class XSLFTextParagraph implements TextParagraph<XSLFShape,XSLFTextParagr
|
|||||||
_runs.clear();
|
_runs.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public boolean isHeaderOrFooter() {
|
||||||
|
CTPlaceholder ph = _shape.getCTPlaceholder();
|
||||||
|
int phId = (ph == null ? -1 : ph.getType().intValue());
|
||||||
|
switch (phId) {
|
||||||
|
case STPlaceholderType.INT_SLD_NUM:
|
||||||
|
case STPlaceholderType.INT_DT:
|
||||||
|
case STPlaceholderType.INT_FTR:
|
||||||
|
case STPlaceholderType.INT_HDR:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.sl;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.apache.poi.sl.TestTable.openSampleSlideshow;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.poi.hslf.model.HeadersFooters;
|
||||||
|
import org.apache.poi.hslf.usermodel.HSLFSlide;
|
||||||
|
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
|
||||||
|
import org.apache.poi.hslf.usermodel.HSLFTextParagraph;
|
||||||
|
import org.apache.poi.sl.usermodel.Shape;
|
||||||
|
import org.apache.poi.sl.usermodel.Slide;
|
||||||
|
import org.apache.poi.sl.usermodel.SlideShow;
|
||||||
|
import org.apache.poi.sl.usermodel.TextParagraph;
|
||||||
|
import org.apache.poi.sl.usermodel.TextShape;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TestHeadersFooters {
|
||||||
|
@Test
|
||||||
|
public void bug58144() throws IOException {
|
||||||
|
SlideShow<?,?> ppt1 = openSampleSlideshow("bug58144-headers-footers-2003.ppt");
|
||||||
|
HSLFSlide sl1 = (HSLFSlide)ppt1.getSlides().get(0);
|
||||||
|
HeadersFooters hfs1 = sl1.getHeadersFooters();
|
||||||
|
assertNull(hfs1.getHeaderText());
|
||||||
|
assertEquals("Confidential", hfs1.getFooterText());
|
||||||
|
List<List<HSLFTextParagraph>> llp1 = sl1.getTextParagraphs();
|
||||||
|
assertEquals("Test", HSLFTextParagraph.getText(llp1.get(0)));
|
||||||
|
assertFalse(llp1.get(0).get(0).isHeaderOrFooter());
|
||||||
|
ppt1.close();
|
||||||
|
|
||||||
|
String ppt2007s[] = {
|
||||||
|
"bug58144-headers-footers-2007.ppt", "bug58144-headers-footers-2007.pptx"
|
||||||
|
};
|
||||||
|
|
||||||
|
for (String pptName : ppt2007s) {
|
||||||
|
SlideShow<?,?> ppt2 = openSampleSlideshow(pptName);
|
||||||
|
Slide<?,?> sl2 = ppt2.getSlides().get(0);
|
||||||
|
|
||||||
|
if (ppt2 instanceof HSLFSlideShow) {
|
||||||
|
HeadersFooters hfs2 = ((HSLFSlide)sl2).getHeadersFooters();
|
||||||
|
assertNull(hfs2.getHeaderText());
|
||||||
|
assertEquals("Slide footer", hfs2.getFooterText());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<? extends Shape<?,?>> shapes = sl2.getShapes();
|
||||||
|
TextShape<?,?> ts0 = (TextShape<?,?>)shapes.get(0);
|
||||||
|
assertEquals("Test file", ts0.getText());
|
||||||
|
TextShape<?,?> ts1 = (TextShape<?,?>)shapes.get(1);
|
||||||
|
assertEquals("Has some text in the headers and footers", ts1.getText());
|
||||||
|
TextShape<?,?> ts2 = (TextShape<?,?>)shapes.get(2);
|
||||||
|
assertEquals("Slide footer", ts2.getText());
|
||||||
|
List<? extends TextParagraph<?,?,?>> ltp2 = ts2.getTextParagraphs();
|
||||||
|
assertTrue(ltp2.get(0).isHeaderOrFooter());
|
||||||
|
ppt2.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -17,37 +17,65 @@
|
|||||||
|
|
||||||
package org.apache.poi.hslf.model;
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
import org.apache.poi.hslf.record.*;
|
import org.apache.poi.hslf.record.CString;
|
||||||
import org.apache.poi.hslf.usermodel.*;
|
import org.apache.poi.hslf.record.Document;
|
||||||
|
import org.apache.poi.hslf.record.HeadersFootersAtom;
|
||||||
|
import org.apache.poi.hslf.record.HeadersFootersContainer;
|
||||||
|
import org.apache.poi.hslf.record.OEPlaceholderAtom;
|
||||||
|
import org.apache.poi.hslf.record.Record;
|
||||||
|
import org.apache.poi.hslf.record.RecordTypes;
|
||||||
|
import org.apache.poi.hslf.record.SheetContainer;
|
||||||
|
import org.apache.poi.hslf.usermodel.HSLFSheet;
|
||||||
|
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
|
||||||
|
import org.apache.poi.hslf.usermodel.HSLFTextShape;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Header / Footer settings.
|
* Header / Footer settings.
|
||||||
*
|
*
|
||||||
* You can get these on slides, or across all notes
|
* You can get these on slides, or across all notes
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
*/
|
||||||
public final class HeadersFooters {
|
public final class HeadersFooters {
|
||||||
|
|
||||||
private HeadersFootersContainer _container;
|
private final HeadersFootersContainer _container;
|
||||||
private boolean _newRecord;
|
private final HSLFSheet _sheet;
|
||||||
private HSLFSlideShow _ppt;
|
private final boolean _ppt2007;
|
||||||
private HSLFSheet _sheet;
|
|
||||||
private boolean _ppt2007;
|
|
||||||
|
|
||||||
|
|
||||||
public HeadersFooters(HeadersFootersContainer rec, HSLFSlideShow ppt, boolean newRecord, boolean isPpt2007){
|
public HeadersFooters(HSLFSlideShow ppt, short headerFooterType) {
|
||||||
_container = rec;
|
this(ppt.getSlideMasters().get(0), headerFooterType);
|
||||||
_newRecord = newRecord;
|
|
||||||
_ppt = ppt;
|
|
||||||
_ppt2007 = isPpt2007;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public HeadersFooters(HeadersFootersContainer rec, HSLFSheet sheet, boolean newRecord, boolean isPpt2007){
|
public HeadersFooters(HSLFSheet sheet, short headerFooterType) {
|
||||||
_container = rec;
|
|
||||||
_newRecord = newRecord;
|
|
||||||
_sheet = sheet;
|
_sheet = sheet;
|
||||||
_ppt2007 = isPpt2007;
|
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
HSLFSlideShow ppt = _sheet.getSlideShow();
|
||||||
|
Document doc = ppt.getDocumentRecord();
|
||||||
|
|
||||||
|
// detect if this ppt was saved in Office2007
|
||||||
|
String tag = ppt.getSlideMasters().get(0).getProgrammableTag();
|
||||||
|
_ppt2007 = "___PPT12".equals(tag);
|
||||||
|
|
||||||
|
SheetContainer sc = _sheet.getSheetContainer();
|
||||||
|
HeadersFootersContainer hdd = (HeadersFootersContainer)sc.findFirstOfType(RecordTypes.HeadersFooters.typeID);
|
||||||
|
// boolean ppt2007 = sc.findFirstOfType(RecordTypes.RoundTripContentMasterId.typeID) != null;
|
||||||
|
|
||||||
|
if (hdd == null) {
|
||||||
|
for (Record ch : doc.getChildRecords()) {
|
||||||
|
if (ch instanceof HeadersFootersContainer
|
||||||
|
&& ((HeadersFootersContainer) ch).getOptions() == headerFooterType) {
|
||||||
|
hdd = (HeadersFootersContainer) ch;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hdd == null) {
|
||||||
|
hdd = new HeadersFootersContainer(headerFooterType);
|
||||||
|
Record lst = doc.findFirstOfType(RecordTypes.List.typeID);
|
||||||
|
doc.addChildAfter(hdd, lst);
|
||||||
|
}
|
||||||
|
_container = hdd;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -66,11 +94,11 @@ public final class HeadersFooters {
|
|||||||
* @param text headers's text
|
* @param text headers's text
|
||||||
*/
|
*/
|
||||||
public void setHeaderText(String text){
|
public void setHeaderText(String text){
|
||||||
if(_newRecord) attach();
|
|
||||||
|
|
||||||
setHeaderVisible(true);
|
setHeaderVisible(true);
|
||||||
CString cs = _container.getHeaderAtom();
|
CString cs = _container.getHeaderAtom();
|
||||||
if(cs == null) cs = _container.addHeaderAtom();
|
if (cs == null) {
|
||||||
|
cs = _container.addHeaderAtom();
|
||||||
|
}
|
||||||
|
|
||||||
cs.setText(text);
|
cs.setText(text);
|
||||||
}
|
}
|
||||||
@ -91,11 +119,11 @@ public final class HeadersFooters {
|
|||||||
* @param text footers's text
|
* @param text footers's text
|
||||||
*/
|
*/
|
||||||
public void setFootersText(String text){
|
public void setFootersText(String text){
|
||||||
if(_newRecord) attach();
|
|
||||||
|
|
||||||
setFooterVisible(true);
|
setFooterVisible(true);
|
||||||
CString cs = _container.getFooterAtom();
|
CString cs = _container.getFooterAtom();
|
||||||
if(cs == null) cs = _container.addFooterAtom();
|
if (cs == null) {
|
||||||
|
cs = _container.addFooterAtom();
|
||||||
|
}
|
||||||
|
|
||||||
cs.setText(text);
|
cs.setText(text);
|
||||||
}
|
}
|
||||||
@ -116,12 +144,12 @@ public final class HeadersFooters {
|
|||||||
* @param text custom user date
|
* @param text custom user date
|
||||||
*/
|
*/
|
||||||
public void setDateTimeText(String text){
|
public void setDateTimeText(String text){
|
||||||
if(_newRecord) attach();
|
|
||||||
|
|
||||||
setUserDateVisible(true);
|
setUserDateVisible(true);
|
||||||
setDateTimeVisible(true);
|
setDateTimeVisible(true);
|
||||||
CString cs = _container.getUserDateAtom();
|
CString cs = _container.getUserDateAtom();
|
||||||
if(cs == null) cs = _container.addUserDateAtom();
|
if (cs == null) {
|
||||||
|
cs = _container.addUserDateAtom();
|
||||||
|
}
|
||||||
|
|
||||||
cs.setText(text);
|
cs.setText(text);
|
||||||
}
|
}
|
||||||
@ -137,8 +165,7 @@ public final class HeadersFooters {
|
|||||||
* whether the footer text is displayed.
|
* whether the footer text is displayed.
|
||||||
*/
|
*/
|
||||||
public void setFooterVisible(boolean flag){
|
public void setFooterVisible(boolean flag){
|
||||||
if(_newRecord) attach();
|
setFlag(HeadersFootersAtom.fHasFooter, flag);
|
||||||
_container.getHeadersFootersAtom().setFlag(HeadersFootersAtom.fHasFooter, flag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -152,8 +179,7 @@ public final class HeadersFooters {
|
|||||||
* whether the header text is displayed.
|
* whether the header text is displayed.
|
||||||
*/
|
*/
|
||||||
public void setHeaderVisible(boolean flag){
|
public void setHeaderVisible(boolean flag){
|
||||||
if(_newRecord) attach();
|
setFlag(HeadersFootersAtom.fHasHeader, flag);
|
||||||
_container.getHeadersFootersAtom().setFlag(HeadersFootersAtom.fHasHeader, flag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -167,8 +193,7 @@ public final class HeadersFooters {
|
|||||||
* whether the date is displayed in the footer.
|
* whether the date is displayed in the footer.
|
||||||
*/
|
*/
|
||||||
public void setDateTimeVisible(boolean flag){
|
public void setDateTimeVisible(boolean flag){
|
||||||
if(_newRecord) attach();
|
setFlag(HeadersFootersAtom.fHasDate, flag);
|
||||||
_container.getHeadersFootersAtom().setFlag(HeadersFootersAtom.fHasDate, flag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -182,8 +207,7 @@ public final class HeadersFooters {
|
|||||||
* whether the date is displayed in the footer.
|
* whether the date is displayed in the footer.
|
||||||
*/
|
*/
|
||||||
public void setUserDateVisible(boolean flag){
|
public void setUserDateVisible(boolean flag){
|
||||||
if(_newRecord) attach();
|
setFlag(HeadersFootersAtom.fHasUserDate, flag);
|
||||||
_container.getHeadersFootersAtom().setFlag(HeadersFootersAtom.fHasUserDate, flag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -197,8 +221,7 @@ public final class HeadersFooters {
|
|||||||
* whether the slide number is displayed in the footer.
|
* whether the slide number is displayed in the footer.
|
||||||
*/
|
*/
|
||||||
public void setSlideNumberVisible(boolean flag){
|
public void setSlideNumberVisible(boolean flag){
|
||||||
if(_newRecord) attach();
|
setFlag(HeadersFootersAtom.fHasSlideNumber, flag);
|
||||||
_container.getHeadersFootersAtom().setFlag(HeadersFootersAtom.fHasSlideNumber, flag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -216,32 +239,13 @@ public final class HeadersFooters {
|
|||||||
* @param formatId an integer that specifies the format ID to be used to style the datetime.
|
* @param formatId an integer that specifies the format ID to be used to style the datetime.
|
||||||
*/
|
*/
|
||||||
public void setDateTimeFormat(int formatId){
|
public void setDateTimeFormat(int formatId){
|
||||||
if(_newRecord) attach();
|
|
||||||
_container.getHeadersFootersAtom().setFormatId(formatId);
|
_container.getHeadersFootersAtom().setFormatId(formatId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach this HeadersFootersContainer to the parent Document record
|
|
||||||
*/
|
|
||||||
private void attach(){
|
|
||||||
Document doc = _ppt.getDocumentRecord();
|
|
||||||
Record[] ch = doc.getChildRecords();
|
|
||||||
Record lst = null;
|
|
||||||
for (int i=0; i < ch.length; i++){
|
|
||||||
if(ch[i].getRecordType() == RecordTypes.List.typeID){
|
|
||||||
lst = ch[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
doc.addChildAfter(_container, lst);
|
|
||||||
_newRecord = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isVisible(int flag, int placeholderId){
|
private boolean isVisible(int flag, int placeholderId){
|
||||||
boolean visible;
|
boolean visible;
|
||||||
if(_ppt2007){
|
if(_ppt2007){
|
||||||
HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlideMasters().get(0);
|
HSLFTextShape placeholder = _sheet.getPlaceholder(placeholderId);
|
||||||
HSLFTextShape placeholder = master.getPlaceholder(placeholderId);
|
|
||||||
visible = placeholder != null && placeholder.getText() != null;
|
visible = placeholder != null && placeholder.getText() != null;
|
||||||
} else {
|
} else {
|
||||||
visible = _container.getHeadersFootersAtom().getFlag(flag);
|
visible = _container.getHeadersFootersAtom().getFlag(flag);
|
||||||
@ -251,17 +255,23 @@ public final class HeadersFooters {
|
|||||||
|
|
||||||
private String getPlaceholderText(int placeholderId, CString cs){
|
private String getPlaceholderText(int placeholderId, CString cs){
|
||||||
String text = null;
|
String text = null;
|
||||||
if(_ppt2007){
|
if (_ppt2007) {
|
||||||
HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlideMasters().get(0);
|
HSLFTextShape placeholder = _sheet.getPlaceholder(placeholderId);
|
||||||
HSLFTextShape placeholder = master.getPlaceholder(placeholderId);
|
if (placeholder != null) {
|
||||||
if(placeholder != null) text = placeholder.getText();
|
text = placeholder.getText();
|
||||||
|
}
|
||||||
|
|
||||||
//default text in master placeholders is not visible
|
// default text in master placeholders is not visible
|
||||||
if("*".equals(text)) text = null;
|
if("*".equals(text)) {
|
||||||
|
text = null;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
text = cs == null ? null : cs.getText();
|
text = cs == null ? null : cs.getText();
|
||||||
}
|
}
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setFlag(int type, boolean flag) {
|
||||||
|
_container.getHeadersFootersAtom().setFlag(type, flag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -120,9 +120,9 @@ public abstract class RecordContainer extends Record
|
|||||||
* given type. Does not descend.
|
* given type. Does not descend.
|
||||||
*/
|
*/
|
||||||
public Record findFirstOfType(long type) {
|
public Record findFirstOfType(long type) {
|
||||||
for(int i=0; i<_children.length; i++) {
|
for (Record r : _children) {
|
||||||
if(_children[i].getRecordType() == type) {
|
if (r.getRecordType() == type) {
|
||||||
return _children[i];
|
return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -31,7 +31,6 @@ import org.apache.poi.hslf.record.ColorSchemeAtom;
|
|||||||
import org.apache.poi.hslf.record.Comment2000;
|
import org.apache.poi.hslf.record.Comment2000;
|
||||||
import org.apache.poi.hslf.record.EscherTextboxWrapper;
|
import org.apache.poi.hslf.record.EscherTextboxWrapper;
|
||||||
import org.apache.poi.hslf.record.HeadersFootersContainer;
|
import org.apache.poi.hslf.record.HeadersFootersContainer;
|
||||||
import org.apache.poi.hslf.record.Record;
|
|
||||||
import org.apache.poi.hslf.record.RecordContainer;
|
import org.apache.poi.hslf.record.RecordContainer;
|
||||||
import org.apache.poi.hslf.record.RecordTypes;
|
import org.apache.poi.hslf.record.RecordTypes;
|
||||||
import org.apache.poi.hslf.record.SSSlideInfoAtom;
|
import org.apache.poi.hslf.record.SSSlideInfoAtom;
|
||||||
@ -422,26 +421,8 @@ public final class HSLFSlide extends HSLFSheet implements Slide<HSLFShape,HSLFTe
|
|||||||
*
|
*
|
||||||
* @return Header / Footer settings for this slide
|
* @return Header / Footer settings for this slide
|
||||||
*/
|
*/
|
||||||
public HeadersFooters getHeadersFooters(){
|
public HeadersFooters getHeadersFooters(){
|
||||||
HeadersFootersContainer hdd = null;
|
return new HeadersFooters(this, HeadersFootersContainer.SlideHeadersFootersContainer);
|
||||||
Record[] ch = getSheetContainer().getChildRecords();
|
|
||||||
boolean ppt2007 = false;
|
|
||||||
for (int i = 0; i < ch.length; i++) {
|
|
||||||
if(ch[i] instanceof HeadersFootersContainer){
|
|
||||||
hdd = (HeadersFootersContainer)ch[i];
|
|
||||||
} else if (ch[i].getRecordType() == RecordTypes.RoundTripContentMasterId.typeID){
|
|
||||||
ppt2007 = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boolean newRecord = false;
|
|
||||||
if(hdd == null && !ppt2007) {
|
|
||||||
return getSlideShow().getSlideHeadersFooters();
|
|
||||||
}
|
|
||||||
if(hdd == null) {
|
|
||||||
hdd = new HeadersFootersContainer(HeadersFootersContainer.SlideHeadersFootersContainer);
|
|
||||||
newRecord = true;
|
|
||||||
}
|
|
||||||
return new HeadersFooters(hdd, this, newRecord, ppt2007);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onAddTextShape(HSLFTextShape shape) {
|
protected void onAddTextShape(HSLFTextShape shape) {
|
||||||
|
@ -33,7 +33,6 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.poi.hslf.record.MainMaster;
|
|
||||||
import org.apache.poi.ddf.EscherBSERecord;
|
import org.apache.poi.ddf.EscherBSERecord;
|
||||||
import org.apache.poi.ddf.EscherContainerRecord;
|
import org.apache.poi.ddf.EscherContainerRecord;
|
||||||
import org.apache.poi.ddf.EscherOptRecord;
|
import org.apache.poi.ddf.EscherOptRecord;
|
||||||
@ -49,8 +48,6 @@ import org.apache.poi.hslf.record.ExAviMovie;
|
|||||||
import org.apache.poi.hslf.record.ExControl;
|
import org.apache.poi.hslf.record.ExControl;
|
||||||
import org.apache.poi.hslf.record.ExEmbed;
|
import org.apache.poi.hslf.record.ExEmbed;
|
||||||
import org.apache.poi.hslf.record.ExEmbedAtom;
|
import org.apache.poi.hslf.record.ExEmbedAtom;
|
||||||
import org.apache.poi.hslf.record.ExHyperlink;
|
|
||||||
import org.apache.poi.hslf.record.ExHyperlinkAtom;
|
|
||||||
import org.apache.poi.hslf.record.ExMCIMovie;
|
import org.apache.poi.hslf.record.ExMCIMovie;
|
||||||
import org.apache.poi.hslf.record.ExObjList;
|
import org.apache.poi.hslf.record.ExObjList;
|
||||||
import org.apache.poi.hslf.record.ExObjListAtom;
|
import org.apache.poi.hslf.record.ExObjListAtom;
|
||||||
@ -60,6 +57,7 @@ import org.apache.poi.hslf.record.ExVideoContainer;
|
|||||||
import org.apache.poi.hslf.record.FontCollection;
|
import org.apache.poi.hslf.record.FontCollection;
|
||||||
import org.apache.poi.hslf.record.FontEntityAtom;
|
import org.apache.poi.hslf.record.FontEntityAtom;
|
||||||
import org.apache.poi.hslf.record.HeadersFootersContainer;
|
import org.apache.poi.hslf.record.HeadersFootersContainer;
|
||||||
|
import org.apache.poi.hslf.record.MainMaster;
|
||||||
import org.apache.poi.hslf.record.Notes;
|
import org.apache.poi.hslf.record.Notes;
|
||||||
import org.apache.poi.hslf.record.PersistPtrHolder;
|
import org.apache.poi.hslf.record.PersistPtrHolder;
|
||||||
import org.apache.poi.hslf.record.PositionDependentRecord;
|
import org.apache.poi.hslf.record.PositionDependentRecord;
|
||||||
@ -905,24 +903,7 @@ public final class HSLFSlideShow implements SlideShow<HSLFShape,HSLFTextParagrap
|
|||||||
* @return Header / Footer settings for slides
|
* @return Header / Footer settings for slides
|
||||||
*/
|
*/
|
||||||
public HeadersFooters getSlideHeadersFooters() {
|
public HeadersFooters getSlideHeadersFooters() {
|
||||||
// detect if this ppt was saved in Office2007
|
return new HeadersFooters(this, HeadersFootersContainer.SlideHeadersFootersContainer);
|
||||||
String tag = getSlideMasters().get(0).getProgrammableTag();
|
|
||||||
boolean ppt2007 = "___PPT12".equals(tag);
|
|
||||||
|
|
||||||
HeadersFootersContainer hdd = null;
|
|
||||||
for (Record ch : _documentRecord.getChildRecords()) {
|
|
||||||
if (ch instanceof HeadersFootersContainer
|
|
||||||
&& ((HeadersFootersContainer) ch).getOptions() == HeadersFootersContainer.SlideHeadersFootersContainer) {
|
|
||||||
hdd = (HeadersFootersContainer) ch;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boolean newRecord = false;
|
|
||||||
if (hdd == null) {
|
|
||||||
hdd = new HeadersFootersContainer(HeadersFootersContainer.SlideHeadersFootersContainer);
|
|
||||||
newRecord = true;
|
|
||||||
}
|
|
||||||
return new HeadersFooters(hdd, this, newRecord, ppt2007);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -931,27 +912,11 @@ public final class HSLFSlideShow implements SlideShow<HSLFShape,HSLFTextParagrap
|
|||||||
* @return Header / Footer settings for notes
|
* @return Header / Footer settings for notes
|
||||||
*/
|
*/
|
||||||
public HeadersFooters getNotesHeadersFooters() {
|
public HeadersFooters getNotesHeadersFooters() {
|
||||||
// detect if this ppt was saved in Office2007
|
if (_notes.isEmpty()) {
|
||||||
String tag = getSlideMasters().get(0).getProgrammableTag();
|
return new HeadersFooters(this, HeadersFootersContainer.NotesHeadersFootersContainer);
|
||||||
boolean ppt2007 = "___PPT12".equals(tag);
|
} else {
|
||||||
|
return new HeadersFooters(_notes.get(0), HeadersFootersContainer.NotesHeadersFootersContainer);
|
||||||
HeadersFootersContainer hdd = null;
|
}
|
||||||
for (Record ch : _documentRecord.getChildRecords()) {
|
|
||||||
if (ch instanceof HeadersFootersContainer
|
|
||||||
&& ((HeadersFootersContainer) ch).getOptions() == HeadersFootersContainer.NotesHeadersFootersContainer) {
|
|
||||||
hdd = (HeadersFootersContainer) ch;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boolean newRecord = false;
|
|
||||||
if (hdd == null) {
|
|
||||||
hdd = new HeadersFootersContainer(HeadersFootersContainer.NotesHeadersFootersContainer);
|
|
||||||
newRecord = true;
|
|
||||||
}
|
|
||||||
if (ppt2007 && !_notes.isEmpty()) {
|
|
||||||
return new HeadersFooters(hdd, _notes.get(0), newRecord, ppt2007);
|
|
||||||
}
|
|
||||||
return new HeadersFooters(hdd, this, newRecord, ppt2007);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -41,11 +41,13 @@ import org.apache.poi.hslf.record.EscherTextboxWrapper;
|
|||||||
import org.apache.poi.hslf.record.FontCollection;
|
import org.apache.poi.hslf.record.FontCollection;
|
||||||
import org.apache.poi.hslf.record.InteractiveInfo;
|
import org.apache.poi.hslf.record.InteractiveInfo;
|
||||||
import org.apache.poi.hslf.record.MasterTextPropAtom;
|
import org.apache.poi.hslf.record.MasterTextPropAtom;
|
||||||
|
import org.apache.poi.hslf.record.OEPlaceholderAtom;
|
||||||
import org.apache.poi.hslf.record.OutlineTextRefAtom;
|
import org.apache.poi.hslf.record.OutlineTextRefAtom;
|
||||||
import org.apache.poi.hslf.record.PPDrawing;
|
import org.apache.poi.hslf.record.PPDrawing;
|
||||||
import org.apache.poi.hslf.record.Record;
|
import org.apache.poi.hslf.record.Record;
|
||||||
import org.apache.poi.hslf.record.RecordContainer;
|
import org.apache.poi.hslf.record.RecordContainer;
|
||||||
import org.apache.poi.hslf.record.RecordTypes;
|
import org.apache.poi.hslf.record.RecordTypes;
|
||||||
|
import org.apache.poi.hslf.record.RoundTripHFPlaceholder12;
|
||||||
import org.apache.poi.hslf.record.SlideListWithText;
|
import org.apache.poi.hslf.record.SlideListWithText;
|
||||||
import org.apache.poi.hslf.record.SlidePersistAtom;
|
import org.apache.poi.hslf.record.SlidePersistAtom;
|
||||||
import org.apache.poi.hslf.record.StyleTextProp9Atom;
|
import org.apache.poi.hslf.record.StyleTextProp9Atom;
|
||||||
@ -256,7 +258,6 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFShape,HSLFText
|
|||||||
|
|
||||||
public TextRulerAtom getTextRuler() {
|
public TextRulerAtom getTextRuler() {
|
||||||
return _ruler;
|
return _ruler;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextRulerAtom createTextRuler() {
|
public TextRulerAtom createTextRuler() {
|
||||||
@ -1571,4 +1572,32 @@ public final class HSLFTextParagraph implements TextParagraph<HSLFShape,HSLFText
|
|||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* @see RoundTripHFPlaceholder12
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isHeaderOrFooter() {
|
||||||
|
HSLFShape s = getParentShape();
|
||||||
|
if (s == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
RoundTripHFPlaceholder12 hfPl = s.getClientDataRecord(RecordTypes.RoundTripHFPlaceholder12.typeID);
|
||||||
|
if (hfPl == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int plId = hfPl.getPlaceholderId();
|
||||||
|
switch (plId) {
|
||||||
|
case OEPlaceholderAtom.MasterDate:
|
||||||
|
case OEPlaceholderAtom.MasterSlideNumber:
|
||||||
|
case OEPlaceholderAtom.MasterFooter:
|
||||||
|
case OEPlaceholderAtom.MasterHeader:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -17,13 +17,17 @@
|
|||||||
|
|
||||||
package org.apache.poi.hslf.model;
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.IOException;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.InputStream;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.POIDataSamples;
|
import org.apache.poi.POIDataSamples;
|
||||||
|
import org.apache.poi.hslf.HSLFTestDataSamples;
|
||||||
import org.apache.poi.hslf.usermodel.HSLFSlide;
|
import org.apache.poi.hslf.usermodel.HSLFSlide;
|
||||||
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
|
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@ -37,8 +41,10 @@ public final class TestHeadersFooters
|
|||||||
private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
|
private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRead() throws Exception {
|
public void testRead() throws IOException {
|
||||||
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("headers_footers.ppt"));
|
InputStream is = _slTests.openResourceAsStream("headers_footers.ppt");
|
||||||
|
HSLFSlideShow ppt = new HSLFSlideShow(is);
|
||||||
|
is.close();
|
||||||
|
|
||||||
HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
|
HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
|
||||||
assertTrue(slideHdd.isFooterVisible());
|
assertTrue(slideHdd.isFooterVisible());
|
||||||
@ -75,6 +81,8 @@ public final class TestHeadersFooters
|
|||||||
assertEquals("per-slide footer", hd2.getFooterText());
|
assertEquals("per-slide footer", hd2.getFooterText());
|
||||||
assertEquals(true, hd2.isUserDateVisible());
|
assertEquals(true, hd2.isUserDateVisible());
|
||||||
assertEquals("custom date format", hd2.getDateTimeText());
|
assertEquals("custom date format", hd2.getDateTimeText());
|
||||||
|
|
||||||
|
ppt.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -82,7 +90,9 @@ public final class TestHeadersFooters
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testReadNoHeadersFooters() throws Exception {
|
public void testReadNoHeadersFooters() throws Exception {
|
||||||
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
|
InputStream is = _slTests.openResourceAsStream("basic_test_ppt_file.ppt");
|
||||||
|
HSLFSlideShow ppt = new HSLFSlideShow(is);
|
||||||
|
is.close();
|
||||||
|
|
||||||
HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
|
HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
|
||||||
assertFalse(slideHdd.isFooterVisible());
|
assertFalse(slideHdd.isFooterVisible());
|
||||||
@ -111,14 +121,18 @@ public final class TestHeadersFooters
|
|||||||
assertFalse(hd1.isUserDateVisible());
|
assertFalse(hd1.isUserDateVisible());
|
||||||
assertNull(hd1.getDateTimeText());
|
assertNull(hd1.getDateTimeText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ppt.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test extraction of headers / footers from PPTs saved in Office 2007
|
* Test extraction of headers / footers from PPTs saved in Office 2007
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testRead2007() throws Exception {
|
public void testRead2007() throws IOException {
|
||||||
HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("headers_footers_2007.ppt"));
|
InputStream is = _slTests.openResourceAsStream("headers_footers_2007.ppt");
|
||||||
|
HSLFSlideShow ppt = new HSLFSlideShow(is);
|
||||||
|
is.close();
|
||||||
|
|
||||||
HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
|
HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
|
||||||
assertTrue(slideHdd.isFooterVisible());
|
assertTrue(slideHdd.isFooterVisible());
|
||||||
@ -174,44 +188,44 @@ public final class TestHeadersFooters
|
|||||||
assertTrue(hd3.isUserDateVisible());
|
assertTrue(hd3.isUserDateVisible());
|
||||||
assertTrue(hd3.isDateTimeVisible());
|
assertTrue(hd3.isDateTimeVisible());
|
||||||
assertEquals("Wednesday, August 06, 2008", hd3.getDateTimeText());
|
assertEquals("Wednesday, August 06, 2008", hd3.getDateTimeText());
|
||||||
|
|
||||||
|
ppt.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreateSlideFooters() throws Exception {
|
public void testCreateSlideFooters() throws IOException {
|
||||||
HSLFSlideShow ppt = new HSLFSlideShow();
|
HSLFSlideShow ppt1 = new HSLFSlideShow();
|
||||||
HeadersFooters hdd = ppt.getSlideHeadersFooters();
|
HeadersFooters hdd = ppt1.getSlideHeadersFooters();
|
||||||
hdd.setFootersText("My slide footer");
|
hdd.setFootersText("My slide footer");
|
||||||
hdd.setSlideNumberVisible(true);
|
hdd.setSlideNumberVisible(true);
|
||||||
|
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
HSLFSlideShow ppt2 = HSLFTestDataSamples.writeOutAndReadBack(ppt1);
|
||||||
ppt.write(out);
|
|
||||||
byte[] b = out.toByteArray();
|
|
||||||
|
|
||||||
HSLFSlideShow ppt2 = new HSLFSlideShow(new ByteArrayInputStream(b));
|
|
||||||
HeadersFooters hdd2 = ppt2.getSlideHeadersFooters();
|
HeadersFooters hdd2 = ppt2.getSlideHeadersFooters();
|
||||||
assertTrue(hdd2.isSlideNumberVisible());
|
assertTrue(hdd2.isSlideNumberVisible());
|
||||||
assertTrue(hdd2.isFooterVisible());
|
assertTrue(hdd2.isFooterVisible());
|
||||||
assertEquals("My slide footer", hdd2.getFooterText());
|
assertEquals("My slide footer", hdd2.getFooterText());
|
||||||
|
|
||||||
|
ppt2.close();
|
||||||
|
ppt1.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreateNotesFooters() throws Exception {
|
public void testCreateNotesFooters() throws IOException {
|
||||||
HSLFSlideShow ppt = new HSLFSlideShow();
|
HSLFSlideShow ppt1 = new HSLFSlideShow();
|
||||||
HeadersFooters hdd = ppt.getNotesHeadersFooters();
|
HeadersFooters hdd = ppt1.getNotesHeadersFooters();
|
||||||
hdd.setFootersText("My notes footer");
|
hdd.setFootersText("My notes footer");
|
||||||
hdd.setHeaderText("My notes header");
|
hdd.setHeaderText("My notes header");
|
||||||
hdd.setSlideNumberVisible(true);
|
hdd.setSlideNumberVisible(true);
|
||||||
|
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
HSLFSlideShow ppt2 = HSLFTestDataSamples.writeOutAndReadBack(ppt1);
|
||||||
ppt.write(out);
|
|
||||||
byte[] b = out.toByteArray();
|
|
||||||
|
|
||||||
HSLFSlideShow ppt2 = new HSLFSlideShow(new ByteArrayInputStream(b));
|
|
||||||
HeadersFooters hdd2 = ppt2.getNotesHeadersFooters();
|
HeadersFooters hdd2 = ppt2.getNotesHeadersFooters();
|
||||||
assertTrue(hdd2.isSlideNumberVisible());
|
assertTrue(hdd2.isSlideNumberVisible());
|
||||||
assertTrue(hdd2.isFooterVisible());
|
assertTrue(hdd2.isFooterVisible());
|
||||||
assertEquals("My notes footer", hdd2.getFooterText());
|
assertEquals("My notes footer", hdd2.getFooterText());
|
||||||
assertTrue(hdd2.isHeaderVisible());
|
assertTrue(hdd2.isHeaderVisible());
|
||||||
assertEquals("My notes header", hdd2.getHeaderText());
|
assertEquals("My notes header", hdd2.getHeaderText());
|
||||||
|
|
||||||
|
ppt2.close();
|
||||||
|
ppt1.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BIN
test-data/slideshow/bug58144-headers-footers-2003.ppt
Normal file
BIN
test-data/slideshow/bug58144-headers-footers-2003.ppt
Normal file
Binary file not shown.
BIN
test-data/slideshow/bug58144-headers-footers-2007.ppt
Normal file
BIN
test-data/slideshow/bug58144-headers-footers-2007.ppt
Normal file
Binary file not shown.
BIN
test-data/slideshow/bug58144-headers-footers-2007.pptx
Normal file
BIN
test-data/slideshow/bug58144-headers-footers-2007.pptx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user