⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eventbridge.java

📁 Office格式转换代码
💻 JAVA
字号:
package org.apache.poi.hdf.event;import org.apache.poi.hdf.model.util.BTreeSet;import org.apache.poi.hdf.model.util.NumberFormatter;import org.apache.poi.hdf.model.hdftypes.*;import org.apache.poi.util.LittleEndian;import java.util.ArrayList;public class EventBridge implements HDFLowLevelParsingListener{  private static int HEADER_EVEN_INDEX = 0;  private static int HEADER_ODD_INDEX = 1;  private static int FOOTER_EVEN_INDEX = 2;  private static int FOOTER_ODD_INDEX = 3;  private static int HEADER_FIRST_INDEX = 4;  private static int FOOTER_FIRST_INDEX = 5;  /** This class translates low level events into high level events for this  *   listener */  HDFParsingListener _listener;  /** stylesheet for this document */  StyleSheet _stsh;  /** name says it all */  DocumentProperties _dop;  /** StyleDescription for the current paragraph. */  StyleDescription _currentStd;  /** List info for this doc */  ListTables _listTables;  /** "WordDocument" from the POIFS */  byte[] _mainDocument;  /** Table0 or Table1 from POIFS */  byte[] _tableStream;  /** text offset in main stream */  int _fcMin;  int _ccpText;  int _ccpFtn;  int _hdrSize;  int _hdrOffset;  /** text pieces */  BTreeSet _text = new BTreeSet();  private boolean _beginHeaders;  BTreeSet _hdrSections = new BTreeSet();  BTreeSet _hdrParagraphs = new BTreeSet();  BTreeSet _hdrCharacterRuns = new BTreeSet();  int _sectionCounter = 1;  ArrayList _hdrs = new ArrayList();  private boolean _holdParagraph = false;  private int _endHoldIndex = -1;  private ArrayList _onHold;  public EventBridge(HDFParsingListener listener)  {    _listener = listener;  }  public void mainDocument(byte[] mainDocument)  {    _mainDocument = mainDocument;  }  public void tableStream(byte[] tableStream)  {    _tableStream = tableStream;  }  public void miscellaneous(int fcMin, int ccpText, int ccpFtn, int fcPlcfhdd, int lcbPlcfhdd)  {    _fcMin = fcMin;    _ccpText = ccpText;    _ccpFtn = ccpFtn;    _hdrOffset = fcPlcfhdd;    _hdrSize = lcbPlcfhdd;  }  public void document(DocumentProperties dop)  {    _dop = dop;  }  public void bodySection(SepxNode sepx)  {    SectionProperties sep = (SectionProperties)StyleSheet.uncompressProperty(sepx.getSepx(), new SectionProperties(), _stsh);    HeaderFooter[] hdrArray = findSectionHdrFtrs(_sectionCounter);    _hdrs.add(hdrArray);    _listener.section(sep, sepx.getStart() - _fcMin, sepx.getEnd() - _fcMin);    _sectionCounter++;  }  public void hdrSection(SepxNode sepx)  {    _beginHeaders = true;    _hdrSections.add(sepx);  }  public void endSections()  {    for (int x = 1; x < _sectionCounter; x++)    {      HeaderFooter[] hdrArray = (HeaderFooter[])_hdrs.get(x-1);      HeaderFooter hf = null;      if (!hdrArray[HeaderFooter.HEADER_EVEN - 1].isEmpty())      {        hf = hdrArray[HeaderFooter.HEADER_EVEN - 1];        _listener.header(x - 1, HeaderFooter.HEADER_EVEN);        flushHeaderProps(hf.getStart(), hf.getEnd());      }      if (!hdrArray[HeaderFooter.HEADER_ODD - 1].isEmpty())      {        hf = hdrArray[HeaderFooter.HEADER_ODD - 1];        _listener.header(x - 1, HeaderFooter.HEADER_ODD);        flushHeaderProps(hf.getStart(), hf.getEnd());      }      if (!hdrArray[HeaderFooter.FOOTER_EVEN - 1].isEmpty())      {        hf = hdrArray[HeaderFooter.FOOTER_EVEN - 1];        _listener.footer(x - 1, HeaderFooter.FOOTER_EVEN);        flushHeaderProps(hf.getStart(), hf.getEnd());      }      if (!hdrArray[HeaderFooter.FOOTER_ODD - 1].isEmpty())      {        hf = hdrArray[HeaderFooter.FOOTER_EVEN - 1];        _listener.footer(x - 1, HeaderFooter.FOOTER_EVEN);        flushHeaderProps(hf.getStart(), hf.getEnd());      }      if (!hdrArray[HeaderFooter.HEADER_FIRST - 1].isEmpty())      {        hf = hdrArray[HeaderFooter.HEADER_FIRST - 1];        _listener.header(x - 1, HeaderFooter.HEADER_FIRST);        flushHeaderProps(hf.getStart(), hf.getEnd());      }      if (!hdrArray[HeaderFooter.FOOTER_FIRST - 1].isEmpty())      {        hf = hdrArray[HeaderFooter.FOOTER_FIRST - 1];        _listener.footer(x - 1, HeaderFooter.FOOTER_FIRST);        flushHeaderProps(hf.getStart(), hf.getEnd());      }    }  }  public void paragraph(PapxNode papx)  {    if (_beginHeaders)    {      _hdrParagraphs.add(papx);    }    byte[] bytePapx = papx.getPapx();    int istd = LittleEndian.getShort(bytePapx, 0);    _currentStd = _stsh.getStyleDescription(istd);    ParagraphProperties pap = (ParagraphProperties)StyleSheet.uncompressProperty(bytePapx, _currentStd.getPAP(), _stsh);    if (pap.getFTtp() > 0)    {      TableProperties tap = (TableProperties)StyleSheet.uncompressProperty(bytePapx, new TableProperties(), _stsh);      _listener.tableRowEnd(tap, papx.getStart() - _fcMin, papx.getEnd() - _fcMin);    }    else if (pap.getIlfo() > 0)    {      _holdParagraph = true;      _endHoldIndex = papx.getEnd();      _onHold.add(papx);    }    else    {      _listener.paragraph(pap, papx.getStart() - _fcMin, papx.getEnd() - _fcMin);    }  }  public void characterRun(ChpxNode chpx)  {    if (_beginHeaders)    {      _hdrCharacterRuns.add(chpx);    }    int start = chpx.getStart();    int end = chpx.getEnd();    //check to see if we should hold this characterRun    if (_holdParagraph)    {      _onHold.add(chpx);      if (end >= _endHoldIndex)      {        _holdParagraph = false;        _endHoldIndex = -1;        flushHeldParagraph();        _onHold = new ArrayList();      }    }    byte[] byteChpx = chpx.getChpx();    CharacterProperties chp = (CharacterProperties)StyleSheet.uncompressProperty(byteChpx, _currentStd.getCHP(), _stsh);    ArrayList textList = BTreeSet.findProperties(start, end, _text.root);    String text = getTextFromNodes(textList, start, end);    _listener.characterRun(chp, text, start - _fcMin, end - _fcMin);  }  public void text(TextPiece t)  {    _text.add(t);  }  public void fonts(FontTable fontTbl)  {  }  public void lists(ListTables listTbl)  {    _listTables = listTbl;  }  public void styleSheet(StyleSheet stsh)  {    _stsh = stsh;  }  private void flushHeaderProps(int start, int end)  {    ArrayList list = BTreeSet.findProperties(start, end, _hdrSections.root);    int size = list.size();    for (int x = 0; x < size; x++)    {      SepxNode oldNode = (SepxNode)list.get(x);      int secStart = Math.max(oldNode.getStart(), start);      int secEnd = Math.min(oldNode.getEnd(), end);      //SepxNode node = new SepxNode(-1, secStart, secEnd, oldNode.getSepx());      //bodySection(node);      ArrayList parList = BTreeSet.findProperties(secStart, secEnd, _hdrParagraphs.root);      int parSize = parList.size();      for (int y = 0; y < parSize; y++)      {        PapxNode oldParNode = (PapxNode)parList.get(y);        int parStart = Math.max(oldParNode.getStart(), secStart);        int parEnd = Math.min(oldParNode.getEnd(), secEnd);        PapxNode parNode = new PapxNode(parStart, parEnd, oldParNode.getPapx());        paragraph(parNode);        ArrayList charList = BTreeSet.findProperties(parStart, parEnd, _hdrCharacterRuns.root);        int charSize = charList.size();        for (int z = 0; z < charSize; z++)        {          ChpxNode oldCharNode = (ChpxNode)charList.get(z);          int charStart = Math.max(oldCharNode.getStart(), parStart);          int charEnd = Math.min(oldCharNode.getEnd(), parEnd);          ChpxNode charNode = new ChpxNode(charStart, charEnd, oldCharNode.getChpx());          characterRun(charNode);        }      }    }  }  private String getTextFromNodes(ArrayList list, int start, int end)  {    int size = list.size();    StringBuffer sb = new StringBuffer();    for (int x = 0; x < size; x++)    {      TextPiece piece = (TextPiece)list.get(x);      int charStart = Math.max(start, piece.getStart());      int charEnd = Math.min(end, piece.getEnd());      if(piece.usesUnicode())      {        for (int y = charStart; y < charEnd; y += 2)        {          sb.append((char)LittleEndian.getShort(_mainDocument, y));        }      }      else      {        for (int y = charStart; y < charEnd; y++)        {          sb.append(_mainDocument[y]);        }      }    }    return sb.toString();  }  private void flushHeldParagraph()  {    PapxNode papx = (PapxNode)_onHold.get(0);    byte[] bytePapx = papx.getPapx();    int istd = LittleEndian.getShort(bytePapx, 0);    StyleDescription std = _stsh.getStyleDescription(istd);    ParagraphProperties pap = (ParagraphProperties)StyleSheet.uncompressProperty(bytePapx, _currentStd.getPAP(), _stsh);    LVL lvl = _listTables.getLevel(pap.getIlfo(), pap.getIlvl());    pap = (ParagraphProperties)StyleSheet.uncompressProperty(lvl._papx, pap, _stsh, false);    int size = _onHold.size() - 1;    CharacterProperties numChp = (CharacterProperties)StyleSheet.uncompressProperty(((ChpxNode)_onHold.get(size)).getChpx(), std.getCHP(), _stsh);    numChp = (CharacterProperties)StyleSheet.uncompressProperty(lvl._chpx, numChp, _stsh);    String bulletText = getBulletText(lvl, pap);    _listener.listEntry(bulletText, numChp, pap, papx.getStart() - _fcMin, papx.getEnd() - _fcMin);    for (int x = 1; x <= size; x++)    {      characterRun((ChpxNode)_onHold.get(x));    }  }  private String getBulletText(LVL lvl, ParagraphProperties pap)  {    StringBuffer bulletBuffer = new StringBuffer();    for(int x = 0; x < lvl._xst.length; x++)    {      if(lvl._xst[x] < 9)      {        LVL numLevel = _listTables.getLevel(pap.getIlfo(), lvl._xst[x]);        int num = numLevel._iStartAt;        if(lvl == numLevel)        {          numLevel._iStartAt++;        }        else if(num > 1)        {          num--;        }        bulletBuffer.append(NumberFormatter.getNumber(num, lvl._nfc));      }      else      {        bulletBuffer.append(lvl._xst[x]);      }    }    switch (lvl._ixchFollow)    {      case 0:        bulletBuffer.append('\u0009');        break;      case 1:        bulletBuffer.append(' ');        break;    }    return bulletBuffer.toString();  }  private HeaderFooter[] findSectionHdrFtrs(int index)  {    HeaderFooter[] hdrArray = new HeaderFooter[6];    for (int x = 1; x < 7; x++)    {      hdrArray[x-1] = createSectionHdrFtr(index, x);    }    return hdrArray;  }  private HeaderFooter createSectionHdrFtr(int index, int type)  {    if(_hdrSize < 50)    {      return new HeaderFooter(0,0,0);    }    int start = _fcMin + _ccpText + _ccpFtn;    int end = start;    int arrayIndex = 0;    switch(type)    {      case HeaderFooter.HEADER_EVEN:           arrayIndex = (HEADER_EVEN_INDEX + (index * 6));           break;      case HeaderFooter.FOOTER_EVEN:           arrayIndex = (FOOTER_EVEN_INDEX + (index * 6));           break;      case HeaderFooter.HEADER_ODD:           arrayIndex = (HEADER_ODD_INDEX + (index * 6));           break;      case HeaderFooter.FOOTER_ODD:           arrayIndex = (FOOTER_ODD_INDEX + (index * 6));           break;      case HeaderFooter.HEADER_FIRST:           arrayIndex = (HEADER_FIRST_INDEX + (index * 6));           break;      case HeaderFooter.FOOTER_FIRST:           arrayIndex = (FOOTER_FIRST_INDEX + (index * 6));           break;    }    start += LittleEndian.getInt(_tableStream, _hdrOffset + (arrayIndex * 4));    end += LittleEndian.getInt(_tableStream, _hdrOffset + (arrayIndex + 1) * 4);    HeaderFooter retValue = new HeaderFooter(type, start, end);    if((end - start) == 0 && index > 1)    {      retValue = createSectionHdrFtr(type, index - 1);    }    return retValue;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -