svn commit: r1884353 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
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
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
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
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
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/
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/
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
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
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
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/
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
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
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