mirror of https://github.com/apache/poi.git
patch and latest bug fixes
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353541 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
437880b1d6
commit
0873a633af
|
@ -69,8 +69,7 @@ public class Word2Forrest
|
|||
{
|
||||
int cruns = p.numCharacterRuns ();
|
||||
CharacterRun run = p.getCharacterRun (0);
|
||||
int ftcAscii = run.getFontNameIndex ();
|
||||
String fontName = doc.getFontTable().getMainFont(ftcAscii);
|
||||
String fontName = run.getFontName();
|
||||
if (fontName.startsWith ("Courier"))
|
||||
{
|
||||
if (!inCode)
|
||||
|
|
|
@ -156,7 +156,7 @@ public class HWPFDocument
|
|||
_pbt.adjustForDelete(0, 0, cpMin);
|
||||
}
|
||||
|
||||
_st = new SectionTable(_mainStream, _tableStream, _fib.getFcPlcfsed(), _fib.getLcbPlcfsed(), fcMin);
|
||||
_st = new SectionTable(_mainStream, _tableStream, _fib.getFcPlcfsed(), _fib.getLcbPlcfsed(), fcMin, getTextTable().getTextPieces());
|
||||
_ss = new StyleSheet(_tableStream, _fib.getFcStshf());
|
||||
_ft = new FontTable(_tableStream, _fib.getFcSttbfffn(), _fib.getLcbSttbfffn());
|
||||
|
||||
|
|
|
@ -1,56 +1,20 @@
|
|||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2003 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache POI" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache POI", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
Copyright 2002-2004 Apache Software Foundation
|
||||
|
||||
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.apache.poi.hwpf.model;
|
||||
|
||||
|
@ -66,6 +30,9 @@ import java.util.NoSuchElementException;
|
|||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author Ryan Ackley
|
||||
*/
|
||||
public class ListTables
|
||||
{
|
||||
private static final int LIST_DATA_SIZE = 28;
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.poi.hwpf.model;
|
|||
import java.util.ArrayList;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
import org.apache.poi.hwpf.model.io.*;
|
||||
|
@ -31,16 +32,19 @@ public class SectionTable
|
|||
private static final int SED_SIZE = 12;
|
||||
|
||||
private ArrayList _sections = new ArrayList();
|
||||
private List _text;
|
||||
|
||||
public SectionTable()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public SectionTable(byte[] documentStream, byte[] tableStream, int offset,
|
||||
int size, int fcMin)
|
||||
int size, int fcMin,
|
||||
List tpt)
|
||||
{
|
||||
PlexOfCps sedPlex = new PlexOfCps(tableStream, offset, size, SED_SIZE);
|
||||
|
||||
_text = tpt;
|
||||
int length = sedPlex.length();
|
||||
|
||||
for (int x = 0; x < length; x++)
|
||||
|
@ -53,7 +57,7 @@ public class SectionTable
|
|||
// check for the optimization
|
||||
if (fileOffset == 0xffffffff)
|
||||
{
|
||||
_sections.add(new SEPX(sed, node.getStart(), node.getEnd(), new byte[0]));
|
||||
_sections.add(new SEPX(sed, CPtoFC(node.getStart()), CPtoFC(node.getEnd()), new byte[0]));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -62,7 +66,7 @@ public class SectionTable
|
|||
byte[] buf = new byte[sepxSize];
|
||||
fileOffset += LittleEndian.SHORT_SIZE;
|
||||
System.arraycopy(documentStream, fileOffset, buf, 0, buf.length);
|
||||
_sections.add(new SEPX(sed, node.getStart(), node.getEnd(), buf));
|
||||
_sections.add(new SEPX(sed, CPtoFC(node.getStart()), CPtoFC(node.getEnd()), buf));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -81,6 +85,50 @@ public class SectionTable
|
|||
}
|
||||
}
|
||||
|
||||
private int CPtoFC(int cp)
|
||||
{
|
||||
int size = _text.size();
|
||||
int x = 0;
|
||||
int end = 0;
|
||||
int fc = 0;
|
||||
for (; x < size; x++)
|
||||
{
|
||||
TextPiece piece = (TextPiece)_text.get(x);
|
||||
int currentStart = end;
|
||||
end += ((piece.getEnd()- piece.getStart())/(piece.usesUnicode() ? 2 : 1));
|
||||
if (cp <= end)
|
||||
{
|
||||
fc += ((cp - currentStart) * (piece.usesUnicode() ? 2 : 1));
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
fc += (piece.getEnd() - piece.getStart());
|
||||
}
|
||||
}
|
||||
return fc;
|
||||
}
|
||||
|
||||
private int FCtoCP(int fc)
|
||||
{
|
||||
int size = _text.size();
|
||||
int cp = 0;
|
||||
for (int x = 0; x < size; x++)
|
||||
{
|
||||
TextPiece piece = (TextPiece)_text.get(x);
|
||||
|
||||
if (fc <= piece.getEnd())
|
||||
{
|
||||
cp += ((fc - piece.getStart())/ (piece.usesUnicode() ? 2 : 1));
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
cp += ((piece.getEnd() - piece.getStart())/ (piece.usesUnicode() ? 2 : 1));
|
||||
}
|
||||
}
|
||||
return cp;
|
||||
}
|
||||
|
||||
public ArrayList getSections()
|
||||
{
|
||||
|
@ -115,7 +163,7 @@ public class SectionTable
|
|||
sed.setFc(offset);
|
||||
|
||||
// add the section descriptor bytes to the PlexOfCps.
|
||||
GenericPropertyNode property = new GenericPropertyNode(sepx.getStart(), sepx.getEnd(), sed.toByteArray());
|
||||
GenericPropertyNode property = new GenericPropertyNode(FCtoCP(sepx.getStart()), FCtoCP(sepx.getEnd()), sed.toByteArray());
|
||||
plex.addProperty(property);
|
||||
|
||||
offset = docStream.getOffset();
|
||||
|
|
|
@ -1,56 +1,20 @@
|
|||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2003 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution,
|
||||
* if any, must include the following acknowledgment:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowledgment may appear in the software itself,
|
||||
* if and wherever such third-party acknowledgments normally appear.
|
||||
*
|
||||
* 4. The names "Apache" and "Apache Software Foundation" and
|
||||
* "Apache POI" must not be used to endorse or promote products
|
||||
* derived from this software without prior written permission. For
|
||||
* written permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache",
|
||||
* "Apache POI", nor may "Apache" appear in their name, without
|
||||
* prior written permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
Copyright 2002-2004 Apache Software Foundation
|
||||
|
||||
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.apache.poi.hwpf.usermodel;
|
||||
|
||||
|
@ -59,6 +23,9 @@ import org.apache.poi.hwpf.model.StyleDescription;
|
|||
|
||||
import org.apache.poi.hwpf.sprm.SprmBuffer;
|
||||
|
||||
/**
|
||||
* @author Ryan Ackley
|
||||
*/
|
||||
public class CharacterProperties
|
||||
extends CHPAbstractType implements Cloneable
|
||||
{
|
||||
|
|
|
@ -428,9 +428,9 @@ public class CharacterRun
|
|||
_chpx.addSprm(SPRM_HIGHLIGHT, color);
|
||||
}
|
||||
|
||||
public int getFontNameIndex()
|
||||
public String getFontName()
|
||||
{
|
||||
return _props.getFtcAscii();
|
||||
return _doc.getFontTable().getMainFont(_props.getFtcAscii());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -252,7 +252,7 @@ public class Range
|
|||
TextPiece piece = (TextPiece)_text.get(x);
|
||||
int start = _start > piece.getStart() ? _start - piece.getStart() : 0;
|
||||
int end = _end <= piece.getEnd() ? _end - piece.getStart() : piece.getEnd() - piece.getStart();
|
||||
sb.append(piece.getStringBuffer().substring(start, end));
|
||||
sb.append(piece.substring(start, end));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
@ -312,9 +312,9 @@ public class Range
|
|||
int insertIndex = _start - tp.getStart();
|
||||
sb.insert(insertIndex, text);
|
||||
int adjustedLength = _doc.getTextTable().adjustForInsert(_textStart, text.length());
|
||||
_doc.getCharacterTable().adjustForInsert(_textStart, adjustedLength);
|
||||
_doc.getParagraphTable().adjustForInsert(_textStart, adjustedLength);
|
||||
_doc.getSectionTable().adjustForInsert(_textStart, adjustedLength);
|
||||
_doc.getCharacterTable().adjustForInsert(_charStart, adjustedLength);
|
||||
_doc.getParagraphTable().adjustForInsert(_parStart, adjustedLength);
|
||||
_doc.getSectionTable().adjustForInsert(_sectionStart, adjustedLength);
|
||||
adjustForInsert(text.length());
|
||||
|
||||
return getCharacterRun(0);
|
||||
|
@ -329,11 +329,17 @@ public class Range
|
|||
public CharacterRun insertAfter(String text)
|
||||
{
|
||||
initAll();
|
||||
|
||||
int listIndex = _textEnd - 1;
|
||||
TextPiece tp = (TextPiece)_text.get(listIndex);
|
||||
StringBuffer sb = (StringBuffer)tp.getStringBuffer();
|
||||
|
||||
int insertIndex = _end - tp.getStart();
|
||||
|
||||
if (tp.getStringBuffer().charAt(_end - 1) == '\r')
|
||||
{
|
||||
insertIndex--;
|
||||
}
|
||||
sb.insert(insertIndex, text);
|
||||
int adjustedLength = _doc.getTextTable().adjustForInsert(listIndex, text.length());
|
||||
_doc.getCharacterTable().adjustForInsert(_charEnd - 1, adjustedLength);
|
||||
|
@ -567,6 +573,31 @@ public class Range
|
|||
return (ListEntry)insertBefore(props, styleIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts a list into the beginning of this range.
|
||||
*
|
||||
* @param props The properties of the list entry. All list entries are
|
||||
* paragraphs.
|
||||
* @param listID The id of the list that contains the properties.
|
||||
* @param level The indentation level of the list.
|
||||
* @param styleIndex The base style's index in the stylesheet.
|
||||
* @return The empty ListEntry that is now part of the document.
|
||||
*/
|
||||
public ListEntry insertAfter(ParagraphProperties props, int listID, int level, int styleIndex)
|
||||
{
|
||||
ListTables lt = _doc.getListTables();
|
||||
if (lt.getLevel(listID, level) == null)
|
||||
{
|
||||
throw new NoSuchElementException("The specified list and level do not exist");
|
||||
}
|
||||
int ilfo = lt.getOverrideIndexFromListID(listID);
|
||||
props.setIlfo(ilfo);
|
||||
props.setIlvl((byte)level);
|
||||
|
||||
return (ListEntry)insertAfter(props, styleIndex);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the character run at index. The index is relative to this range.
|
||||
*
|
||||
|
|
|
@ -30,7 +30,7 @@ public class HWPFDocFixture
|
|||
filename = "c:";
|
||||
}
|
||||
|
||||
filename = filename + "/test99.doc";
|
||||
filename = filename + "/blankplus.doc";
|
||||
|
||||
|
||||
POIFSFileSystem filesystem = new POIFSFileSystem(new FileInputStream(
|
||||
|
|
|
@ -22,19 +22,25 @@ public class TestListTables
|
|||
FileInformationBlock fib = _hWPFDocFixture._fib;
|
||||
byte[] tableStream = _hWPFDocFixture._tableStream;
|
||||
|
||||
ListTables listTables = new ListTables(tableStream, fib.getFcPlcfLst(), fib.getFcPlfLfo());
|
||||
int listOffset = fib.getFcPlcfLst();
|
||||
int lfoOffset = fib.getFcPlfLfo();
|
||||
if (listOffset != 0 && fib.getLcbPlcfLst() != 0)
|
||||
{
|
||||
ListTables listTables = new ListTables (tableStream, fib.getFcPlcfLst (),
|
||||
fib.getFcPlfLfo ());
|
||||
HWPFFileSystem fileSys = new HWPFFileSystem ();
|
||||
|
||||
HWPFFileSystem fileSys = new HWPFFileSystem();
|
||||
HWPFOutputStream tableOut = fileSys.getStream ("1Table");
|
||||
|
||||
HWPFOutputStream tableOut = fileSys.getStream("1Table");
|
||||
listTables.writeListDataTo (tableOut);
|
||||
int offset = tableOut.getOffset ();
|
||||
listTables.writeListOverridesTo (tableOut);
|
||||
|
||||
listTables.writeListDataTo(tableOut);
|
||||
int offset = tableOut.getOffset();
|
||||
listTables.writeListOverridesTo(tableOut);
|
||||
ListTables newTables = new ListTables (tableOut.toByteArray (), 0, offset);
|
||||
|
||||
ListTables newTables = new ListTables(tableOut.toByteArray(), 0, offset);
|
||||
assertEquals(listTables, newTables);
|
||||
|
||||
assertEquals(listTables, newTables);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -80,10 +80,13 @@ public class TestSectionTable
|
|||
byte[] tableStream = _hWPFDocFixture._tableStream;
|
||||
int fcMin = fib.getFcMin();
|
||||
|
||||
ComplexFileTable cft = new ComplexFileTable(mainStream, tableStream, fib.getFcClx(), fcMin);
|
||||
TextPieceTable tpt = cft.getTextPieceTable();
|
||||
|
||||
SectionTable sectionTable = new SectionTable(mainStream, tableStream,
|
||||
fib.getFcPlcfsed(),
|
||||
fib.getLcbPlcfsed(),
|
||||
fcMin);
|
||||
fcMin, tpt.getTextPieces());
|
||||
HWPFFileSystem fileSys = new HWPFFileSystem();
|
||||
|
||||
sectionTable.writeTo(fileSys, 0);
|
||||
|
@ -93,13 +96,26 @@ public class TestSectionTable
|
|||
byte[] newTableStream = tableOut.toByteArray();
|
||||
byte[] newMainStream = mainOut.toByteArray();
|
||||
|
||||
SectionTable newSectionTable = new SectionTable(newMainStream, newTableStream, 0, newTableStream.length, 0);
|
||||
SectionTable newSectionTable = new SectionTable(newMainStream, newTableStream, 0, newTableStream.length, 0, tpt.getTextPieces());
|
||||
|
||||
ArrayList oldSections = sectionTable.getSections();
|
||||
ArrayList newSections = newSectionTable.getSections();
|
||||
|
||||
assertEquals(oldSections.size(), newSections.size());
|
||||
|
||||
//test for proper char offset conversions
|
||||
PlexOfCps oldSedPlex = new PlexOfCps(tableStream, fib.getFcPlcfsed(),
|
||||
fib.getLcbPlcfsed(), 12);
|
||||
PlexOfCps newSedPlex = new PlexOfCps(newTableStream, 0,
|
||||
newTableStream.length, 12);
|
||||
assertEquals(oldSedPlex.length(), newSedPlex.length());
|
||||
|
||||
for (int x = 0; x < oldSedPlex.length(); x++)
|
||||
{
|
||||
assertEquals(oldSedPlex.getProperty(x).getStart(), newSedPlex.getProperty(x).getStart());
|
||||
assertEquals(oldSedPlex.getProperty(x).getEnd(), newSedPlex.getProperty(x).getEnd());
|
||||
}
|
||||
|
||||
int size = oldSections.size();
|
||||
for (int x = 0; x < size; x++)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue