From b53e0ba59c5a6a77a78ca8d4a0a50804192eeccf Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Thu, 7 Oct 2010 13:40:58 +0000 Subject: [PATCH] support for processing of symbols in HWPF, see Bugzilla 49908 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1005443 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../poi/hwpf/usermodel/CharacterRun.java | 46 +++++++++++++++++ .../poi/hwpf/usermodel/TestRangeSymbols.java | 48 ++++++++++++++++++ test-data/document/Bug49908.doc | Bin 0 -> 23040 bytes 4 files changed, 95 insertions(+) create mode 100755 src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRangeSymbols.java create mode 100755 test-data/document/Bug49908.doc diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 8793b5e98..94691ec8f 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 49908 - support for processing of symbols in HWPF 50022 - support for retrieving pictures from HSSF workbooks 50020 - Avoid IllegalStateException when creating Data validation in sheet with macro 50033 - Improved rounding in MOD diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterRun.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterRun.java index 2b6d41bb3..076b0029a 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterRun.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/CharacterRun.java @@ -18,6 +18,7 @@ package org.apache.poi.hwpf.usermodel; import org.apache.poi.hwpf.model.CHPX; +import org.apache.poi.hwpf.model.Ffn; import org.apache.poi.hwpf.model.StyleSheet; import org.apache.poi.hwpf.sprm.SprmBuffer; @@ -557,5 +558,50 @@ public final class CharacterRun return cp; } + + /** + * Returns true, if the CharacterRun is a special character run containing a symbol, otherwise false. + * + *

In case of a symbol, the {@link #text()} method always returns a single character 0x0028, but word actually stores + * the character in a different field. Use {@link #getSymbolCharacter()} to get that character and {@link #getSymbolFont()} + * to determine its font. + */ + public boolean isSymbol() + { + return isSpecialCharacter() && text().equals("\u0028"); + } + + /** + * Returns the symbol character, if this is a symbol character run. + * + * @see #isSymbol() + * @throws IllegalStateException If this is not a symbol character run: call {@link #isSymbol()} first. + */ + public char getSymbolCharacter() + { + if (isSymbol()) { + return (char)_props.getXchSym(); + } else + throw new IllegalStateException("Not a symbol CharacterRun"); + } + + /** + * Returns the symbol font, if this is a symbol character run. Might return null, if the font index is not found in the font table. + * + * @see #isSymbol() + * @throws IllegalStateException If this is not a symbol character run: call {@link #isSymbol()} first. + */ + public Ffn getSymbolFont() + { + if (isSymbol()) { + Ffn[] fontNames = _doc.getFontTable().getFontNames(); + + if (fontNames.length <= _props.getFtcSym()) + return null; + + return fontNames[_props.getFtcSym()]; + } else + throw new IllegalStateException("Not a symbol CharacterRun"); + } } diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRangeSymbols.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRangeSymbols.java new file mode 100755 index 000000000..bc1d9979a --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRangeSymbols.java @@ -0,0 +1,48 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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; + +import java.io.IOException; + +import junit.framework.TestCase; + +import org.apache.poi.hwpf.HWPFDocument; +import org.apache.poi.hwpf.HWPFTestDataSamples; + +/** + * API for processing of symbols, see Bugzilla 49908 + */ +public final class TestRangeSymbols extends TestCase { + + public void test() throws IOException { + HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug49908.doc"); + + Range range = doc.getRange(); + + assertTrue(range.numCharacterRuns() >= 2); + CharacterRun chr = range.getCharacterRun(0); + assertEquals(false, chr.isSymbol()); + + chr = range.getCharacterRun(1); + assertEquals(true, chr.isSymbol()); + assertEquals("\u0028", chr.text()); + assertEquals("Wingdings", chr.getSymbolFont().getMainFontName()); + assertEquals(0xf028, chr.getSymbolCharacter()); + } + +} \ No newline at end of file diff --git a/test-data/document/Bug49908.doc b/test-data/document/Bug49908.doc new file mode 100755 index 0000000000000000000000000000000000000000..6a89732e71934b87b8364bf10af21f5bfc5d9080 GIT binary patch literal 23040 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 literal 0 HcmV?d00001