/** * Constructor used to read a binTable in from a Word document. */ public CHPBinTable(byte[] documentStream, byte[] tableStream, int offset, int size, CharIndexTranslator translator) { PlexOfCps binTable = new PlexOfCps(tableStream, offset, size, 4); int length = binTable.Length; for (int x = 0; x < length; x++) { GenericPropertyNode node = binTable.GetProperty(x); int pageNum = LittleEndian.GetInt(node.Bytes); int pageOffset = POIFSConstants.SMALLER_BIG_BLOCK_SIZE * pageNum; CHPFormattedDiskPage cfkp = new CHPFormattedDiskPage(documentStream, pageOffset, translator); int fkpSize = cfkp.Size(); for (int y = 0; y < fkpSize; y++) { CHPX chpx = cfkp.GetCHPX(y); if (chpx != null) { _textRuns.Add(chpx); } } } }
/** * Constructor used to read an old-style binTable * in from a Word document. * * @param documentStream * @param offset * @param size * @param fcMin */ public OldCHPBinTable(byte[] documentStream, int OffSet, int size, int fcMin, TextPieceTable tpt) { PlexOfCps binTable = new PlexOfCps(documentStream, OffSet, size, 2); int length = binTable.Length; for (int x = 0; x < length; x++) { GenericPropertyNode node = binTable.GetProperty(x); int pageNum = LittleEndian.GetShort(node.Bytes); int pageOffset = POIFSConstants.SMALLER_BIG_BLOCK_SIZE * pageNum; CHPFormattedDiskPage cfkp = new CHPFormattedDiskPage(documentStream, pageOffset, fcMin, tpt); int fkpSize = cfkp.Size(); for (int y = 0; y < fkpSize; y++) { _textRuns.Add(cfkp.GetCHPX(y)); } } }
public void WriteTo(HWPFFileSystem sys, int fcMin) { HWPFStream docStream = sys.GetStream("WordDocument"); Stream tableStream = sys.GetStream("1Table"); PlexOfCps binTable = new PlexOfCps(4); // each FKP must start on a 512 byte page. int docOffset = docStream.Offset; int mod = docOffset % POIFSConstants.SMALLER_BIG_BLOCK_SIZE; if (mod != 0) { byte[] pAdding = new byte[POIFSConstants.SMALLER_BIG_BLOCK_SIZE - mod]; docStream.Write(pAdding); } // get the page number for the first fkp docOffset = docStream.Offset; int pageNum = docOffset / POIFSConstants.SMALLER_BIG_BLOCK_SIZE; // get the ending fc int endingFc = ((PropertyNode)_textRuns[_textRuns.Count - 1]).End; endingFc += fcMin; List <CHPX> overflow = _textRuns; do { PropertyNode startingProp = (PropertyNode)overflow[0]; int start = startingProp.Start + fcMin; CHPFormattedDiskPage cfkp = new CHPFormattedDiskPage(); cfkp.Fill(overflow); byte[] bufFkp = cfkp.ToArray(fcMin); docStream.Write(bufFkp); overflow = cfkp.GetOverflow(); int end = endingFc; if (overflow != null) { end = ((PropertyNode)overflow[0]).Start + fcMin; } byte[] intHolder = new byte[4]; LittleEndian.PutInt(intHolder, pageNum++); binTable.AddProperty(new GenericPropertyNode(start, end, intHolder)); }while (overflow != null); byte[] bytes = binTable.ToByteArray(); tableStream.Write(bytes, 0, bytes.Length); }