svn commit: r1884353 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

2020-12-12 Thread lehmi
Author: lehmi
Date: Sat Dec 12 11:50:48 2020
New Revision: 1884353

URL: http://svn.apache.org/viewvc?rev=1884353&view=rev
Log:
PDFBOX-4952: don't write references of compressed objects to xref tables

Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java?rev=1884353&r1=1884352&r2=1884353&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java 
(original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java 
Sat Dec 12 11:50:48 2020
@@ -40,6 +40,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
@@ -831,8 +832,12 @@ public class COSWriter implements ICOSVi
 {
 addXRefEntry(FreeXReference.NULL_ENTRY);
 
+// Filter for NormalXReferences
 // sort xref, needed only if object keys not regenerated
-Collections.sort(getXRefEntries());
+List normalXReferences = getXRefEntries().stream() //
+.filter(e -> e instanceof NormalXReference) //
+.sorted() //
+.collect(Collectors.toList());
 
 // remember the position where x ref was written
 setStartxref(getStandardOutput().getPos());
@@ -842,7 +847,7 @@ public class COSWriter implements ICOSVi
 // write start object number and object count for this x ref section
 // we assume starting from scratch
 
-Long[] xRefRanges = getXRefRanges(getXRefEntries());
+Long[] xRefRanges = getXRefRanges(normalXReferences);
 int xRefLength = xRefRanges.length;
 int x = 0;
 int j = 0;
@@ -852,7 +857,7 @@ public class COSWriter implements ICOSVi
 
 for (int i = 0; i < xRefRanges[x + 1]; ++i)
 {
-writeXrefEntry(xRefEntries.get(j++));
+writeXrefEntry(normalXReferences.get(j++));
 }
 x += 2;
 }




svn commit: r1884357 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java

2020-12-12 Thread tilman
Author: tilman
Date: Sat Dec 12 16:56:08 2020
New Revision: 1884357

URL: http://svn.apache.org/viewvc?rev=1884357&view=rev
Log:
PDFBOX-5044: avoid stack overflow

Modified:

pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java?rev=1884357&r1=1884356&r2=1884357&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
 Sat Dec 12 16:56:08 2020
@@ -17,17 +17,24 @@
 package org.apache.pdfbox.pdmodel.interactive.form;
 
 import java.util.ArrayDeque;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Queue;
 
 import java.util.List;
 import java.util.NoSuchElementException;
+import java.util.Set;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.cos.COSDictionary;
 
 /**
  * The field tree.
  */
 public class PDFieldTree implements Iterable
 {
+private static final Log LOG = LogFactory.getLog(PDFieldTree.class);
+
 private final PDAcroForm acroForm;
 
 /**
@@ -60,6 +67,10 @@ public class PDFieldTree implements Iter
 {
 private final Queue queue = new ArrayDeque<>();
 
+// PDFBOX-5044: to prevent recursion
+// must be COSDictionary and not PDField, because PDField is newly 
created each time
+private final Set set = new HashSet<>();
+
 private FieldIterator(PDAcroForm form)
 {
 List fields = form.getFields();
@@ -78,7 +89,8 @@ public class PDFieldTree implements Iter
 @Override
 public PDField next()
 {
-if(!hasNext()){
+if(!hasNext())
+{
 throw new NoSuchElementException();
 }
 
@@ -94,12 +106,21 @@ public class PDFieldTree implements Iter
 private void enqueueKids(PDField node)
 {
 queue.add(node);
+set.add(node.getCOSObject());
 if (node instanceof PDNonTerminalField)
 {
 List kids = ((PDNonTerminalField) node).getChildren();
 for (PDField kid : kids)
 {
-enqueueKids(kid);
+if (set.contains(kid.getCOSObject()))
+{
+LOG.error("Child of field '" + 
node.getFullyQualifiedName() +
+"' already exists elsewhere, ignored to avoid 
recursion");
+}
+else
+{
+enqueueKids(kid);
+}
 }
 }
 }




svn commit: r1884358 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java

2020-12-12 Thread tilman
Author: tilman
Date: Sat Dec 12 16:56:36 2020
New Revision: 1884358

URL: http://svn.apache.org/viewvc?rev=1884358&view=rev
Log:
PDFBOX-5044: avoid stack overflow

Modified:

pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java?rev=1884358&r1=1884357&r2=1884358&view=diff
==
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
 Sat Dec 12 16:56:36 2020
@@ -17,17 +17,24 @@
 package org.apache.pdfbox.pdmodel.interactive.form;
 
 import java.util.ArrayDeque;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Queue;
 
 import java.util.List;
 import java.util.NoSuchElementException;
+import java.util.Set;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.cos.COSDictionary;
 
 /**
  * The field tree.
  */
 public class PDFieldTree implements Iterable
 {
+private static final Log LOG = LogFactory.getLog(PDFieldTree.class);
+
 private final PDAcroForm acroForm;
 
 /**
@@ -60,6 +67,10 @@ public class PDFieldTree implements Iter
 {
 private final Queue queue = new ArrayDeque();
 
+// PDFBOX-5044: to prevent recursion
+// must be COSDictionary and not PDField, because PDField is newly 
created each time
+private final Set set = new HashSet();
+
 private FieldIterator(PDAcroForm form)
 {
 List fields = form.getFields();
@@ -78,7 +89,8 @@ public class PDFieldTree implements Iter
 @Override
 public PDField next()
 {
-if(!hasNext()){
+if(!hasNext())
+{
 throw new NoSuchElementException();
 }
 
@@ -94,12 +106,21 @@ public class PDFieldTree implements Iter
 private void enqueueKids(PDField node)
 {
 queue.add(node);
+set.add(node.getCOSObject());
 if (node instanceof PDNonTerminalField)
 {
 List kids = ((PDNonTerminalField) node).getChildren();
 for (PDField kid : kids)
 {
-enqueueKids(kid);
+if (set.contains(kid.getCOSObject()))
+{
+LOG.error("Child of field '" + 
node.getFullyQualifiedName() +
+"' already exists elsewhere, ignored to avoid 
recursion");
+}
+else
+{
+enqueueKids(kid);
+}
 }
 }
 }




svn commit: r1884359 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java

2020-12-12 Thread tilman
Author: tilman
Date: Sat Dec 12 17:00:26 2020
New Revision: 1884359

URL: http://svn.apache.org/viewvc?rev=1884359&view=rev
Log:
PDFBOX-4892: avoid ClassCastException and NullPointerException

Modified:

pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java?rev=1884359&r1=1884358&r2=1884359&view=diff
==
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
 Sat Dec 12 17:00:26 2020
@@ -129,7 +129,11 @@ public class PDNonTerminalField extends
 public List getChildren()
 {
 List children = new ArrayList();
-COSArray kids = 
(COSArray)getCOSObject().getDictionaryObject(COSName.KIDS);
+COSArray kids = getCOSObject().getCOSArray(COSName.KIDS);
+if (kids == null)
+{
+return children;
+}
 for (int i = 0; i < kids.size(); i++)
 {
 COSBase kid = kids.getObject(i);




svn commit: r1884360 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java

2020-12-12 Thread tilman
Author: tilman
Date: Sat Dec 12 17:00:38 2020
New Revision: 1884360

URL: http://svn.apache.org/viewvc?rev=1884360&view=rev
Log:
PDFBOX-4892: avoid ClassCastException and NullPointerException

Modified:

pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java?rev=1884360&r1=1884359&r2=1884360&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
 Sat Dec 12 17:00:38 2020
@@ -130,7 +130,11 @@ public class PDNonTerminalField extends
 //TODO: why not return a COSArrayList like in PDPage.getAnnotations() ?
  
 List children = new ArrayList<>();
-COSArray kids = 
(COSArray)getCOSObject().getDictionaryObject(COSName.KIDS);
+COSArray kids = getCOSObject().getCOSArray(COSName.KIDS);
+if (kids == null)
+{
+return children;
+}
 for (int i = 0; i < kids.size(); i++)
 {
 COSBase kid = kids.getObject(i);




svn commit: r1884361 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/interactive/form/ test/java/org/apache/pdfbox/pdmodel/interactive/form/

2020-12-12 Thread msahyoun
Author: msahyoun
Date: Sat Dec 12 18:29:51 2020
New Revision: 1884361

URL: http://svn.apache.org/viewvc?rev=1884361&view=rev
Log:
PDFBOX-5043: avoid StringIndexOutOfBoundsException; skip generation for PMD 
widgets

Modified:

pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java

pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java

pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java?rev=1884361&r1=1884360&r2=1884361&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 Sat Dec 12 18:29:51 2020
@@ -185,6 +185,12 @@ class AppearanceGeneratorHelper
 
 for (PDAnnotationWidget widget : field.getWidgets())
 {
+if (widget.getCOSObject().containsKey("PMD"))
+{
+LOG.warn("widget of field " + field.getFullyQualifiedName() + 
" is a PaperMetaData widet, no appearance stream created");
+continue;
+}
+
 // some fields have the /Da at the widget level if the 
 // widgets differ in layout.
 PDDefaultAppearanceString acroFormAppearance = defaultAppearance;

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java?rev=1884361&r1=1884360&r2=1884361&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java
 Sat Dec 12 18:29:51 2020
@@ -206,7 +206,8 @@ class PlainText
 while (true)
 {
 splitOffset--;
-String substring = word.trim().substring(0, 
splitOffset);
+
+String substring = word.substring(0, splitOffset);
 float substringWidth = font.getStringWidth(substring) 
* scale;
 if (substringWidth < width)
 {

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java?rev=1884361&r1=1884360&r2=1884361&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java
 Sat Dec 12 18:29:51 2020
@@ -63,4 +63,21 @@ public class PDAcroFormGenerateAppearanc
 assertDoesNotThrow(() -> catalog.getAcroForm(), "Getting the 
AcroForm shall not throw an exception");
 }
 }
+
+/**
+ * PDFBOX-5043 PaperMetaData
+ * @throws IOException
+ */
+@Test
+public void test5043PaperMetaData() throws IOException
+{
+String sourceUrl = 
"https://issues.apache.org/jira/secure/attachment/13016992/PDFBOX-3891-5.pdf";;
+
+try (PDDocument testPdf = Loader.loadPDF(new 
URL(sourceUrl).openStream()))
+{
+PDDocumentCatalog catalog = testPdf.getDocumentCatalog();
+
+assertDoesNotThrow(() -> catalog.getAcroForm(), "Getting the 
AcroForm shall not throw an exception");
+}
+}
 }




svn commit: r1884362 - in /pdfbox/branches/2.0/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/interactive/form/ test/java/org/apache/pdfbox/pdmodel/interactive/form/

2020-12-12 Thread msahyoun
Author: msahyoun
Date: Sat Dec 12 18:34:26 2020
New Revision: 1884362

URL: http://svn.apache.org/viewvc?rev=1884362&view=rev
Log:
PDFBOX-5043: avoid StringIndexOutOfBoundsException; skip generation for PMD 
widgets

Modified:

pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java

pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java

pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java?rev=1884362&r1=1884361&r2=1884362&view=diff
==
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 Sat Dec 12 18:34:26 2020
@@ -170,6 +170,13 @@ class AppearanceGeneratorHelper {
 }
 
 for (PDAnnotationWidget widget : field.getWidgets()) {
+
+if (widget.getCOSObject().containsKey("PMD"))
+{
+LOG.warn("widget of field " + field.getFullyQualifiedName() + 
" is a PaperMetaData widet, no appearance stream created");
+continue;
+}
+
 // some fields have the /Da at the widget level if the
 // widgets differ in layout.
 PDDefaultAppearanceString acroFormAppearance = defaultAppearance;

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java?rev=1884362&r1=1884361&r2=1884362&view=diff
==
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PlainText.java
 Sat Dec 12 18:34:26 2020
@@ -206,7 +206,7 @@ class PlainText
 while (true)
 {
 splitOffset--;
-String substring = word.trim().substring(0, 
splitOffset);
+String substring = word.substring(0, splitOffset);
 float substringWidth = font.getStringWidth(substring) 
* scale;
 if (substringWidth < width)
 {

Modified: 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java?rev=1884362&r1=1884361&r2=1884362&view=diff
==
--- 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormGenerateAppearancesTest.java
 Sat Dec 12 18:34:26 2020
@@ -93,4 +93,36 @@ public class PDAcroFormGenerateAppearanc
 IOUtils.closeQuietly(testPdf);
 }
 }
+
+/**
+ * PDFBOX-5043 PaperMetaData
+ * @throws IOException
+ */
+@Test
+public void test5043PaperMetaData() throws IOException
+{
+String sourceUrl = 
"https://issues.apache.org/jira/secure/attachment/13016992/PDFBOX-3891-5.pdf";;
+
+PDDocument testPdf = null;
+try
+{
+testPdf = PDDocument.load(new URL(sourceUrl).openStream());
+PDDocumentCatalog catalog = testPdf.getDocumentCatalog();
+boolean thrown = false;
+try
+{
+catalog.getAcroForm();
+}
+catch (Exception e)
+{
+thrown = true;
+}
+assertFalse("There shall be no exception when getting the 
AcroForm", thrown);
+}
+finally
+{
+IOUtils.closeQuietly(testPdf);
+}
+}
+
 }




svn commit: r1884364 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java

2020-12-12 Thread msahyoun
Author: msahyoun
Date: Sat Dec 12 22:41:36 2020
New Revision: 1884364

URL: http://svn.apache.org/viewvc?rev=1884364&view=rev
Log:
PDFBOX-5043: fix typo

Modified:

pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java?rev=1884364&r1=1884363&r2=1884364&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 Sat Dec 12 22:41:36 2020
@@ -187,7 +187,7 @@ class AppearanceGeneratorHelper
 {
 if (widget.getCOSObject().containsKey("PMD"))
 {
-LOG.warn("widget of field " + field.getFullyQualifiedName() + 
" is a PaperMetaData widet, no appearance stream created");
+LOG.warn("widget of field " + field.getFullyQualifiedName() + 
" is a PaperMetaData widget, no appearance stream created");
 continue;
 }
 




svn commit: r1884365 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java

2020-12-12 Thread msahyoun
Author: msahyoun
Date: Sat Dec 12 22:42:52 2020
New Revision: 1884365

URL: http://svn.apache.org/viewvc?rev=1884365&view=rev
Log:
PDFBOX-5043: fix typo

Modified:

pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java?rev=1884365&r1=1884364&r2=1884365&view=diff
==
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/AppearanceGeneratorHelper.java
 Sat Dec 12 22:42:52 2020
@@ -173,7 +173,7 @@ class AppearanceGeneratorHelper {
 
 if (widget.getCOSObject().containsKey("PMD"))
 {
-LOG.warn("widget of field " + field.getFullyQualifiedName() + 
" is a PaperMetaData widet, no appearance stream created");
+LOG.warn("widget of field " + field.getFullyQualifiedName() + 
" is a PaperMetaData widget, no appearance stream created");
 continue;
 }
 




svn commit: r1884366 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroF

2020-12-12 Thread msahyoun
Author: msahyoun
Date: Sat Dec 12 23:08:52 2020
New Revision: 1884366

URL: http://svn.apache.org/viewvc?rev=1884366&view=rev
Log:
PDFBOX-3891: avoid UnsupportedOperationException by creating fields from scratch

Modified:

pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java

pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java?rev=1884366&r1=1884365&r2=1884366&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java
 Sat Dec 12 23:08:52 2020
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel.fixup.processor;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -79,7 +80,7 @@ public class AcroFormOrphanWidgetsProces
 
 LOG.debug("rebuilding fields from widgets");
 
-List fields = acroForm.getFields();
+List fields = new ArrayList<>();
 
 for (PDPage page : document.getPages())
 {
@@ -125,7 +126,11 @@ public class AcroFormOrphanWidgetsProces
 }
 else
 {
-fields.add(PDFieldFactory.createField(acroForm, 
annot.getCOSObject(), null));
+PDField field = PDFieldFactory.createField(acroForm, 
annot.getCOSObject(), null);
+if (field != null)
+{
+fields.add(field);
+}
 }
 }
 }

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java?rev=1884366&r1=1884365&r2=1884366&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java
 Sat Dec 12 23:08:52 2020
@@ -16,6 +16,7 @@
  */
 package org.apache.pdfbox.pdmodel.interactive.form;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
@@ -283,6 +284,25 @@ class PDAcroFormFromAnnotsTest
 }
 }
 
+/**
+ * PDFBOX-3891 null PDFieldFactory.createField 
+ * 
+ * @throws IOException
+ */
+@Test
+void testFromAnnots3891NullField() throws IOException
+{
+String sourceUrl = 
"https://issues.apache.org/jira/secure/attachment/13016993/poppler-14433-0.pdf";;
+
+try (PDDocument testPdf = Loader.loadPDF(new 
URL(sourceUrl).openStream()))
+{
+PDDocumentCatalog catalog = testPdf.getDocumentCatalog();
+assertDoesNotThrow(() -> catalog.getAcroForm(new 
CreateFieldsFixup(testPdf)), "Getting the AcroForm shall not throw an 
exception");
+}
+}
+
+
+
 /*
  * Create fields from widget annotations
  */




svn commit: r1884369 - in /pdfbox/branches/2.0/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java test/java/org/apache/pdfbox/pdmodel/interactive/form/

2020-12-12 Thread msahyoun
Author: msahyoun
Date: Sat Dec 12 23:16:56 2020
New Revision: 1884369

URL: http://svn.apache.org/viewvc?rev=1884369&view=rev
Log:
PDFBOX-3891: avoid UnsupportedOperationException by creating fields from scratch

Modified:

pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java

pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java?rev=1884369&r1=1884368&r2=1884369&view=diff
==
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/fixup/processor/AcroFormOrphanWidgetsProcessor.java
 Sat Dec 12 23:16:56 2020
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel.fixup.processor;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -78,7 +79,7 @@ public class AcroFormOrphanWidgetsProces
 Map nonTerminalFieldsMap = new HashMap();
 
 LOG.debug("rebuilding fields from widgets");
-List fields = acroForm.getFields();
+List fields = new ArrayList();
 for (PDPage page : document.getPages())
 {
 try

Modified: 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java?rev=1884369&r1=1884368&r2=1884369&view=diff
==
--- 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDAcroFormFromAnnotsTest.java
 Sat Dec 12 23:16:56 2020
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel.interactive.form;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.IOException;
@@ -341,6 +342,39 @@ public class PDAcroFormFromAnnotsTest
 }
 }
 
+/**
+ * PDFBOX-3891 null PDFieldFactory.createField
+ * @throws IOException
+ */
+@Test
+public void testFromAnnots3891NullField() throws IOException
+{
+String sourceUrl = 
"https://issues.apache.org/jira/secure/attachment/13016993/poppler-14433-0.pdf";;
+
+PDDocument testPdf = null;
+try
+{
+testPdf = PDDocument.load(new URL(sourceUrl).openStream());
+PDDocumentCatalog catalog = testPdf.getDocumentCatalog();
+boolean thrown = false;
+try
+{
+catalog.getAcroForm(new CreateFieldsFixup(testPdf));
+}
+catch (Exception e)
+{
+thrown = true;
+}
+assertFalse("There shall be no exception when getting the 
AcroForm", thrown);
+}
+finally
+{
+IOUtils.closeQuietly(testPdf);
+}
+}
+
+
+
 /*
  * Create fields from widget annotations
  */




svn commit: r1884373 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java

2020-12-12 Thread tilman
Author: tilman
Date: Sun Dec 13 05:35:25 2020
New Revision: 1884373

URL: http://svn.apache.org/viewvc?rev=1884373&view=rev
Log:
PDFBOX-5044: use identity hash set (identity check vs an equality check) as 
suggested by Maruan Sahyoun; add test

Added:

pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
   (with props)
Modified:

pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java?rev=1884373&r1=1884372&r2=1884373&view=diff
==
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
 Sun Dec 13 05:35:25 2020
@@ -17,7 +17,8 @@
 package org.apache.pdfbox.pdmodel.interactive.form;
 
 import java.util.ArrayDeque;
-import java.util.HashSet;
+import java.util.Collections;
+import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.Queue;
 
@@ -69,7 +70,8 @@ public class PDFieldTree implements Iter
 
 // PDFBOX-5044: to prevent recursion
 // must be COSDictionary and not PDField, because PDField is newly 
created each time
-private final Set set = new HashSet<>();
+private final Set set =
+Collections.newSetFromMap(new IdentityHashMap());
 
 private FieldIterator(PDAcroForm form)
 {

Added: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java?rev=1884373&view=auto
==
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
 (added)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
 Sun Dec 13 05:35:25 2020
@@ -0,0 +1,60 @@
+/*
+ * 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.pdfbox.pdmodel.interactive.form;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.apache.pdfbox.Loader;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+/**
+ *
+ * @author Tilman Hausherr
+ */
+public class PDFieldTreeTest
+{
+
+/**
+ * PDFBOX-5044 stack overflow
+ *
+ * @throws IOException
+ */
+@Test
+public void test5044() throws IOException
+{
+String sourceUrl = 
"https://issues.apache.org/jira/secure/attachment/13016994/PDFBOX-4131-0.pdf";;
+
+try (InputStream is = new URL(sourceUrl).openStream();
+ PDDocument doc = Loader.loadPDF(is))
+{
+PDDocumentCatalog catalog = doc.getDocumentCatalog();
+PDAcroForm acroForm = catalog.getAcroForm();
+int count = 0;
+for (PDField field : acroForm.getFieldTree())
+{
+++count;
+}
+Assertions.assertEquals(4, count);
+}
+}
+}

Propchange: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
--
svn:eol-style = native




svn commit: r1884374 - in /pdfbox/branches/2.0/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.ja

2020-12-12 Thread tilman
Author: tilman
Date: Sun Dec 13 05:35:29 2020
New Revision: 1884374

URL: http://svn.apache.org/viewvc?rev=1884374&view=rev
Log:
PDFBOX-5044: use identity hash set (identity check vs an equality check) as 
suggested by Maruan Sahyoun; add test

Added:

pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
   (with props)
Modified:

pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java?rev=1884374&r1=1884373&r2=1884374&view=diff
==
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
 (original)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTree.java
 Sun Dec 13 05:35:29 2020
@@ -17,7 +17,9 @@
 package org.apache.pdfbox.pdmodel.interactive.form;
 
 import java.util.ArrayDeque;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.Queue;
 
@@ -69,7 +71,8 @@ public class PDFieldTree implements Iter
 
 // PDFBOX-5044: to prevent recursion
 // must be COSDictionary and not PDField, because PDField is newly 
created each time
-private final Set set = new HashSet();
+private final Set set =
+Collections.newSetFromMap(new IdentityHashMap());
 
 private FieldIterator(PDAcroForm form)
 {

Added: 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java?rev=1884374&view=auto
==
--- 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
 (added)
+++ 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
 Sun Dec 13 05:35:29 2020
@@ -0,0 +1,59 @@
+/*
+ * 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.pdfbox.pdmodel.interactive.form;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ * @author Tilman Hausherr
+ */
+public class PDFieldTreeTest
+{
+
+/**
+ * PDFBOX-5044 stack overflow
+ *
+ * @throws IOException
+ */
+@Test
+public void test5044() throws IOException
+{
+String sourceUrl = 
"https://issues.apache.org/jira/secure/attachment/13016994/PDFBOX-4131-0.pdf";;
+
+InputStream is = new URL(sourceUrl).openStream();
+PDDocument doc = PDDocument.load(is);
+PDDocumentCatalog catalog = doc.getDocumentCatalog();
+PDAcroForm acroForm = catalog.getAcroForm();
+int count = 0;
+for (PDField field : acroForm.getFieldTree())
+{
+++count;
+}
+Assert.assertEquals(4, count);
+is.close();
+doc.close();
+}
+}

Propchange: 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/PDFieldTreeTest.java
--
svn:eol-style = native