📄 worddocument.java
字号:
BTreeSet characterTable, BTreeSet text) { StringBuffer blockBuffer = _bodyBuffer; byte[] papx = currentNode.getPapx(); int istd = Utils.convertBytesToShort(papx, 0); StyleDescription std = _styleSheet.getStyleDescription(istd); PAP pap = (PAP)StyleSheet.uncompressProperty(papx, std.getPAP(), _styleSheet); //handle table cells if(pap._fInTable > 0) { if(pap._fTtp == 0) { if(_cellBuffer == null) { _cellBuffer = new StringBuffer(); } blockBuffer = _cellBuffer; } else { if(_table == null) { _table = new ArrayList(); } TAP tap = (TAP)StyleSheet.uncompressProperty(papx, new TAP(), _styleSheet); TableRow nextRow = new TableRow(_cells, tap); _table.add(nextRow); _cells = null; return; } } else { //just prints out any table that is stored in _table printTable(); } if(pap._ilfo > 0) { LVL lvl = _listTables.getLevel(pap._ilfo, pap._ilvl); addListParagraphContent(lvl, blockBuffer, pap, currentNode, start, end, std); } else { addParagraphContent(blockBuffer, pap, currentNode, start, end, std); } } private void addListParagraphContent(LVL lvl, StringBuffer blockBuffer, PAP pap, PapxNode currentNode, int start, int end, StyleDescription std) { pap = (PAP)StyleSheet.uncompressProperty(lvl._papx, pap, _styleSheet, false); addParagraphProperties(pap, blockBuffer); ArrayList charRuns = findProperties(Math.max(currentNode.getStart(), start), Math.min(currentNode.getEnd(), end), _characterTable.root); int len = charRuns.size(); CHP numChp = (CHP)StyleSheet.uncompressProperty(((ChpxNode)charRuns.get(len-1)).getChpx(), std.getCHP(), _styleSheet); numChp = (CHP)StyleSheet.uncompressProperty(lvl._chpx, numChp, _styleSheet); //StyleContext context = StyleContext.getDefaultStyleContext(); //FontMetrics metrics = getFontMetrics(numChp, context); int indent = -1 * pap._dxaLeft1; String bulletText = getBulletText(lvl, pap); indent = indent - (bulletText.length() * 10) * 20;//(metrics.stringWidth(bulletText) * 20); if(indent > 0) { numChp._paddingEnd = (short)indent; } addCharacterProperties(numChp, blockBuffer); int listNum = 0; //if(number != null) //{ blockBuffer.append(bulletText); //listNum = 1; //} //for(;listNum < lvl._xst.length; listNum++) //{ // addText(lvl._xst[listNum], blockBuffer); //} switch (lvl._ixchFollow) { case 0: addText('\u0009', blockBuffer); break; case 1: addText(' ', blockBuffer); break; } closeLine(blockBuffer); for(int x = 0; x < len; x++) { ChpxNode charNode = (ChpxNode)charRuns.get(x); byte[] chpx = charNode.getChpx(); CHP chp = (CHP)StyleSheet.uncompressProperty(chpx, std.getCHP(), _styleSheet); addCharacterProperties(chp, blockBuffer); int charStart = Math.max(charNode.getStart(), currentNode.getStart()); int charEnd = Math.min(charNode.getEnd(), currentNode.getEnd()); ArrayList textRuns = findProperties(charStart, charEnd, _text.root); int textRunLen = textRuns.size(); for(int y = 0; y < textRunLen; y++) { TextPiece piece = (TextPiece)textRuns.get(y); charStart = Math.max(charStart, piece.getStart()); charEnd = Math.min(charEnd, piece.getEnd()); if(piece.usesUnicode()) { addUnicodeText(charStart, charEnd, blockBuffer); } else { addText(charStart, charEnd, blockBuffer); } closeLine(blockBuffer); } } closeBlock(blockBuffer); } private void addParagraphContent(StringBuffer blockBuffer, PAP pap, PapxNode currentNode, int start, int end, StyleDescription std) { addParagraphProperties(pap, blockBuffer); ArrayList charRuns = findProperties(Math.max(currentNode.getStart(), start), Math.min(currentNode.getEnd(), end), _characterTable.root); int len = charRuns.size(); for(int x = 0; x < len; x++) { ChpxNode charNode = (ChpxNode)charRuns.get(x); byte[] chpx = charNode.getChpx(); CHP chp = (CHP)StyleSheet.uncompressProperty(chpx, std.getCHP(), _styleSheet); addCharacterProperties(chp, blockBuffer); int charStart = Math.max(charNode.getStart(), currentNode.getStart()); int charEnd = Math.min(charNode.getEnd(), currentNode.getEnd()); ArrayList textRuns = findProperties(charStart, charEnd, _text.root); int textRunLen = textRuns.size(); for(int y = 0; y < textRunLen; y++) { TextPiece piece = (TextPiece)textRuns.get(y); charStart = Math.max(charStart, piece.getStart()); charEnd = Math.min(charEnd, piece.getEnd()); if(piece.usesUnicode()) { addUnicodeText(charStart, charEnd, blockBuffer); } else { addText(charStart, charEnd, blockBuffer); } closeLine(blockBuffer); } } closeBlock(blockBuffer); } private void addText(int start, int end, StringBuffer buf) { for(int x = start; x < end; x++) { char ch = '?'; ch = (char)_header[x]; addText(ch, buf); } } private void addText(char ch, StringBuffer buf) { int num = 0xffff & ch; if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == ' ' || ch == '-' || ch == '.' || ch == '$') { buf.append(ch); } else if(num == 0x07 && _cellBuffer != null) { if(_cells == null) { _cells = new ArrayList(); } closeLine(_cellBuffer); closeBlock(_cellBuffer); _cells.add(_cellBuffer.toString()); _cellBuffer = null; } else { /** @todo handle special characters */ if(num < 0x20) num=0x20; buf.append("&#"); buf.append(num); buf.append(';'); } } private void addUnicodeText(int start, int end, StringBuffer buf) { for(int x = start; x < end; x += 2) { char ch = Utils.getUnicodeCharacter(_header, x); //if(ch < 0x0020) //{ // _bodyBuffer.append('?'); //} //else //{ addText(ch, buf); //} } } private void addParagraphProperties(PAP pap, StringBuffer buf) { buf.append("<fo:block "); buf.append("text-align=\"" + getTextAlignment(pap._jc) + "\"\r\n"); buf.append("linefeed-treatment=\"preserve\" "); buf.append("white-space-collapse=\"false\" "); if(pap._fKeep > 0) { buf.append("keep-together.within-page=\"always\"\r\n"); } if(pap._fKeepFollow > 0) { buf.append("keep-with-next.within-page=\"always\"\r\n"); } if(pap._fPageBreakBefore > 0) { buf.append("break-before=\"page\"\r\n"); } if(pap._fNoAutoHyph == 0) { buf.append("hyphenate=\"true\"\r\n"); } else { buf.append("hyphenate=\"false\"\r\n"); } if(pap._dxaLeft > 0) { buf.append("start-indent=\"" + ((float)pap._dxaLeft)/1440.0f + "in\"\r\n"); } if(pap._dxaRight > 0) { buf.append("end-indent=\"" + ((float)pap._dxaRight)/1440.0f + "in\"\r\n"); } if(pap._dxaLeft1 != 0) { buf.append("text-indent=\"" + ((float)pap._dxaLeft1)/1440.0f + "in\"\r\n"); } if(pap._lspd[1] == 0) { //buf.append("line-height=\"" + ((float)pap._lspd[0])/1440.0f + "in\"\r\n"); } addBorder(buf, pap._brcTop, "top"); addBorder(buf, pap._brcBottom, "bottom"); addBorder(buf, pap._brcLeft, "left"); addBorder(buf, pap._brcRight, "right"); buf.append(">"); } private void addCharacterProperties(CHP chp, StringBuffer buf) { buf.append("<fo:inline "); buf.append("font-family=\"" + _fonts.getFont(chp._ftcAscii) + "\" "); buf.append("font-size=\"" + (chp._hps / 2) + "pt\" "); buf.append("color=\"" + getColor(chp._ico) + "\" "); //not supported by fop //buf.append("letter-spacing=\"" + ((double)chp._dxaSpace)/1440.0f + "in\" "); addBorder(buf, chp._brc, "top"); addBorder(buf, chp._brc, "bottom"); addBorder(buf, chp._brc, "left"); addBorder(buf, chp._brc, "right"); if(chp._italic) { buf.append("font-style=\"italic\" "); } if(chp._bold) { buf.append("font-weight=\"bold\" "); } if(chp._fSmallCaps) { buf.append("font-variant=\"small-caps\" "); } if(chp._fCaps) { buf.append("text-transform=\"uppercase\" "); } if(chp._fStrike || chp._fDStrike) { buf.append("text-decoration=\"line-through\" "); } if(chp._fShadow) { int size = chp._hps/24; buf.append("text-shadow=\"" + size + "pt\""); } if(chp._fLowerCase) { buf.append("text-transform=\"lowercase\" "); } if(chp._kul > 0) { buf.append("text-decoration=\"underline\" "); } if(chp._highlighted) { buf.append("background-color=\"" + getColor(chp._icoHighlight) + "\" "); } if(chp._paddingStart != 0) { buf.append("padding-start=\"" + (float)chp._paddingStart/1440.0f + "in\" "); } if(chp._paddingEnd != 0) { buf.append("padding-end=\"" + (float)chp._paddingEnd/1440.0f + "in\" "); } buf.append(">"); } private void addStaticContent(String flowName, HeaderFooter content) { _bodyBuffer.append("<fo:static-content flow-name=\"" + flowName + "\">"); //_bodyBuffer.append("<fo:float float=\"before\">"); addBlockContent(content.getStart(), content.getEnd(),_text, _paragraphTable, _characterTable); //_bodyBuffer.append("</fo:float>"); _bodyBuffer.append("</fo:static-content>"); } private String getBulletText(LVL lvl, PAP pap) { StringBuffer bulletBuffer = new StringBuffer(); for(int x = 0; x < lvl._xst.length; x++) { if(lvl._xst[x] < 9) { LVL numLevel = _listTables.getLevel(pap._ilfo, 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]); } } return bulletBuffer.toString(); } /** * finds all chpx's that are between start and end */ private ArrayList findProperties(int start, int end, BTreeSet.BTreeNode root) { ArrayList results = new ArrayList(); BTreeSet.Entry[] entries = root.entries; for(int x = 0; x < entries.length; x++) { if(entries[x] != null) { BTreeSet.BTreeNode child = entries[x].child; PropertyNode xNode = (PropertyNode)entries[x].element; if(xNode != null) { int xStart = xNode.getStart(); int xEnd = xNode.getEnd(); if(xStart < end) { if(xStart >= start) { if(child != null) { ArrayList beforeItems = findProperties(start, end, child); results.addAll(beforeItems); } results.add(xNode); } else if(start < xEnd) { results.add(xNode); //break; } } else { if(child != null) { ArrayList beforeItems = findProperties(start, end, child); results.addAll(beforeItems); } break; } } else if(child != null) { ArrayList afterItems = findProperties(start, end, child); results.addAll(afterItems); } } else { break; } } return results; } private void openPage(String page, String type) { _bodyBuffer.append("<fo:page-sequence master-reference=\"" + page + "\">\r\n"); } private void openFlow() { _bodyBuffer.append("<fo:flow flow-name=\"xsl-region-body\">\r\n"); } private void closeFlow() { _bodyBuffer.append("</fo:flow>\r\n"); } private void closePage() { _bodyBuffer.append("</fo:page-sequence>\r\n"); } private void closeLine(StringBuffer buf) { buf.append("</fo:inline>");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -