use of org.apache.poi.hwpf.model.io.HWPFFileSystem in project poi by apache.
the class HWPFDocument method write.
private void write(NPOIFSFileSystem pfs, boolean copyOtherEntries) throws IOException {
// initialize our streams for writing.
HWPFFileSystem docSys = new HWPFFileSystem();
HWPFOutputStream wordDocumentStream = docSys.getStream(STREAM_WORD_DOCUMENT);
HWPFOutputStream tableStream = docSys.getStream(STREAM_TABLE_1);
//HWPFOutputStream dataStream = docSys.getStream("Data");
int tableOffset = 0;
// FileInformationBlock fib = (FileInformationBlock)_fib.clone();
// clear the offsets and sizes in our FileInformationBlock.
_fib.clearOffsetsSizes();
// determine the FileInformationBLock size
int fibSize = _fib.getSize();
fibSize += POIFSConstants.SMALLER_BIG_BLOCK_SIZE - (fibSize % POIFSConstants.SMALLER_BIG_BLOCK_SIZE);
// preserve space for the FileInformationBlock because we will be writing
// it after we write everything else.
byte[] placeHolder = new byte[fibSize];
wordDocumentStream.write(placeHolder);
int mainOffset = wordDocumentStream.getOffset();
// write out the StyleSheet.
_fib.setFcStshf(tableOffset);
_ss.writeTo(tableStream);
_fib.setLcbStshf(tableStream.getOffset() - tableOffset);
tableOffset = tableStream.getOffset();
// get fcMin and fcMac because we will be writing the actual text with the
// complex table.
int fcMin = mainOffset;
/*
* clx (encoding of the sprm lists for a complex file and piece table
* for a any file) Written immediately after the end of the previously
* recorded structure. This is recorded in all Word documents
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 23 of 210
*/
// write out the Complex table, includes text.
_fib.setFcClx(tableOffset);
_cft.writeTo(wordDocumentStream, tableStream);
_fib.setLcbClx(tableStream.getOffset() - tableOffset);
tableOffset = tableStream.getOffset();
int fcMac = wordDocumentStream.getOffset();
/*
* dop (document properties record) Written immediately after the end of
* the previously recorded structure. This is recorded in all Word
* documents
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 23 of 210
*/
// write out the DocumentProperties.
_fib.setFcDop(tableOffset);
_dop.writeTo(tableStream);
_fib.setLcbDop(tableStream.getOffset() - tableOffset);
tableOffset = tableStream.getOffset();
/*
* plcfBkmkf (table recording beginning CPs of bookmarks) Written
* immediately after the sttbfBkmk, if the document contains bookmarks.
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 24 of 210
*/
if (_bookmarksTables != null) {
_bookmarksTables.writePlcfBkmkf(_fib, tableStream);
tableOffset = tableStream.getOffset();
}
/*
* plcfBkmkl (table recording limit CPs of bookmarks) Written
* immediately after the plcfBkmkf, if the document contains bookmarks.
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 24 of 210
*/
if (_bookmarksTables != null) {
_bookmarksTables.writePlcfBkmkl(_fib, tableStream);
tableOffset = tableStream.getOffset();
}
/*
* plcfbteChpx (bin table for CHP FKPs) Written immediately after the
* previously recorded table. This is recorded in all Word documents.
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 24 of 210
*/
// write out the CHPBinTable.
_fib.setFcPlcfbteChpx(tableOffset);
_cbt.writeTo(wordDocumentStream, tableStream, fcMin, _cft.getTextPieceTable());
_fib.setLcbPlcfbteChpx(tableStream.getOffset() - tableOffset);
tableOffset = tableStream.getOffset();
/*
* plcfbtePapx (bin table for PAP FKPs) Written immediately after the
* plcfbteChpx. This is recorded in all Word documents.
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 24 of 210
*/
// write out the PAPBinTable.
_fib.setFcPlcfbtePapx(tableOffset);
_pbt.writeTo(wordDocumentStream, tableStream, _cft.getTextPieceTable());
_fib.setLcbPlcfbtePapx(tableStream.getOffset() - tableOffset);
tableOffset = tableStream.getOffset();
/*
* plcfendRef (endnote reference position table) Written immediately
* after the previously recorded table if the document contains endnotes
*
* plcfendTxt (endnote text position table) Written immediately after
* the plcfendRef if the document contains endnotes
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 24 of 210
*/
_endnotesTables.writeRef(_fib, tableStream);
_endnotesTables.writeTxt(_fib, tableStream);
tableOffset = tableStream.getOffset();
if (_fieldsTables != null) {
_fieldsTables.write(_fib, tableStream);
tableOffset = tableStream.getOffset();
}
/*
* plcffndRef (footnote reference position table) Written immediately
* after the stsh if the document contains footnotes
*
* plcffndTxt (footnote text position table) Written immediately after
* the plcffndRef if the document contains footnotes
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 24 of 210
*/
_footnotesTables.writeRef(_fib, tableStream);
_footnotesTables.writeTxt(_fib, tableStream);
tableOffset = tableStream.getOffset();
/*
* plcfsed (section table) Written immediately after the previously
* recorded table. Recorded in all Word documents
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 25 of 210
*/
// write out the SectionTable.
_fib.setFcPlcfsed(tableOffset);
_st.writeTo(wordDocumentStream, tableStream);
_fib.setLcbPlcfsed(tableStream.getOffset() - tableOffset);
tableOffset = tableStream.getOffset();
// write out the list tables
if (_lt != null) {
/*
* plcflst (list formats) Written immediately after the end of the
* previously recorded, if there are any lists defined in the
* document. This begins with a short count of LSTF structures
* followed by those LSTF structures. This is immediately followed
* by the allocated data hanging off the LSTFs. This data consists
* of the array of LVLs for each LSTF. (Each LVL consists of an LVLF
* followed by two grpprls and an XST.)
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 25 of 210
*/
_lt.writeListDataTo(_fib, tableStream);
tableOffset = tableStream.getOffset();
/*
* plflfo (more list formats) Written immediately after the end of
* the plcflst and its accompanying data, if there are any lists
* defined in the document. This consists first of a PL of LFO
* records, followed by the allocated data (if any) hanging off the
* LFOs. The allocated data consists of the array of LFOLVLFs for
* each LFO (and each LFOLVLF is immediately followed by some LVLs).
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 26 of 210
*/
_lt.writeListOverridesTo(_fib, tableStream);
tableOffset = tableStream.getOffset();
}
/*
* sttbfBkmk (table of bookmark name strings) Written immediately after
* the previously recorded table, if the document contains bookmarks.
*
* Microsoft Office Word 97-2007 Binary File Format (.doc)
* Specification; Page 27 of 210
*/
if (_bookmarksTables != null) {
_bookmarksTables.writeSttbfBkmk(_fib, tableStream);
tableOffset = tableStream.getOffset();
}
// write out the saved-by table.
if (_sbt != null) {
_fib.setFcSttbSavedBy(tableOffset);
_sbt.writeTo(tableStream);
_fib.setLcbSttbSavedBy(tableStream.getOffset() - tableOffset);
tableOffset = tableStream.getOffset();
}
// write out the revision mark authors table.
if (_rmat != null) {
_fib.setFcSttbfRMark(tableOffset);
_rmat.writeTo(tableStream);
_fib.setLcbSttbfRMark(tableStream.getOffset() - tableOffset);
tableOffset = tableStream.getOffset();
}
// write out the FontTable.
_fib.setFcSttbfffn(tableOffset);
_ft.writeTo(tableStream);
_fib.setLcbSttbfffn(tableStream.getOffset() - tableOffset);
tableOffset = tableStream.getOffset();
// set some variables in the FileInformationBlock.
_fib.getFibBase().setFcMin(fcMin);
_fib.getFibBase().setFcMac(fcMac);
_fib.setCbMac(wordDocumentStream.getOffset());
// make sure that the table, doc and data streams use big blocks.
byte[] mainBuf = wordDocumentStream.toByteArray();
if (mainBuf.length < 4096) {
byte[] tempBuf = new byte[4096];
System.arraycopy(mainBuf, 0, tempBuf, 0, mainBuf.length);
mainBuf = tempBuf;
}
// Table1 stream will be used
_fib.getFibBase().setFWhichTblStm(true);
// write out the FileInformationBlock.
//_fib.serialize(mainBuf, 0);
_fib.writeTo(mainBuf, tableStream);
byte[] tableBuf = tableStream.toByteArray();
if (tableBuf.length < 4096) {
byte[] tempBuf = new byte[4096];
System.arraycopy(tableBuf, 0, tempBuf, 0, tableBuf.length);
tableBuf = tempBuf;
}
byte[] dataBuf = _dataStream;
if (dataBuf == null) {
dataBuf = new byte[4096];
}
if (dataBuf.length < 4096) {
byte[] tempBuf = new byte[4096];
System.arraycopy(dataBuf, 0, tempBuf, 0, dataBuf.length);
dataBuf = tempBuf;
}
// Create a new document preserving order of entries / Update existing
boolean docWritten = false;
boolean dataWritten = false;
boolean objectPoolWritten = false;
boolean tableWritten = false;
boolean propertiesWritten = false;
for (Entry entry : getDirectory()) {
if (entry.getName().equals(STREAM_WORD_DOCUMENT)) {
if (!docWritten) {
write(pfs, mainBuf, STREAM_WORD_DOCUMENT);
docWritten = true;
}
} else if (entry.getName().equals(STREAM_OBJECT_POOL)) {
if (!objectPoolWritten) {
if (copyOtherEntries) {
_objectPool.writeTo(pfs.getRoot());
} else {
// Object pool is already there, no need to change/copy
}
objectPoolWritten = true;
}
} else if (entry.getName().equals(STREAM_TABLE_0) || entry.getName().equals(STREAM_TABLE_1)) {
if (!tableWritten) {
write(pfs, tableBuf, STREAM_TABLE_1);
tableWritten = true;
}
} else if (entry.getName().equals(SummaryInformation.DEFAULT_STREAM_NAME) || entry.getName().equals(DocumentSummaryInformation.DEFAULT_STREAM_NAME)) {
if (!propertiesWritten) {
writeProperties(pfs);
propertiesWritten = true;
}
} else if (entry.getName().equals(STREAM_DATA)) {
if (!dataWritten) {
write(pfs, dataBuf, STREAM_DATA);
dataWritten = true;
}
} else if (copyOtherEntries) {
EntryUtils.copyNodeRecursively(entry, pfs.getRoot());
}
}
if (!docWritten)
write(pfs, mainBuf, STREAM_WORD_DOCUMENT);
if (!tableWritten)
write(pfs, tableBuf, STREAM_TABLE_1);
if (!propertiesWritten)
writeProperties(pfs);
if (!dataWritten)
write(pfs, dataBuf, STREAM_DATA);
if (!objectPoolWritten && copyOtherEntries)
_objectPool.writeTo(pfs.getRoot());
/*
* since we updated all references in FIB and etc, using new arrays to
* access data
*/
replaceDirectory(pfs.getRoot());
this._tableStream = tableStream.toByteArray();
this._dataStream = dataBuf;
}
use of org.apache.poi.hwpf.model.io.HWPFFileSystem in project poi by apache.
the class TestTextPieceTable method testReadWrite.
@Test
public void testReadWrite() throws Exception {
FileInformationBlock fib = _hWPFDocFixture._fib;
byte[] mainStream = _hWPFDocFixture._mainStream;
byte[] tableStream = _hWPFDocFixture._tableStream;
int fcMin = fib.getFibBase().getFcMin();
ComplexFileTable cft = new ComplexFileTable(mainStream, tableStream, fib.getFcClx(), fcMin);
HWPFFileSystem fileSys = new HWPFFileSystem();
cft.writeTo(fileSys);
ByteArrayOutputStream tableOut = fileSys.getStream("1Table");
ByteArrayOutputStream mainOut = fileSys.getStream("WordDocument");
byte[] newTableStream = tableOut.toByteArray();
byte[] newMainStream = mainOut.toByteArray();
ComplexFileTable newCft = new ComplexFileTable(newMainStream, newTableStream, 0, 0);
TextPieceTable oldTextPieceTable = cft.getTextPieceTable();
TextPieceTable newTextPieceTable = newCft.getTextPieceTable();
assertEquals(oldTextPieceTable, newTextPieceTable);
}
use of org.apache.poi.hwpf.model.io.HWPFFileSystem in project poi by apache.
the class TestListTables method testReadWrite.
@Test
public void testReadWrite() throws IOException {
FileInformationBlock fib = _hWPFDocFixture._fib;
byte[] tableStream = _hWPFDocFixture._tableStream;
int listOffset = fib.getFcPlfLst();
int lfoOffset = fib.getFcPlfLfo();
int bLfoOffset = fib.getLcbPlfLfo();
if (listOffset != 0 && bLfoOffset != 0) {
// TODO: this is actually never executed ...
ListTables listTables = new ListTables(tableStream, listOffset, lfoOffset, bLfoOffset);
HWPFFileSystem fileSys = new HWPFFileSystem();
HWPFOutputStream tableOut = fileSys.getStream("1Table");
listTables.writeListDataTo(fib, tableOut);
listTables.writeListOverridesTo(fib, tableOut);
ListTables newTables = new ListTables(tableOut.toByteArray(), fib.getFcPlfLst(), fib.getFcPlfLfo(), fib.getLcbPlfLfo());
assertEquals(listTables, newTables);
}
}
use of org.apache.poi.hwpf.model.io.HWPFFileSystem in project poi by apache.
the class TestCHPBinTable method testReadWrite.
public void testReadWrite() throws Exception {
FileInformationBlock fib = _hWPFDocFixture._fib;
byte[] mainStream = _hWPFDocFixture._mainStream;
byte[] tableStream = _hWPFDocFixture._tableStream;
int fcMin = fib.getFibBase().getFcMin();
_cHPBinTable = new CHPBinTable(mainStream, tableStream, fib.getFcPlcfbteChpx(), fib.getLcbPlcfbteChpx(), fakeTPT);
HWPFFileSystem fileSys = new HWPFFileSystem();
_cHPBinTable.writeTo(fileSys, 0, fakeTPT);
ByteArrayOutputStream tableOut = fileSys.getStream("1Table");
ByteArrayOutputStream mainOut = fileSys.getStream("WordDocument");
byte[] newTableStream = tableOut.toByteArray();
byte[] newMainStream = mainOut.toByteArray();
CHPBinTable newBinTable = new CHPBinTable(newMainStream, newTableStream, 0, newTableStream.length, fakeTPT);
List<CHPX> oldTextRuns = _cHPBinTable._textRuns;
List<CHPX> newTextRuns = newBinTable._textRuns;
assertEquals(oldTextRuns.size(), newTextRuns.size());
int size = oldTextRuns.size();
for (int x = 0; x < size; x++) {
CHPX oldNode = oldTextRuns.get(x);
CHPX newNode = newTextRuns.get(x);
assertTrue(oldNode.equals(newNode));
}
}
use of org.apache.poi.hwpf.model.io.HWPFFileSystem in project poi by apache.
the class TestPAPBinTable method testReadWrite.
public void testReadWrite() throws Exception {
/** @todo verify the constructors */
HWPFDocFixture _hWPFDocFixture = new HWPFDocFixture(this, HWPFDocFixture.DEFAULT_TEST_FILE);
_hWPFDocFixture.setUp();
TextPieceTable fakeTPT = new TextPieceTable();
FileInformationBlock fib = _hWPFDocFixture._fib;
byte[] mainStream = _hWPFDocFixture._mainStream;
byte[] tableStream = _hWPFDocFixture._tableStream;
PAPBinTable _pAPBinTable = new PAPBinTable(mainStream, tableStream, null, fib.getFcPlcfbtePapx(), fib.getLcbPlcfbtePapx(), fakeTPT);
HWPFFileSystem fileSys = new HWPFFileSystem();
HWPFOutputStream tableOut = fileSys.getStream("1Table");
HWPFOutputStream mainOut = fileSys.getStream("WordDocument");
_pAPBinTable.writeTo(mainOut, tableOut, fakeTPT);
byte[] newTableStream = tableOut.toByteArray();
byte[] newMainStream = mainOut.toByteArray();
PAPBinTable newBinTable = new PAPBinTable(newMainStream, newTableStream, null, 0, newTableStream.length, fakeTPT);
List<PAPX> oldTextRuns = _pAPBinTable.getParagraphs();
List<PAPX> newTextRuns = newBinTable.getParagraphs();
assertEquals(oldTextRuns.size(), newTextRuns.size());
int size = oldTextRuns.size();
for (int x = 0; x < size; x++) {
PAPX oldNode = oldTextRuns.get(x);
PAPX newNode = newTextRuns.get(x);
assertTrue(oldNode.equals(newNode));
}
_hWPFDocFixture.tearDown();
}
Aggregations