From 3ed873b5939b837df6781454f45deda21df7270a Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 17 Sep 2010 14:14:19 +0000 Subject: [PATCH] Fix bug #49936 - Handle HWPF documents with problematic HeaderStories better git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@998146 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../poi/hwpf/usermodel/HeaderStories.java | 12 ++++++++-- .../poi/hwpf/usermodel/TestProblems.java | 22 ++++++++++++++++++ .../document/HeaderFooterProblematic.doc | Bin 0 -> 61440 bytes 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 test-data/document/HeaderFooterProblematic.doc diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 0da406cdc3..5038f83145 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 49936 - Handle HWPF documents with problematic HeaderStories better 49933 - Support sections in Word 6 and Word 95 files (HWPFOldDocument) 49941 - Correctly handle space preservation of XSSFRichTextRuns when applying fonts to parts of the string Correct XWPFRun detection of bold/italic in a paragraph with multiple runs of different styles diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/HeaderStories.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/HeaderStories.java index 4afaba9d1e..c0322115b3 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/HeaderStories.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/HeaderStories.java @@ -157,10 +157,18 @@ public final class HeaderStories { // Empty story return ""; } + if(prop.getEnd() < prop.getStart()) { + // Broken properties? + return ""; + } + + // Ensure we're getting a sensible length + String rawText = headerStories.text(); + int start = Math.min(prop.getStart(), rawText.length()); + int end = Math.min(prop.getEnd(), rawText.length()); // Grab the contents - String text = - headerStories.text().substring(prop.getStart(), prop.getEnd()); + String text = rawText.substring(start, end); // Strip off fields and macros if requested if(stripFields) { diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java index 3ca917514f..19e67a46db 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java @@ -21,6 +21,7 @@ import org.apache.poi.EncryptedDocumentException; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.HWPFTestCase; import org.apache.poi.hwpf.HWPFTestDataSamples; +import org.apache.poi.hwpf.extractor.WordExtractor; import org.apache.poi.hwpf.model.StyleSheet; /** @@ -232,6 +233,27 @@ public final class TestProblems extends HWPFTestCase { } } } + + /** + * Bug #49936 - Problems with reading the header out of + * the Header Stories + */ + public void testProblemHeaderStories49936() throws Exception { + HWPFDocument doc = HWPFTestDataSamples.openSampleFile("HeaderFooterProblematic.doc"); + HeaderStories hs = new HeaderStories(doc); + + assertEquals("", hs.getFirstHeader()); + assertEquals("\r", hs.getEvenHeader()); + assertEquals("", hs.getOddHeader()); + + assertEquals("", hs.getFirstFooter()); + assertEquals("", hs.getEvenFooter()); + assertEquals("", hs.getOddFooter()); + + WordExtractor ext = new WordExtractor(doc); + assertEquals("\n", ext.getHeaderText()); + assertEquals("", ext.getFooterText()); + } /** * Bug #48245 - don't include the text from the diff --git a/test-data/document/HeaderFooterProblematic.doc b/test-data/document/HeaderFooterProblematic.doc new file mode 100644 index 0000000000000000000000000000000000000000..a4d9d303d2ae59d1b5bdd470f520956673abbd0c GIT binary patch literal 61440 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 literal 0 HcmV?d00001 -- 2.39.5