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