You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2023/11/17 20:41:17 UTC
(tika) branch branch_2x updated: TIKA-4171 (#1460)
This is an automated email from the ASF dual-hosted git repository.
tallison pushed a commit to branch branch_2x
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/branch_2x by this push:
new d24c0b3d3 TIKA-4171 (#1460)
new b0a0423ff Merge remote-tracking branch 'origin/branch_2x' into branch_2x
d24c0b3d3 is described below
commit d24c0b3d3e11e543fadd7723118f07d42b31a0d6
Author: Tim Allison <ta...@apache.org>
AuthorDate: Fri Nov 17 15:40:23 2023 -0500
TIKA-4171 (#1460)
* TIKA-4171 -- allow multiple values for a given form key in XFA
(cherry picked from commit 4684912a9e3cc15c02a7654f4e6f8f65003cf510)
---
.../org/apache/tika/parser/pdf/XFAExtractor.java | 36 ++++++++++++----------
.../org/apache/tika/parser/pdf/PDFParserTest.java | 9 ++++++
2 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/XFAExtractor.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/XFAExtractor.java
index 58e4bcd38..14bb07b1d 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/XFAExtractor.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/main/java/org/apache/tika/parser/pdf/XFAExtractor.java
@@ -17,7 +17,6 @@
package org.apache.tika.parser.pdf;
import java.io.InputStream;
-import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
@@ -76,7 +75,9 @@ class XFAExtractor {
throws XMLStreamException, SAXException {
xhtml.startElement("div", "class", "xfa_content");
- Map<String, String> pdfObjRToValues = new HashMap<>();
+ //TODO - replace this with multivalued map? This isn't
+ //actually metadata, just a handy data structure.
+ Metadata pdfObjRToValues = new Metadata();
//for now, store and dump the fields in insertion order
Map<String, XFAField> namedFields = new LinkedHashMap<>();
@@ -118,23 +119,24 @@ class XFAExtractor {
for (Map.Entry<String, XFAField> e : namedFields.entrySet()) {
String fieldName = e.getKey();
XFAField field = e.getValue();
- String fieldValue = pdfObjRToValues.get(fieldName);
- AttributesImpl attrs = new AttributesImpl();
- attrs.addAttribute("", "fieldName", "fieldName", "CDATA", fieldName);
-
String displayFieldName =
(field.toolTip == null || field.toolTip.trim().length() == 0) ? fieldName :
field.toolTip;
-
- sb.append(displayFieldName).append(": ");
- if (fieldValue != null) {
- sb.append(fieldValue);
+ String[] fieldValues = pdfObjRToValues.getValues(fieldName);
+ for (String fieldValue : fieldValues) {
+ AttributesImpl attrs = new AttributesImpl();
+ attrs.addAttribute("", "fieldName", "fieldName", "CDATA", fieldName);
+
+ sb.append(displayFieldName).append(": ");
+ if (fieldValue != null) {
+ sb.append(fieldValue);
+ }
+
+ xhtml.startElement("li", attrs);
+ xhtml.characters(sb.toString());
+ xhtml.endElement("li");
+ sb.setLength(0);
}
-
- xhtml.startElement("li", attrs);
- xhtml.characters(sb.toString());
- xhtml.endElement("li");
- sb.setLength(0);
}
xhtml.endElement("ol");
xhtml.endElement("div");
@@ -211,7 +213,7 @@ class XFAExtractor {
return buffer.toString();
}
- private void loadData(XMLStreamReader reader, Map<String, String> pdfObjRToValues)
+ private void loadData(XMLStreamReader reader, Metadata pdfObjRToValues)
throws XMLStreamException {
//reader is at the "xfa:data" element
//scrape the contents from the text containing nodes
@@ -235,7 +237,7 @@ class XFAExtractor {
case (XMLStreamConstants.END_ELEMENT):
if (buffer.length() > 0) {
String localName = reader.getLocalName();
- pdfObjRToValues.put(localName, buffer.toString());
+ pdfObjRToValues.add(localName, buffer.toString());
buffer.setLength(0);
}
if (XFA_DATA.equals(reader.getName())) {
diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
index 7a059a22e..6e9167f37 100644
--- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
+++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pdf-module/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
@@ -978,6 +978,15 @@ public class PDFParserTest extends TikaTest {
assertContains("Mount Rushmore National Memorial", r.xml);
//contains xfa fields and data
assertContains("<li fieldName=\"School_Name\">School Name: my_school</li>", r.xml);
+ //This file does not have multiple values for a given key.
+ //It is not actually a useful test for TIKA-4171. We should
+ //find a small example test file and run something like this.
+ Matcher matcher = Pattern.compile("<li fieldName=").matcher(r.xml);
+ int listItems = 0;
+ while (matcher.find()) {
+ listItems++;
+ }
+ assertEquals(24, listItems);
}
@Test