This is an automated email from the ASF dual-hosted git repository. tballison pushed a commit to branch TIKA-4744 in repository https://gitbox.apache.org/repos/asf/tika.git
commit 7b6e86035c905cb4c7cad95f7740fc86e13537b2 Author: tallison <[email protected]> AuthorDate: Fri May 29 09:16:39 2026 -0400 TIKA-4744 - fix apple, rtf, odf, ooxml xhtml tag balancing --- .../tika/parser/iwork/KeynoteContentHandler.java | 6 + .../parser/iwork/KeynoteContentHandlerTest.java | 84 ++++ .../microsoft/ooxml/FormattingTagManager.java | 19 +- .../microsoft/ooxml/OOXMLTikaBodyPartHandler.java | 11 +- .../parser/microsoft/rtf/RTFEmbObjHandler.java | 15 +- .../tika/parser/microsoft/rtf/RTFParser.java | 14 +- .../tika/parser/microsoft/rtf/TextExtractor.java | 36 +- .../parser/microsoft/ooxml/OOXMLDocxSAXTest.java | 28 ++ .../tika/parser/microsoft/rtf/RTFParserTest.java | 16 + .../test-documents/testRTF_parInsideHyperlink.rtf | 9 + .../testWORD_formattingFlipUnderlineOrder.docx | Bin 0 -> 18506 bytes .../testWORD_tableInRunInsideParagraph.docx | Bin 0 -> 18606 bytes .../tika/parser/odf/FlatOpenDocumentParser.java | 100 +++- .../tika/parser/odf/OpenDocumentBodyHandler.java | 7 +- .../org/apache/tika/parser/odf/ODFParserTest.java | 15 + .../test-documents/testFODS_embeddedChart.fods | 547 +++++++++++++++++++++ 16 files changed, 868 insertions(+), 39 deletions(-) diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/KeynoteContentHandler.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/KeynoteContentHandler.java index a3ad3db0a8..7e33716ab6 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/KeynoteContentHandler.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/main/java/org/apache/tika/parser/iwork/KeynoteContentHandler.java @@ -142,6 +142,12 @@ class KeynoteContentHandler extends DefaultHandler { } else if (inMetadata && "key:authors".equals(qName)) { inMetaDataAuthors = false; } else if (inSlide && "sf:tabular-model".equals(qName)) { + // If the final row has fewer cells than numberOfColumns, + // parseTableData never reaches its </tr> emit. Close any open + // row before </table> so the SAX stream stays balanced. + if (currentColumn != null && currentColumn != 0) { + xhtml.endElement("tr"); + } xhtml.endElement("table"); tableId = null; numberOfColumns = null; diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/test/java/org/apache/tika/parser/iwork/KeynoteContentHandlerTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/test/java/org/apache/tika/parser/iwork/KeynoteContentHandlerTest.java new file mode 100644 index 0000000000..c67bc445aa --- /dev/null +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-apple-module/src/test/java/org/apache/tika/parser/iwork/KeynoteContentHandlerTest.java @@ -0,0 +1,84 @@ +/* + * 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.tika.parser.iwork; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; +import org.xml.sax.helpers.AttributesImpl; + +import org.apache.tika.metadata.Metadata; +import org.apache.tika.parser.ParseContext; +import org.apache.tika.sax.StrictXHTMLValidator; +import org.apache.tika.sax.ToXMLContentHandler; +import org.apache.tika.sax.XHTMLContentHandler; + +public class KeynoteContentHandlerTest { + + /** + * TIKA-4744: Keynote tables whose final row contains fewer cells than + * numberOfColumns left {@code <tr>} open when {@code </sf:tabular-model>} + * fired {@code </table>}. Drive the handler with a synthetic 3-column + * table whose final row has only 2 cells and assert the XHTML stays + * balanced through endDocument. + */ + @Test + public void testIncompleteFinalRowClosesTr() throws Exception { + Metadata md = new Metadata(); + ToXMLContentHandler xml = new ToXMLContentHandler(); + XHTMLContentHandler xhtml = new XHTMLContentHandler( + new StrictXHTMLValidator(xml), md, new ParseContext()); + KeynoteContentHandler h = new KeynoteContentHandler(xhtml, md); + + xhtml.startDocument(); + + // <key:slide> + h.startElement("", "slide", "key:slide", new AttributesImpl()); + // <sf:tabular-model sfa:ID="t1"> + AttributesImpl tabAttrs = new AttributesImpl(); + tabAttrs.addAttribute("", "sfa:ID", "sfa:ID", "CDATA", "t1"); + h.startElement("", "tabular-model", "sf:tabular-model", tabAttrs); + // <sf:columns sf:count="3"> + AttributesImpl colAttrs = new AttributesImpl(); + colAttrs.addAttribute("", "sf:count", "sf:count", "CDATA", "3"); + h.startElement("", "columns", "sf:columns", colAttrs); + h.endElement("", "columns", "sf:columns"); + // Two cells (less than 3) -> incomplete final row. + AttributesImpl cell = new AttributesImpl(); + cell.addAttribute("", "sfa:s", "sfa:s", "CDATA", "A"); + h.startElement("", "ct", "sf:ct", cell); + h.endElement("", "ct", "sf:ct"); + cell = new AttributesImpl(); + cell.addAttribute("", "sfa:s", "sfa:s", "CDATA", "B"); + h.startElement("", "ct", "sf:ct", cell); + h.endElement("", "ct", "sf:ct"); + // </sf:tabular-model> -- without the fix this emits </table> while + // <tr> is still topmost and StrictXHTMLValidator throws. + h.endElement("", "tabular-model", "sf:tabular-model"); + // </key:slide> + h.endElement("", "slide", "key:slide"); + + xhtml.endDocument(); + + String out = xml.toString(); + // Sanity: the cells emitted, the row closed, and the table closed. + assertTrue(out.contains("<td>A</td>"), "expected td A; got: " + out); + assertTrue(out.contains("<td>B</td>"), "expected td B; got: " + out); + assertTrue(out.contains("</tr>"), "expected </tr>; got: " + out); + assertTrue(out.contains("</table>"), "expected </table>; got: " + out); + } +} diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/FormattingTagManager.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/FormattingTagManager.java index 0545cd0037..3e8ae2f0de 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/FormattingTagManager.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/FormattingTagManager.java @@ -114,14 +114,16 @@ class FormattingTagManager { } if (runProperties.isBold() != isBold) { - if (isStrikeThrough) { - xhtml.endElement("s"); - isStrikeThrough = false; - } + // Close inner tags before flipping <b>. Nesting is <b><i><s><u> + // (outermost to innermost), so close innermost first: u, s, i. if (isUnderline) { xhtml.endElement("u"); isUnderline = false; } + if (isStrikeThrough) { + xhtml.endElement("s"); + isStrikeThrough = false; + } if (isItalics) { xhtml.endElement("i"); isItalics = false; @@ -135,14 +137,15 @@ class FormattingTagManager { } if (runProperties.isItalics() != isItalics) { - if (isStrikeThrough) { - xhtml.endElement("s"); - isStrikeThrough = false; - } + // Close inner tags before flipping <i>: u then s (u is innermost). if (isUnderline) { xhtml.endElement("u"); isUnderline = false; } + if (isStrikeThrough) { + xhtml.endElement("s"); + isStrikeThrough = false; + } if (runProperties.isItalics()) { xhtml.startElement("i"); } else { diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLTikaBodyPartHandler.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLTikaBodyPartHandler.java index 1e11e80b78..5c05436fac 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLTikaBodyPartHandler.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLTikaBodyPartHandler.java @@ -265,7 +265,16 @@ public class OOXMLTikaBodyPartHandler @Override public void startTable() throws SAXException { - + // A <w:tbl> can appear nested inside an outer <w:p> -- corrupt-ish but + // present in the corpus (e.g., <w:p><w:r>...<wps:txbx><w:txbxContent> + // <w:tbl>...). At that point a run-level <b>/<i>/<u>/<s>/<a> may be on + // the SAX stack just above where the <table> is about to land. When a + // later paragraph inside a cell ends, formattingTags.closeAll() tries + // to emit </b> for the outer-paragraph state, but <td> is topmost -- + // strict validator rejects the mismatch. Close pending formatting now + // so the table opens at a clean layer and the outer style is forgotten. + // Mirrors startSDT()'s same-shape guard. + formattingTags.closeAll(); xhtml.startElement("table"); openStructuralTags.push("table"); tableDepth++; diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFEmbObjHandler.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFEmbObjHandler.java index 5b52f19acb..0939d87cde 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFEmbObjHandler.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFEmbObjHandler.java @@ -35,6 +35,7 @@ import org.apache.tika.metadata.RTFMetadata; import org.apache.tika.metadata.TikaCoreProperties; import org.apache.tika.parser.ParseContext; import org.apache.tika.sax.EmbeddedContentHandler; +import org.apache.tika.sax.XHTMLBalancingHandler; /** * This class buffers data from embedded objects and pictures. @@ -235,12 +236,24 @@ class RTFEmbObjHandler { } metadata.set(TikaCoreProperties.RESOURCE_NAME_EXTENSION_INFERRED, true); } + // Wrap the outer handler in a balancing handler so that if + // the embedded parser aborts mid-element (leaving <p>/<b>/etc + // open on the wire), we can drain those before propagating. + // Without this, the outer RTF parser's subsequent + // </b>/</p>/</body> sequence trips StrictXHTMLValidator on + // unbalanced nesting and surfaces as a misleading error at + // endDocument. Same shape as the SXWPF / Epub catch arms. + XHTMLBalancingHandler balancer = new XHTMLBalancingHandler(handler); try { embeddedDocumentUtil - .parseEmbedded(tis, new EmbeddedContentHandler(handler), metadata, + .parseEmbedded(tis, new EmbeddedContentHandler(balancer), metadata, true); } catch (IOException e) { + balancer.drainOpenElements(); EmbeddedDocumentUtil.recordEmbeddedStreamException(e, metadata); + } catch (SAXException e) { + balancer.drainOpenElements(); + EmbeddedDocumentUtil.recordException(e, metadata); } } } diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java index 5e8dca35bc..4f83a81e97 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/RTFParser.java @@ -35,6 +35,7 @@ import org.apache.tika.metadata.Metadata; import org.apache.tika.mime.MediaType; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; +import org.apache.tika.sax.XHTMLBalancingHandler; import org.apache.tika.sax.XHTMLContentHandler; /** @@ -90,11 +91,22 @@ public class RTFParser implements Parser { TaggedInputStream tagged = new TaggedInputStream(tis); XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context); xhtml.startDocument(); + // Wrap xhtml in a balancing handler so the finally's endDocument + // doesn't fire on an unbalanced stack if the RTF state machine + // emits inconsistent SAX events (e.g., </b> while <p> is topmost + // due to state-vs-stack drift on certain corpus files). Without + // this, StrictXHTMLValidator's </body> vs <p>/<b> at endDocument + // masks the real well-formedness error from inside extract(). + XHTMLBalancingHandler balancer = new XHTMLBalancingHandler(xhtml); try { - parseInline(tis, xhtml, metadata, context); + parseInline(tis, balancer, metadata, context); } catch (IOException e) { tagged.throwIfCauseOf(e); + balancer.drainOpenElements(); throw new TikaException("Error parsing an RTF document", e); + } catch (SAXException e) { + balancer.drainOpenElements(); + throw e; } finally { xhtml.endDocument(); } diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/TextExtractor.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/TextExtractor.java index b4ad6ac544..ec698db49f 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/TextExtractor.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/rtf/TextExtractor.java @@ -473,7 +473,6 @@ final class TextExtractor { } private void extract(PushbackInputStream in) throws IOException, SAXException, TikaException { - while (true) { final int b = in.read(); if (b == -1) { @@ -648,6 +647,16 @@ final class TextExtractor { lazyStartParagraph(); } if (inParagraph || paragraphStack.size() > 0) { + // A HYPERLINK's <a> can be open mid-fldrslt when a \par is + // encountered. Closing </p> while <a> is topmost on the SAX + // stack trips StrictXHTMLValidator -- close </a> first and + // forget the hyperlink state (the paragraph break terminates + // the link visually anyway). + if (hyperlinkAnchorDepth >= 0) { + end("a"); + fieldState = 0; + hyperlinkAnchorDepth = -1; + } if (groupState.italic) { end("i"); groupState.italic = preserveStyles; @@ -1385,6 +1394,13 @@ final class TextExtractor { } } else if (equals("fldrslt") && fieldState == 2) { assert pendingURL != null; + // Temporarily clear fieldState so lazyStartParagraph's endStyles + // actually flushes any pending <b>/<i>. endStyles short-circuits + // when fieldState != 0 to keep style flips inside an already-open + // <a> from leaking; but here we're about to OPEN the <a>, so any + // outer <b>/<i> still on the SAX stack must close first or <p> + // would land on top of <b> and the link's </b> later mismatches. + fieldState = 0; lazyStartParagraph(); AttributesImpl attrs = new AttributesImpl(); attrs.addAttribute(XHTML, "href", "href", "CDATA", pendingURL); @@ -1485,6 +1501,12 @@ final class TextExtractor { embObjHandler.handleCompletedObject(); } catch (TikaException | IOException e) { EmbeddedDocumentUtil.recordException(e, metadata); + } catch (RuntimeException e) { + // POI dispatch on a zero-byte embedded object throws + // EmptyFileException; other malformed embedded payloads + // can surface as a variety of runtime exceptions. Record + // and continue rather than aborting the outer RTF parse. + EmbeddedDocumentUtil.recordException(e, metadata); } groupState.objdata = false; } else if (groupState.pictDepth > 0) { @@ -1511,6 +1533,18 @@ final class TextExtractor { if (groupStates.size() > 0) { // Restore group state: final GroupState outerGroupState = groupStates.removeLast(); + // If we're leaving the fldrslt group that owns the current <a>, + // close </a> BEFORE the style restore runs. Otherwise the + // restore's start("b") would land on top of <a>, and the next + // </a>/<b> would mismatch. Doing this here also flips fieldState + // to 0, which un-gates the style compare below so the outer + // bold/italic context is actually re-emitted. + if (fieldState == 3 && hyperlinkAnchorDepth >= 0 + && outerGroupState.depth < hyperlinkAnchorDepth) { + end("a"); + fieldState = 0; + hyperlinkAnchorDepth = -1; + } //only modify styles if we're not in a hyperlink if (fieldState == 0) { // Close italic, if outer does not have italic or diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLDocxSAXTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLDocxSAXTest.java index 002ddbe3b6..ab10905228 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLDocxSAXTest.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLDocxSAXTest.java @@ -282,6 +282,34 @@ public class OOXMLDocxSAXTest extends TikaTest { assertContains("VednĂ˝ odbor:", r.xml); } + @Test //TIKA-4744 + public void testTableInRunInsideParagraph() throws Exception { + // A <w:tbl> nested deeply inside an outer <w:p>'s run (via + // <mc:AlternateContent>/<w:drawing>/<wps:txbx>/<w:txbxContent>) used + // to leave the run's <b>/<i>/etc on the SAX stack below the new + // <table>. A subsequent paragraph end inside a cell then tried to + // closeFormattingTags() for the outer state, emitting </b> while + // <td> was topmost. startTable now closes pending formatting first, + // mirroring startSDT. + XMLResult r = getXML("testWORD_tableInRunInsideParagraph.docx"); + assertContains("<table>", r.xml); + } + + @Test //TIKA-4744 + public void testFormattingFlipPreservesNestingOrder() throws Exception { + // FormattingTagManager.applyFormatting used to close </s> before </u> + // in the bold-flip and italic-flip branches, but XHTML nesting is + // <b><i><s><u> (u is innermost). A run with bold+strike+underline + // followed by a non-bold run trips the wrong-order close: </s> + // emitted while <u> is topmost, then the catch arm's closeAnyPending + // tries </u> against <s> -- the visible </u> vs <s> the validator + // flagged on three corpus files. + XMLResult r = getXML("testWORD_formattingFlipUnderlineOrder.docx"); + // Just confirm something extracted -- the real check is no validator + // throw, which getXML enforces via StrictXHTMLValidator. + assertContains("<body>", r.xml); + } + @Test public void testDOCXOverrideParagraphNumbering() throws Exception { String xml = getXML("testWORD_override_list_numbering.docx").xml; diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/rtf/RTFParserTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/rtf/RTFParserTest.java index 2c0a91bf9c..1b95235cc9 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/rtf/RTFParserTest.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/rtf/RTFParserTest.java @@ -60,6 +60,22 @@ public class RTFParserTest extends TikaTest { assertContains("indexation Word", content); } + @Test //TIKA-4744 + public void testParInsideHyperlink() throws Exception { + // A \par inside a HYPERLINK's \fldrslt used to leave <a> on the SAX + // stack while endParagraph emitted </p>, tripping the strict + // validator with </p> vs <a>. The exception was masked by the + // finally's xhtml.endDocument() throwing </body> vs <p>; visible + // end-state was just "<p> open at endDocument". Closing pending <a> + // before </p> drops the link span at the paragraph break, which is + // the right XHTML rendering. + XMLResult r = getXML("testRTF_parInsideHyperlink.rtf"); + // First paragraph contains the link text, properly closed. + assertContains("<a href=\"#target\">line1</a>", r.xml); + // Second paragraph picks up the post-\par text without an open <a>. + assertContains("line2", r.xml); + } + @Test //TIKA-4744 public void testNestedHyperlinkPageRef() throws Exception { // A HYPERLINK field with a PAGEREF \field nested inside its \fldrslt diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testRTF_parInsideHyperlink.rtf b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testRTF_parInsideHyperlink.rtf new file mode 100644 index 0000000000..f5b8a139f3 --- /dev/null +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testRTF_parInsideHyperlink.rtf @@ -0,0 +1,9 @@ +{\rtf1\ansi +{\fonttbl{\f0 Arial;}} +\pard {\f0 Before } +{\field {\*\fldinst HYPERLINK "#target" }{\fldrslt +{\f0 line1\par line2} +}} +{\f0 after.} +\par +} diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_formattingFlipUnderlineOrder.docx b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_formattingFlipUnderlineOrder.docx new file mode 100755 index 0000000000..06d4467a9c Binary files /dev/null and b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_formattingFlipUnderlineOrder.docx differ diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_tableInRunInsideParagraph.docx b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_tableInRunInsideParagraph.docx new file mode 100644 index 0000000000..bbdefdd1ff Binary files /dev/null and b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/resources/test-documents/testWORD_tableInRunInsideParagraph.docx differ diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java index 30eae3d8f5..ea86070202 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/FlatOpenDocumentParser.java @@ -38,6 +38,7 @@ import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; import org.apache.tika.sax.ContentHandlerDecorator; import org.apache.tika.sax.EmbeddedContentHandler; +import org.apache.tika.sax.XHTMLBalancingHandler; import org.apache.tika.sax.XHTMLContentHandler; import org.apache.tika.utils.XMLReaderUtils; @@ -100,9 +101,16 @@ public class FlatOpenDocumentParser implements Parser { final XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata, context); xhtml.startDocument(); + // A balancing handler so that if the inner SAX parser aborts mid- + // element (e.g., malformed flat-doc XML -- some corpus FODT files + // omit </text:note-citation>), we can drain pending opens before + // the finally's xhtml.endDocument() fires its </body>/</html>. + // Without the drain, that endDocument throws </body> vs <p>/etc + // and masks the real well-formedness error. + final XHTMLBalancingHandler balancer = new XHTMLBalancingHandler(xhtml); tis.setCloseShield(); try { - ContentHandler fodHandler = getContentHandler(xhtml, metadata, context); + ContentHandler fodHandler = getContentHandler(balancer, metadata, context); XMLReaderUtils.parseSAX(tis, new EmbeddedContentHandler(fodHandler), context); //can only detect subtype (text/pres/sheet) during parse. @@ -111,6 +119,9 @@ public class FlatOpenDocumentParser implements Parser { if (detected != null) { metadata.set(Metadata.CONTENT_TYPE, detected.toString()); } + } catch (SAXException e) { + balancer.drainOpenElements(); + throw e; } finally { tis.removeCloseShield(); xhtml.endDocument(); @@ -144,6 +155,20 @@ public class FlatOpenDocumentParser implements Parser { private final boolean extractMacros; private ContentHandler currentHandler = defaultHandler; private MediaType detectedType = null; + // <office:document> can nest: a flat ODS can embed a full inner + // <office:document> inside <draw:object> (e.g., for an embedded + // chart). Each level has its own <office:meta>/<office:body>/ + // <office:scripts>. We only honour those sections at the OUTER + // document level -- inner ones must stay inside whatever handler + // is already active (so the outer body's <draw:object> content + // keeps emitting through bodyHandler), or the trailing </draw:object> + // and surrounding events get routed to a no-op handler and leave + // <object>/<table> unclosed on the XHTML stream. + private int documentDepth = 0; + // Track outer-section depth so the matching close switches back to + // defaultHandler only when the section actually ends, not on a + // nested-doc occurrence. + private int outerSectionDepth = 0; private FlatOpenDocumentParserHandler(ContentHandler baseHandler, Metadata metadata, ParseContext parseContext, boolean extractMacros) { @@ -169,27 +194,44 @@ public class FlatOpenDocumentParser implements Parser { @Override public void startElement(String namespaceURI, String localName, String qName, Attributes attrs) throws SAXException { - - if (META.equals(localName)) { - currentHandler = metadataHandler; - } else if (BODY.equals(localName)) { - currentHandler = bodyHandler; - } else if (extractMacros && SCRIPTS.equals(localName)) { - currentHandler = macroHandler; - } - - //trust the mimetype element if it exists for the subtype if (DOCUMENT.equals(localName)) { - String mime = XMLReaderUtils.getAttrValue("mimetype", attrs); - if (mime != null) { - if (mime.equals(ODT.toString())) { - detectedType = FLAT_ODT; - } else if (mime.equals(ODP.toString())) { - detectedType = FLAT_ODP; - } else if (mime.equals(ODS.toString())) { - detectedType = FLAT_ODS; + documentDepth++; + //trust the mimetype element if it exists for the subtype. + //Only consult the outer <office:document>; inner ones (e.g., + //an embedded chart's document) would otherwise overwrite the + //container's detected subtype. + if (documentDepth == 1) { + String mime = XMLReaderUtils.getAttrValue("mimetype", attrs); + if (mime != null) { + if (mime.equals(ODT.toString())) { + detectedType = FLAT_ODT; + } else if (mime.equals(ODP.toString())) { + detectedType = FLAT_ODP; + } else if (mime.equals(ODS.toString())) { + detectedType = FLAT_ODS; + } } } + } else if (documentDepth == 1 && outerSectionDepth == 0) { + // Only outermost-level META/BODY/SCRIPTS triggers a handler + // switch. Inner-document occurrences are forwarded to whichever + // outer section's handler is already active. + if (META.equals(localName)) { + currentHandler = metadataHandler; + outerSectionDepth = 1; + } else if (BODY.equals(localName)) { + currentHandler = bodyHandler; + outerSectionDepth = 1; + } else if (extractMacros && SCRIPTS.equals(localName)) { + currentHandler = macroHandler; + outerSectionDepth = 1; + } + } else if (outerSectionDepth > 0 + && (META.equals(localName) || BODY.equals(localName) + || SCRIPTS.equals(localName))) { + // Track nested occurrences so the matching end doesn't + // prematurely flip currentHandler back to defaultHandler. + outerSectionDepth++; } currentHandler.startElement(namespaceURI, localName, qName, attrs); } @@ -202,14 +244,20 @@ public class FlatOpenDocumentParser implements Parser { @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { - if (META.equals(localName)) { - currentHandler = defaultHandler; - } else if (BODY.equals(localName)) { - currentHandler = defaultHandler; - } else if (extractMacros && SCRIPTS.equals(localName)) { - currentHandler = defaultHandler; - } + // Forward the end event to the still-active handler BEFORE we + // consider switching back. Otherwise the </office:body> close + // itself would land on defaultHandler. currentHandler.endElement(namespaceURI, localName, qName); + if (DOCUMENT.equals(localName)) { + documentDepth--; + } else if (outerSectionDepth > 0 + && (META.equals(localName) || BODY.equals(localName) + || (extractMacros && SCRIPTS.equals(localName)))) { + outerSectionDepth--; + if (outerSectionDepth == 0) { + currentHandler = defaultHandler; + } + } } } } diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentBodyHandler.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentBodyHandler.java index 60c1457d68..8c121db125 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentBodyHandler.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/main/java/org/apache/tika/parser/odf/OpenDocumentBodyHandler.java @@ -362,7 +362,7 @@ class OpenDocumentBodyHandler extends ElementMappingContentHandler { * branch where this check is used. */ private static boolean closeStylesBeforeOpen(String uri, String localName) { - if (DRAW_NS.equals(uri) && "text-box".equals(localName)) { + if (DRAW_NS.equals(uri) && ("text-box".equals(localName) || "object".equals(localName))) { return true; } if (TABLE_NS.equals(uri) && @@ -406,6 +406,11 @@ class OpenDocumentBodyHandler extends ElementMappingContentHandler { throws SAXException { if (DRAW_NS.equals(namespaceURI) && "image".equals(localName)) { + // Close any pending inline styles (e.g., a <b> opened lazily by a + // prior <text:span>) before emitting the <img> -- without this + // the <img> lands inside <b>, the styles are never flushed, and + // <b> reaches endDocument unbalanced. + closeStyleTags(); String link = attrs.getValue(XLINK_NS, "href"); AttributesImpl attr = new AttributesImpl(); if (!StringUtils.isEmpty(link)) { diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/java/org/apache/tika/parser/odf/ODFParserTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/java/org/apache/tika/parser/odf/ODFParserTest.java index bedcc038c2..66df1ed41f 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/java/org/apache/tika/parser/odf/ODFParserTest.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/java/org/apache/tika/parser/odf/ODFParserTest.java @@ -365,6 +365,21 @@ public class ODFParserTest extends TikaTest { xml); } + @Test //TIKA-4744 + public void testFlatFodsEmbeddedChart() throws Exception { + // A flat ODS can embed a chart as a nested <office:document> inside + // <draw:object>. The dispatch handler in FlatOpenDocumentParser used + // to flip back to defaultHandler when the inner document's + // <office:meta>/<office:body> closed, sending the trailing + // </draw:object> / </table> / </office:body> to a no-op handler -- + // <object>/<table> stayed open and the strict validator caught it. + // getXML wraps in StrictXHTMLValidator, so an imbalance throws here. + XMLResult r = getXML("testFODS_embeddedChart.fods"); + // The outer <object> wrapper should close cleanly. + assertContains("<object>", r.xml); + assertContains("</object>", r.xml); + } + @Test //TIKA-4744 public void testSvgTitleInStyledSpan() throws Exception { // Empty <svg:title/>/<svg:desc/> inside a <draw:connector> or diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/resources/test-documents/testFODS_embeddedChart.fods b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/resources/test-documents/testFODS_embeddedChart.fods new file mode 100644 index 0000000000..68b3fd6fa9 --- /dev/null +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/src/test/resources/test-documents/testFODS_embeddedChart.fods @@ -0,0 +1,547 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns: [...] + <office:meta><meta:creation-date>2014-10-22T14:37:30.263776144</meta:creation-date><dc:date>2014-10-22T15:04:07.755937395</dc:date><meta:editing-duration>PT10M34S</meta:editing-duration><meta:editing-cycles>5</meta:editing-cycles><meta:generator>LibreOffice/4.3.1.2$Linux_x86 LibreOffice_project/958349dc3b25111dbca392fbc281a05559ef6848</meta:generator><meta:document-statistic meta:table-count="2" meta:cell-count="2" meta:object-count="1"/></office:meta> + <office:settings> + <config:config-item-set config:name="ooo:view-settings"> + <config:config-item config:name="VisibleAreaTop" config:type="int">2257</config:config-item> + <config:config-item config:name="VisibleAreaLeft" config:type="int">2257</config:config-item> + <config:config-item config:name="VisibleAreaWidth" config:type="int">18062</config:config-item> + <config:config-item config:name="VisibleAreaHeight" config:type="int">9031</config:config-item> + <config:config-item-map-indexed config:name="Views"> + <config:config-item-map-entry> + <config:config-item config:name="ViewId" config:type="string">view1</config:config-item> + <config:config-item-map-named config:name="Tables"> + <config:config-item-map-entry config:name="Sheet1"> + <config:config-item config:name="CursorPositionX" config:type="int">0</config:config-item> + <config:config-item config:name="CursorPositionY" config:type="int">0</config:config-item> + <config:config-item config:name="HorizontalSplitMode" config:type="short">0</config:config-item> + <config:config-item config:name="VerticalSplitMode" config:type="short">0</config:config-item> + <config:config-item config:name="HorizontalSplitPosition" config:type="int">0</config:config-item> + <config:config-item config:name="VerticalSplitPosition" config:type="int">0</config:config-item> + <config:config-item config:name="ActiveSplitRange" config:type="short">2</config:config-item> + <config:config-item config:name="PositionLeft" config:type="int">0</config:config-item> + <config:config-item config:name="PositionRight" config:type="int">0</config:config-item> + <config:config-item config:name="PositionTop" config:type="int">0</config:config-item> + <config:config-item config:name="PositionBottom" config:type="int">0</config:config-item> + <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> + <config:config-item config:name="ZoomValue" config:type="int">88</config:config-item> + <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item> + <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> + </config:config-item-map-entry> + <config:config-item-map-entry config:name="Sheet2"> + <config:config-item config:name="CursorPositionX" config:type="int">16</config:config-item> + <config:config-item config:name="CursorPositionY" config:type="int">2</config:config-item> + <config:config-item config:name="HorizontalSplitMode" config:type="short">0</config:config-item> + <config:config-item config:name="VerticalSplitMode" config:type="short">0</config:config-item> + <config:config-item config:name="HorizontalSplitPosition" config:type="int">0</config:config-item> + <config:config-item config:name="VerticalSplitPosition" config:type="int">0</config:config-item> + <config:config-item config:name="ActiveSplitRange" config:type="short">2</config:config-item> + <config:config-item config:name="PositionLeft" config:type="int">0</config:config-item> + <config:config-item config:name="PositionRight" config:type="int">0</config:config-item> + <config:config-item config:name="PositionTop" config:type="int">0</config:config-item> + <config:config-item config:name="PositionBottom" config:type="int">0</config:config-item> + <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> + <config:config-item config:name="ZoomValue" config:type="int">88</config:config-item> + <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item> + <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> + </config:config-item-map-entry> + </config:config-item-map-named> + <config:config-item config:name="ActiveTable" config:type="string">Sheet2</config:config-item> + <config:config-item config:name="HorizontalScrollbarWidth" config:type="int">270</config:config-item> + <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> + <config:config-item config:name="ZoomValue" config:type="int">88</config:config-item> + <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item> + <config:config-item config:name="ShowPageBreakPreview" config:type="boolean">false</config:config-item> + <config:config-item config:name="ShowZeroValues" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowNotes" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> + <config:config-item config:name="GridColor" config:type="long">12632256</config:config-item> + <config:config-item config:name="ShowPageBreaks" config:type="boolean">true</config:config-item> + <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item> + <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsSnapToRaster" config:type="boolean">false</config:config-item> + <config:config-item config:name="RasterIsVisible" config:type="boolean">false</config:config-item> + <config:config-item config:name="RasterResolutionX" config:type="int">1000</config:config-item> + <config:config-item config:name="RasterResolutionY" config:type="int">1000</config:config-item> + <config:config-item config:name="RasterSubdivisionX" config:type="int">1</config:config-item> + <config:config-item config:name="RasterSubdivisionY" config:type="int">1</config:config-item> + <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item> + </config:config-item-map-entry> + </config:config-item-map-indexed> + </config:config-item-set> + <config:config-item-set config:name="ooo:configuration-settings"> + <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> + <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> + <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsDocumentShared" config:type="boolean">false</config:config-item> + <config:config-item config:name="AutoCalculate" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrinterSetup" config:type="base64Binary">lQH+/0Vwc29uLVN0eWx1cy1TWDIzNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1VQUzpFcHNvbi1TdHlsdXMtU1gyMzUAAAAAAAAAAAAWAAMAtwAAAAAAAAAEAAhSAAAEdAAASm9iRGF0YSAxCnByaW50ZXI9RXBzb24tU3R5bHVzLVNYMjM1Cm9yaWVudGF0aW9uPVBvcnRyYWl0CmNvcGllcz0xCmNvbGxhdGU9ZmFsc2UKbWFyZ2luZGFqdXN0bWVudD0wLDAsMCwwCmNvbG9yZGVwdGg9MjQKcHNsZXZ [...] + <config:config-item config:name="RasterIsVisible" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterName" config:type="string">Epson-Stylus-SX235</config:config-item> + <config:config-item config:name="RasterResolutionY" config:type="int">1000</config:config-item> + <config:config-item config:name="IsRasterAxisSynchronized" config:type="boolean">true</config:config-item> + <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> + <config:config-item config:name="RasterResolutionX" config:type="int">1000</config:config-item> + <config:config-item config:name="IsSnapToRaster" config:type="boolean">false</config:config-item> + <config:config-item config:name="HasColumnRowHeaders" config:type="boolean">true</config:config-item> + <config:config-item config:name="RasterSubdivisionX" config:type="int">1</config:config-item> + <config:config-item config:name="GridColor" config:type="long">12632256</config:config-item> + <config:config-item config:name="ShowZeroValues" config:type="boolean">true</config:config-item> + <config:config-item config:name="RasterSubdivisionY" config:type="int">1</config:config-item> + <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> + <config:config-item config:name="LinkUpdateMode" config:type="short">3</config:config-item> + <config:config-item config:name="IsOutlineSymbolsSet" config:type="boolean">true</config:config-item> + <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowGrid" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowPageBreaks" config:type="boolean">true</config:config-item> + <config:config-item config:name="HasSheetTabs" config:type="boolean">true</config:config-item> + <config:config-item config:name="ShowNotes" config:type="boolean">true</config:config-item> + </config:config-item-set> + </office:settings> + <office:scripts> + <office:script script:language="ooo:Basic"> + <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink"> + <ooo:library-embedded ooo:name="Standard"/> + </ooo:libraries> + </office:script> + </office:scripts> + <office:font-face-decls> + <style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/> + <style:font-face style:name="DejaVu Sans" svg:font-family="'DejaVu Sans'" style:font-family-generic="system" style:font-pitch="variable"/> + <style:font-face style:name="FreeSans" svg:font-family="FreeSans" style:font-family-generic="system" style:font-pitch="variable"/> + <style:font-face style:name="WenQuanYi Micro Hei" svg:font-family="'WenQuanYi Micro Hei'" style:font-family-generic="system" style:font-pitch="variable"/> + </office:font-face-decls> + <office:styles> + <style:default-style style:family="table-cell"> + <style:paragraph-properties style:tab-stop-distance="0.4921in"/> + <style:text-properties style:font-name="Liberation Sans" fo:language="en" fo:country="US" style:font-name-asian="DejaVu Sans" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="DejaVu Sans" style:language-complex="hi" style:country-complex="IN"/> + </style:default-style> + <style:default-style style:family="graphic"> + <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in"/> + <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="page" style:font-independent-line-spacing="false"> + <style:tab-stops/> + </style:paragraph-properties> + <style:text-properties style:use-window-font-color="true" fo:font-family="'Liberation Serif'" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="DejaVu Sans" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="DejaVu Sans" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/> + </style:default-style> + <number:number-style style:name="N0"> + <number:number number:min-integer-digits="1"/> + </number:number-style> + <number:currency-style style:name="N121P0" style:volatile="true"> + <number:number number:decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <number:text> </number:text> + <number:currency-symbol number:language="hu" number:country="HU">Ft</number:currency-symbol> + </number:currency-style> + <number:currency-style style:name="N121"> + <style:text-properties fo:color="#ff0000"/> + <number:text>-</number:text> + <number:number number:decimal-places="2" number:min-integer-digits="1" number:grouping="true"/> + <number:text> </number:text> + <number:currency-symbol number:language="hu" number:country="HU">Ft</number:currency-symbol> + <style:map style:condition="value()>=0" style:apply-style-name="N121P0"/> + </number:currency-style> + <style:style style:name="Default" style:family="table-cell"> + <style:text-properties style:font-name-asian="WenQuanYi Micro Hei" style:font-family-asian="'WenQuanYi Micro Hei'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable"/> + </style:style> + <style:style style:name="Result" style:family="table-cell" style:parent-style-name="Default"> + <style:text-properties fo:font-style="italic" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="bold"/> + </style:style> + <style:style style:name="Result2" style:family="table-cell" style:parent-style-name="Result" style:data-style-name="N121"/> + <style:style style:name="Heading" style:family="table-cell" style:parent-style-name="Default"> + <style:table-cell-properties style:text-align-source="fix" style:repeat-content="false"/> + <style:paragraph-properties fo:text-align="center"/> + <style:text-properties fo:font-size="16pt" fo:font-style="italic" fo:font-weight="bold"/> + </style:style> + <style:style style:name="Heading1" style:family="table-cell" style:parent-style-name="Heading"> + <style:table-cell-properties style:rotation-angle="90"/> + </style:style> + </office:styles> + <office:automatic-styles> + <style:style style:name="co1" style:family="table-column"> + <style:table-column-properties fo:break-before="auto" style:column-width="0.889in"/> + </style:style> + <style:style style:name="ro1" style:family="table-row"> + <style:table-row-properties style:row-height="0.178in" fo:break-before="auto" style:use-optimal-row-height="true"/> + </style:style> + <style:style style:name="ta1" style:family="table" style:master-page-name="Default"> + <style:table-properties table:display="true" style:writing-mode="lr-tb"/> + </style:style> + <style:style style:name="gr1" style:family="graphic"> + <style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-horizontal-align="center" draw:textarea-vertical-align="middle" draw:ole-draw-aspect="1"/> + </style:style> + <style:page-layout style:name="pm1"> + <style:page-layout-properties style:writing-mode="lr-tb"/> + <style:header-style> + <style:header-footer-properties fo:min-height="0.2953in" fo:margin-left="0in" fo:margin-right="0in" fo:margin-bottom="0.0984in"/> + </style:header-style> + <style:footer-style> + <style:header-footer-properties fo:min-height="0.2953in" fo:margin-left="0in" fo:margin-right="0in" fo:margin-top="0.0984in"/> + </style:footer-style> + </style:page-layout> + <style:page-layout style:name="pm2"> + <style:page-layout-properties style:writing-mode="lr-tb"/> + <style:header-style> + <style:header-footer-properties fo:min-height="0.2953in" fo:margin-left="0in" fo:margin-right="0in" fo:margin-bottom="0.0984in" fo:border="2.49pt solid #000000" fo:padding="0.0071in" fo:background-color="#c0c0c0"> + <style:background-image/> + </style:header-footer-properties> + </style:header-style> + <style:footer-style> + <style:header-footer-properties fo:min-height="0.2953in" fo:margin-left="0in" fo:margin-right="0in" fo:margin-top="0.0984in" fo:border="2.49pt solid #000000" fo:padding="0.0071in" fo:background-color="#c0c0c0"> + <style:background-image/> + </style:header-footer-properties> + </style:footer-style> + </style:page-layout> + <style:style style:name="P1" style:family="paragraph"> + <style:paragraph-properties fo:text-align="center"/> + </style:style> + </office:automatic-styles> + <office:master-styles> + <style:master-page style:name="Default" style:page-layout-name="pm1"> + <style:header> + <text:p><text:sheet-name>???</text:sheet-name></text:p> + </style:header> + <style:header-left style:display="false"/> + <style:footer> + <text:p>Oldal <text:page-number>1</text:page-number></text:p> + </style:footer> + <style:footer-left style:display="false"/> + </style:master-page> + <style:master-page style:name="Report" style:page-layout-name="pm2"> + <style:header> + <style:region-left> + <text:p><text:sheet-name>???</text:sheet-name> (<text:title>???</text:title>)</text:p> + </style:region-left> + <style:region-right> + <text:p><text:date style:data-style-name="N2" text:date-value="2014-10-22">00/00/0000</text:date>, <text:time style:data-style-name="N2" text:time-value="15:03:18.803538570">00:00:00</text:time></text:p> + </style:region-right> + </style:header> + <style:header-left style:display="false"/> + <style:footer> + <text:p>Oldal <text:page-number>1</text:page-number> / <text:page-count>99</text:page-count></text:p> + </style:footer> + <style:footer-left style:display="false"/> + </style:master-page> + </office:master-styles> + <office:body> + <office:spreadsheet> + <table:table table:name="Sheet2" table:style-name="ta1"> + <table:shapes> + <draw:frame draw:z-index="0" draw:style-name="gr1" draw:text-style-name="P1" svg:width="6.2988in" svg:height="3.5429in" svg:x="0.8894in" svg:y="0.8894in"> + <draw:object draw:notify-on-update-of-ranges="Sheet1.A1:Sheet1.A1 Sheet1.A2:Sheet1.A2"> + <office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" [...] + <office:meta><meta:generator>LibreOffice/4.3.1.2$Linux_x86 LibreOffice_project/958349dc3b25111dbca392fbc281a05559ef6848</meta:generator></office:meta> + <office:styles/> + <office:automatic-styles> + <number:number-style style:name="N0"> + <number:number number:min-integer-digits="1"/> + </number:number-style> + <style:style style:name="ch1" style:family="chart"> + <style:graphic-properties draw:stroke="none"/> + </style:style> + <style:style style:name="ch2" style:family="chart"> + <style:chart-properties chart:auto-position="true"/> + <style:graphic-properties draw:stroke="none" svg:stroke-color="#b3b3b3" draw:fill="none" draw:fill-color="#e6e6e6"/> + <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/> + </style:style> + <style:style style:name="ch3" style:family="chart"> + <style:chart-properties chart:include-hidden-cells="false" chart:auto-position="true" chart:auto-size="true" chart:treat-empty-cells="leave-gap" chart:right-angled-axes="true"/> + </style:style> + <style:style style:name="ch4" style:family="chart" style:data-style-name="N0"> + <style:chart-properties chart:display-label="true" chart:logarithmic="false" chart:reverse-direction="false" text:line-break="false" chart:link-data-style-to-source="true" chart:axis-position="0"/> + <style:graphic-properties svg:stroke-color="#b3b3b3"/> + <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/> + </style:style> + <style:style style:name="ch5" style:family="chart" style:data-style-name="N0"> + <style:chart-properties chart:display-label="true" chart:logarithmic="false" chart:reverse-direction="false" text:line-break="false" chart:link-data-style-to-source="true" chart:axis-position="0"/> + <style:graphic-properties svg:stroke-color="#b3b3b3"/> + <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/> + </style:style> + <style:style style:name="ch6" style:family="chart"> + <style:graphic-properties svg:stroke-color="#b3b3b3"/> + </style:style> + <style:style style:name="ch7" style:family="chart" style:data-style-name="N0"> + <style:chart-properties chart:link-data-style-to-source="true"/> + <style:graphic-properties draw:stroke="none" draw:fill-color="#004586" dr3d:edge-rounding="5%"/> + <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/> + </style:style> + <style:style style:name="ch8" style:family="chart"> + <style:graphic-properties draw:stroke="solid" svg:stroke-color="#b3b3b3" draw:fill="none" draw:fill-color="#e6e6e6"/> + </style:style> + <style:style style:name="ch9" style:family="chart"> + <style:graphic-properties svg:stroke-color="#b3b3b3" draw:fill-color="#cccccc"/> + </style:style> + </office:automatic-styles> + <office:body> + <office:chart> + <chart:chart svg:width="16cm" svg:height="9cm" xlink:href=".." xlink:type="simple" chart:class="chart:bar" chart:style-name="ch1"> + <chart:legend chart:legend-position="end" svg:x="15.006cm" svg:y="4.201cm" style:legend-expansion="high" chart:style-name="ch2"/> + <chart:plot-area chart:style-name="ch3" table:cell-range-address="Sheet1.A1:Sheet1.A2" chart:data-source-has-labels="row" svg:x="0.32cm" svg:y="0.18cm" svg:width="14.367cm" svg:height="8.64cm"> + <chartooo:coordinate-region svg:x="1.047cm" svg:y="0.38cm" svg:width="13.64cm" svg:height="8.241cm"/> + <chart:axis chart:dimension="x" chart:name="primary-x" chart:style-name="ch4"/> + <chart:axis chart:dimension="y" chart:name="primary-y" chart:style-name="ch5"> + <chart:grid chart:style-name="ch6" chart:class="major"/> + </chart:axis> + <chart:series chart:style-name="ch7" chart:values-cell-range-address="Sheet1.A2:Sheet1.A2" chart:label-cell-address="Sheet1.A1:Sheet1.A1" chart:class="chart:bar"> + <chart:data-point/> + </chart:series> + <chart:wall chart:style-name="ch8"/> + <chart:floor chart:style-name="ch9"/> + </chart:plot-area> + <table:table table:name="local-table"> + <table:table-header-columns> + <table:table-column/> + </table:table-header-columns> + <table:table-columns> + <table:table-column/> + </table:table-columns> + <table:table-header-rows> + <table:table-row> + <table:table-cell> + <text:p/> + </table:table-cell> + <table:table-cell office:value-type="string"> + <text:p>A</text:p> + <draw:g> + <svg:desc>Sheet1.A1:Sheet1.A1</svg:desc></draw:g> + </table:table-cell> + </table:table-row> + </table:table-header-rows> + <table:table-rows> + <table:table-row> + <table:table-cell office:value-type="string"/> + <table:table-cell office:value-type="float" office:value="1"> + <text:p>1</text:p> + <draw:g> + <svg:desc>Sheet1.A2:Sheet1.A2</svg:desc></draw:g> + </table:table-cell> + </table:table-row> + </table:table-rows> + </table:table> + </chart:chart> + </office:chart> + </office:body> + </office:document> + </draw:object><draw:image> + <office:binary-data>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 + SU5UU0hBUEVfQkVHSU4AAAAAAAAAAIoAAQBBAAAAAwA7AAAADwBMaWJlcmF0aW9uIFNhbnMA + AAAAAABhAQAA//8AAAIABQAAAAAAAAAJBAAAAAAAAAAAAP8DAAAAAACIAAEAAgAAAAEAhwAB + AAUAAAD/////AIYAAQAEAAAAAAAAAHEAAgAuAAAAQQEAAGoXAAADAAAAMAAuADQAAAADAAMA + AAC5AAAAIwEAANwBAAADADAALgA0AAACAQATAAAACQBYVEVYVF9FT0MAAAAAAAAAAAACAQAT + AAAACQBYVEVYVF9FT0MBAAAAAAAAAAACAQATAAAACQBYVEVYVF9FT0MCAAAAAAAAAAACAQAT + AAAACQBYVEVYVF9FT0wAAAAAAAAAAAACAQATAAAACQBYVEVYVF9FT1AAAAAAAAAAAAACAQAe + AAAAFABYVEVYVF9QQUlOVFNIQVBFX0VORAAAAAAAAAAAAAIBACAAAAAWAFhURVhUX1BBSU5U + U0hBUEVfQkVHSU4AAAAAAAAAAIoAAQBBAAAAAwA7AAAADwBMaWJlcmF0aW9uIFNhbnMAAAAA + AABhAQAA//8AAAIABQAAAAAAAAAJBAAAAAAAAAAAAP8DAAAAAACIAAEAAgAAAAEAhwABAAUA + AAD/////AIYAAQAEAAAAAAAAAHEAAgAuAAAAQQEAAAwSAAADAAAAMAAuADYAAAADAAMAAAC5 + AAAAIwEAANwBAAADADAALgA2AAACAQATAAAACQBYVEVYVF9FT0MAAAAAAAAAAAACAQATAAAA + CQBYVEVYVF9FT0MBAAAAAAAAAAACAQATAAAACQBYVEVYVF9FT0MCAAAAAAAAAAACAQATAAAA + CQBYVEVYVF9FT0wAAAAAAAAAAAACAQATAAAACQBYVEVYVF9FT1AAAAAAAAAAAAACAQAeAAAA + FABYVEVYVF9QQUlOVFNIQVBFX0VORAAAAAAAAAAAAAIBACAAAAAWAFhURVhUX1BBSU5UU0hB + UEVfQkVHSU4AAAAAAAAAAIoAAQBBAAAAAwA7AAAADwBMaWJlcmF0aW9uIFNhbnMAAAAAAABh + AQAA//8AAAIABQAAAAAAAAAJBAAAAAAAAAAAAP8DAAAAAACIAAEAAgAAAAEAhwABAAUAAAD/ + ////AIYAAQAEAAAAAAAAAHEAAgAuAAAAQQEAAK8MAAADAAAAMAAuADgAAAADAAMAAAC5AAAA + IwEAANwBAAADADAALgA4AAACAQATAAAACQBYVEVYVF9FT0MAAAAAAAAAAAACAQATAAAACQBY + VEVYVF9FT0MBAAAAAAAAAAACAQATAAAACQBYVEVYVF9FT0MCAAAAAAAAAAACAQATAAAACQBY + VEVYVF9FT0wAAAAAAAAAAAACAQATAAAACQBYVEVYVF9FT1AAAAAAAAAAAAACAQAeAAAAFABY + VEVYVF9QQUlOVFNIQVBFX0VORAAAAAAAAAAAAAIBACAAAAAWAFhURVhUX1BBSU5UU0hBUEVf + QkVHSU4AAAAAAAAAAIoAAQBBAAAAAwA7AAAADwBMaWJlcmF0aW9uIFNhbnMAAAAAAABhAQAA + //8AAAIABQAAAAAAAAAJBAAAAAAAAAAAAP8DAAAAAACIAAEAAgAAAAEAhwABAAUAAAD///// + AIYAAQAEAAAAAAAAAHEAAgAeAAAAZAIAAFEHAAABAAAAMQAAAAEAAQAAALkAAAABADEAAAIB + ABMAAAAJAFhURVhUX0VPQwAAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VPTAAAAAAAAAAAAAIB + ABMAAAAJAFhURVhUX0VPUAAAAAAAAAAAAAIBAB4AAAAUAFhURVhUX1BBSU5UU0hBUEVfRU5E + AAAAAAAAAAAAAgEAIAAAABYAWFRFWFRfUEFJTlRTSEFQRV9CRUdJTgAAAAAAAAAAigABAEEA + AAADADsAAAAPAExpYmVyYXRpb24gU2FucwAAAAAAAGEBAAD//wAAAgAFAAAAAAAAAAkEAAAA + AAAAAAAA/wMAAAAAAIgAAQACAAAAAQCHAAEABQAAAP////8AhgABAAQAAAAAAAAAcQACAC4A + AABBAQAA8wEAAAMAAAAxAC4AMgAAAAMAAwAAALkAAAAjAQAA3AEAAAMAMQAuADIAAAIBABMA + AAAJAFhURVhUX0VPQwAAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VPQwEAAAAAAAAAAAIBABMA + AAAJAFhURVhUX0VPQwIAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VPTAAAAAAAAAAAAAIBABMA + AAAJAFhURVhUX0VPUAAAAAAAAAAAAAIBAB4AAAAUAFhURVhUX1BBSU5UU0hBUEVfRU5EAAAA + AAAAAACFAAEABQAAAIZFAAABhAABAAUAAAAAAAAAAG8AAgA2AAAAAQAGAHw7AAD9EQAAEjsA + AP0RAAASOwAAKhEAAOU7AAAqEQAA5TsAAP0RAAB8OwAA/REAAAAAAAIBACAAAAAWAFhURVhU + X1BBSU5UU0hBUEVfQkVHSU4AAAAAAAAAAIoAAQBBAAAAAwA7AAAADwBMaWJlcmF0aW9uIFNh + bnMAAAAAAABhAQAA//8AAAIABQAAAAAAAAAJBAAAAAAAAAAAAP8DAAAAAACIAAEAAgAAAAEA + hwABAAUAAAD/////AIYAAQAEAAAAAAAAAHEAAgAeAAAASTwAAAsSAAABAAAAQQAAAAEAAQAA + AO4AAAABAEEAAAIBABMAAAAJAFhURVhUX0VPQwAAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VP + TAAAAAAAAAAAAAIBABMAAAAJAFhURVhUX0VPUAAAAAAAAAAAAAIBAB4AAAAUAFhURVhUX1BB + SU5UU0hBUEVfRU5EAAAAAAAAAACMAAEAAAAAAIsAAQACAAAAIACCAAEAIQAAAAIAGwAAAAIA + AgAAAAAAAAAnIwAAAQAAAAAAfz4AAAIAAIwAAQAAAAAAjAABAAAAAAA= + </office:binary-data> + </draw:image> + </draw:frame></table:shapes> + <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/> + <table:table-row table:style-name="ro1"> + <table:table-cell/> + </table:table-row> + </table:table> + <table:table table:name="Sheet1" table:style-name="ta1"> + <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/> + <table:table-row table:style-name="ro1"> + <table:table-cell office:value-type="string" calcext:value-type="string"> + <text:p>A</text:p> + </table:table-cell> + </table:table-row> + <table:table-row table:style-name="ro1"> + <table:table-cell office:value-type="float" office:value="1" calcext:value-type="float"> + <text:p>1</text:p> + </table:table-cell> + </table:table-row> + </table:table> + <table:named-expressions/> + </office:spreadsheet> + </office:body> +</office:document> \ No newline at end of file
