[Git][java-team/libsambox-java][upstream] New upstream version 2.3.0

Markus Koschany (@apo) gitlab at salsa.debian.org
Sat Oct 2 00:18:42 BST 2021



Markus Koschany pushed to branch upstream at Debian Java Maintainers / libsambox-java


Commits:
785e2b27 by Markus Koschany at 2021-10-02T01:14:35+02:00
New upstream version 2.3.0
- - - - -


21 changed files:

- pom.xml
- src/main/java/org/sejda/sambox/cos/COSBoolean.java
- src/main/java/org/sejda/sambox/cos/COSName.java
- src/main/java/org/sejda/sambox/cos/COSNull.java
- src/main/java/org/sejda/sambox/cos/COSNumber.java
- + src/main/java/org/sejda/sambox/cos/IndirectCOSObject.java
- src/main/java/org/sejda/sambox/cos/IndirectCOSObjectIdentifier.java
- src/main/java/org/sejda/sambox/input/BaseCOSParser.java
- src/main/java/org/sejda/sambox/input/ObjectsFullScanner.java
- src/main/java/org/sejda/sambox/input/XrefFullScanner.java
- src/main/java/org/sejda/sambox/input/XrefParser.java
- src/main/java/org/sejda/sambox/output/DefaultPDFWriter.java
- src/main/java/org/sejda/sambox/output/IndirectObjectsWriter.java
- src/main/java/org/sejda/sambox/output/IndirectReferencesAwareCOSWriter.java
- src/main/java/org/sejda/sambox/output/ObjectsStreamPDFBodyObjectsWriter.java
- src/main/java/org/sejda/sambox/output/PDFBodyWriter.java
- src/main/java/org/sejda/sambox/output/PDFWriteContext.java
- src/main/java/org/sejda/sambox/pdmodel/PDDocument.java
- src/main/java/org/sejda/sambox/pdmodel/graphics/color/PDColorSpace.java
- src/main/java/org/sejda/sambox/pdmodel/graphics/shading/PDShading.java
- src/main/java/org/sejda/sambox/xref/FileTrailer.java


Changes:

=====================================
pom.xml
=====================================
@@ -5,7 +5,7 @@
 	<artifactId>sambox</artifactId>
 	<packaging>jar</packaging>
 	<name>sambox</name>
-	<version>2.2.19</version>
+	<version>2.3.0</version>
 
 	<description>An Apache PDFBox fork intended to be used as PDF processor for Sejda and PDFsam related projects</description>
 	<url>http://www.sejda.org</url>
@@ -33,7 +33,7 @@
 		<connection>scm:git:git at github.com:torakiki/sambox.git</connection>
 		<developerConnection>scm:git:git at github.com:torakiki/sambox.git</developerConnection>
 		<url>scm:git:git at github.com:torakiki/sambox.git</url>
-		<tag>v2.2.19</tag>
+		<tag>v2.3.0</tag>
 	</scm>
 
 	<developers>
@@ -52,17 +52,17 @@
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<maven.javadoc.failOnError>false</maven.javadoc.failOnError>
-		<bouncycastle.version>1.64</bouncycastle.version>
+		<bouncycastle.version>1.69</bouncycastle.version>
 		<fontbox.version>2.0.18</fontbox.version>
 		<sejda.commons.version>1.1.3</sejda.commons.version>
 		<sejda.io.version>2.1.1</sejda.io.version>
-		<slf4j.version>1.7.29</slf4j.version>
+		<slf4j.version>1.7.30</slf4j.version>
 	</properties>
 
 	<repositories>
 		<repository>
 			<id>pdfbox-snapshot</id>
-			<url>http://repository.apache.org/snapshots/</url>
+			<url>https://repository.apache.org/snapshots/</url>
 			<snapshots>
 				<enabled>true</enabled>
 			</snapshots>


=====================================
src/main/java/org/sejda/sambox/cos/COSBoolean.java
=====================================
@@ -64,4 +64,11 @@ public final class COSBoolean extends COSBase
     {
         visitor.visit(this);
     }
+
+    @Override
+    public void idIfAbsent(IndirectCOSObjectIdentifier id)
+    {
+        // we don't store id for booleans. We write them as direct objects. Wrap this with an IndirectCOSObject if you
+        // want to write a number as indirect reference
+    }
 }


=====================================
src/main/java/org/sejda/sambox/cos/COSName.java
=====================================
@@ -662,4 +662,11 @@ public final class COSName extends COSBase implements Comparable<COSName>
     {
         visitor.visit(this);
     }
+
+    @Override
+    public void idIfAbsent(IndirectCOSObjectIdentifier id)
+    {
+        // we don't store id for names. We write them as direct objects. Wrap this with an IndirectCOSObject if you
+        // want to write a number as indirect reference
+    }
 }


=====================================
src/main/java/org/sejda/sambox/cos/COSNull.java
=====================================
@@ -46,4 +46,11 @@ public final class COSNull extends COSBase
     {
         return "COSNull";
     }
+
+    @Override
+    public void idIfAbsent(IndirectCOSObjectIdentifier id)
+    {
+        // we don't store id for NULL. We write them as direct objects. Wrap this with an IndirectCOSObject if you
+        // want to write a number as indirect reference
+    }
 }


=====================================
src/main/java/org/sejda/sambox/cos/COSNumber.java
=====================================
@@ -88,4 +88,11 @@ public abstract class COSNumber extends COSBase
 
         return new COSFloat(number);
     }
+
+    @Override
+    public void idIfAbsent(IndirectCOSObjectIdentifier id)
+    {
+        // we don't store id for numbers. We write them as direct objects. Wrap this with an IndirectCOSObject if you
+        // want to write a number as indirect reference
+    }
 }


=====================================
src/main/java/org/sejda/sambox/cos/IndirectCOSObject.java
=====================================
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2021 Sober Lemur S.a.s. di Vacondio Andrea and Sejda BV
+ *
+ * Licensed 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.sejda.sambox.cos;
+
+import java.io.IOException;
+import java.util.Optional;
+
+/**
+ * A COSBase that will be written as indirect object. This can be used to wrap COSBase (COSName, COSInteger, COSNull,
+ * COSBoolean) that are otherwise written as direct object by the body writer.
+ * 
+ * @author Andrea Vacondio
+ */
+public class IndirectCOSObject extends COSBase
+{
+
+    private COSBase baseObject;
+
+    private IndirectCOSObject(COSBase wrapped)
+    {
+        this.baseObject = wrapped;
+    }
+
+    @Override
+    public COSBase getCOSObject()
+    {
+        return baseObject;
+    }
+
+    @Override
+    public void accept(COSVisitor visitor) throws IOException
+    {
+        baseObject.accept(visitor);
+    }
+
+    /**
+     * Factory method for an object that will be written as an indirect object.
+     * 
+     * @param wrapped
+     * @return the new instance
+     */
+    public static IndirectCOSObject asIndirectObject(COSObjectable wrapped)
+    {
+        return new IndirectCOSObject(
+                Optional.ofNullable(wrapped).orElse(COSNull.NULL).getCOSObject());
+    }
+
+}


=====================================
src/main/java/org/sejda/sambox/cos/IndirectCOSObjectIdentifier.java
=====================================
@@ -58,7 +58,8 @@ public final class IndirectCOSObjectIdentifier
     @Override
     public int hashCode()
     {
-        return Long.hashCode(objectIdentifier.hashCode() + ownerIdentifier.hashCode());
+        return Long
+                .hashCode((long) objectIdentifier.hashCode() + (long) ownerIdentifier.hashCode());
     }
 
     @Override


=====================================
src/main/java/org/sejda/sambox/input/BaseCOSParser.java
=====================================
@@ -49,7 +49,6 @@ abstract class BaseCOSParser extends SourceReader
     private static final Logger LOG = LoggerFactory.getLogger(BaseCOSParser.class);
 
     public static final String ENDOBJ = "endobj";
-    public static final String OBJ = "obj";
     public static final String STREAM = "stream";
     public static final String ENDSTREAM = "endstream";
 


=====================================
src/main/java/org/sejda/sambox/input/ObjectsFullScanner.java
=====================================
@@ -36,7 +36,8 @@ import org.slf4j.LoggerFactory;
 class ObjectsFullScanner
 {
     private static final Logger LOG = LoggerFactory.getLogger(ObjectsFullScanner.class);
-    private static final Pattern OBJECT_DEF_PATTERN = Pattern.compile("^(\\d+)[\\s](\\d+)[\\s]obj");
+    private static final Pattern OBJECT_DEF_PATTERN = Pattern
+            .compile("^(\\d+)[\\s]+(\\d+)[\\s]+obj");
 
     private Xref xref = new Xref();
     private SourceReader reader;


=====================================
src/main/java/org/sejda/sambox/input/XrefFullScanner.java
=====================================
@@ -138,7 +138,7 @@ class XrefFullScanner
 
     private void parseFoundXrefTable(long offset) throws IOException
     {
-        LOG.debug("Found xref table at " + offset);
+        LOG.debug("Found xref table at {}", offset);
         trailer.xrefOffset(offset);
         xrefTableParser.parse(offset);
     }
@@ -157,7 +157,7 @@ class XrefFullScanner
         if (found instanceof COSDictionary
                 && COSName.XREF.equals(((COSDictionary) found).getItem(COSName.TYPE)))
         {
-            LOG.debug("Found xref stream at " + offset);
+            LOG.debug("Found xref stream at {}", offset);
             trailer.xrefOffset(offset);
             parseFoundXrefStream((COSDictionary) found);
         }


=====================================
src/main/java/org/sejda/sambox/input/XrefParser.java
=====================================
@@ -17,9 +17,9 @@
 package org.sejda.sambox.input;
 
 import static java.util.Objects.nonNull;
+import static org.sejda.commons.util.RequireUtils.requireIOCondition;
 import static org.sejda.sambox.input.AbstractXrefTableParser.TRAILER;
 import static org.sejda.sambox.input.AbstractXrefTableParser.XREF;
-import static org.sejda.commons.util.RequireUtils.requireIOCondition;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -126,7 +126,7 @@ class XrefParser
                         {
                             if (line.startsWith(TRAILER))
                             {
-                                LOG.debug("Parsing trailer at " + offset);
+                                LOG.debug("Parsing trailer at {}", offset);
                                 parser.position(offset);
                                 parser.skipExpected(TRAILER);
                                 parser.skipSpaces();
@@ -139,7 +139,7 @@ class XrefParser
                                 try
                                 {
                                     // we do our best to make sure we have a catalog even in corrupted docs
-                                    LOG.debug("Parsing potential Catalog at " + lastObjectOffset);
+                                    LOG.debug("Parsing potential Catalog at {}", lastObjectOffset);
                                     parser.position(lastObjectOffset);
                                     parser.skipIndirectObjectDefinition();
                                     parser.skipSpaces();
@@ -160,7 +160,7 @@ class XrefParser
                             }
                             else if (line.startsWith(XREF))
                             {
-                                LOG.debug("Found xref at " + offset);
+                                LOG.debug("Found xref at {}", offset);
                                 trailer.xrefOffset(offset);
                             }
                         }
@@ -175,6 +175,7 @@ class XrefParser
                 // and we consider it more reliable compared to what was found in the somehow broken xrefs
                 objectsFullScanner.entries().values().stream().forEach(parser.provider()::addEntry);
             }
+            trailer.setFallbackScanStatus(xrefScanStatus.name());
         }
     }
 
@@ -203,7 +204,7 @@ class XrefParser
             parser.position(startPosition + relativeIndex + STARTXREF.length());
             parser.skipSpaces();
             long xrefOffset = parser.readLong();
-            LOG.debug("Found xref offset at " + xrefOffset);
+            LOG.debug("Found xref offset at {}", xrefOffset);
             return xrefOffset;
         }
         catch (IOException e)


=====================================
src/main/java/org/sejda/sambox/output/DefaultPDFWriter.java
=====================================
@@ -28,7 +28,9 @@ import java.util.Optional;
 
 import org.sejda.commons.util.IOUtils;
 import org.sejda.sambox.cos.COSDictionary;
+import org.sejda.sambox.cos.COSInteger;
 import org.sejda.sambox.cos.COSName;
+import org.sejda.sambox.cos.DirectCOSObject;
 import org.sejda.sambox.cos.IndirectCOSObjectReference;
 import org.sejda.sambox.xref.XrefEntry;
 import org.slf4j.Logger;
@@ -117,7 +119,8 @@ class DefaultPDFWriter implements Closeable
     {
         LOG.trace("Writing trailer");
         sanitizeTrailer(trailer, prev);
-        trailer.setLong(COSName.SIZE, writer.context().highestObjectNumber() + 1);
+        trailer.setItem(COSName.SIZE, DirectCOSObject
+                .asDirectObject(COSInteger.get(writer.context().highestObjectNumber() + 1)));
         writer.write("trailer".getBytes(StandardCharsets.US_ASCII));
         writer.writeEOL();
         trailer.getCOSObject().accept(writer.writer());
@@ -151,8 +154,8 @@ class DefaultPDFWriter implements Closeable
         long startxref = writer().offset();
         LOG.debug("Writing xref stream at offset " + startxref);
         sanitizeTrailer(trailer, prev);
-        XrefEntry entry = XrefEntry
-                .inUseEntry(writer.context().highestObjectNumber() + 1, startxref, 0);
+        XrefEntry entry = XrefEntry.inUseEntry(writer.context().highestObjectNumber() + 1,
+                startxref, 0);
         writer.context().addWritten(entry);
         writer.writeObject(new IndirectCOSObjectReference(entry.getObjectNumber(),
                 entry.getGenerationNumber(), new XrefStream(trailer, writer.context())));


=====================================
src/main/java/org/sejda/sambox/output/IndirectObjectsWriter.java
=====================================
@@ -117,7 +117,7 @@ class IndirectObjectsWriter implements Closeable
         writer.writer().writeEOL();
         writer.writer().write(ENDOBJ);
         writer.writer().writeEOL();
-        LOG.trace("Written object " + object.xrefEntry());
+        LOG.trace("Written object {}", object.xrefEntry());
     }
 
     /**


=====================================
src/main/java/org/sejda/sambox/output/IndirectReferencesAwareCOSWriter.java
=====================================
@@ -16,6 +16,8 @@
  */
 package org.sejda.sambox.output;
 
+import static java.util.Optional.ofNullable;
+
 import java.io.IOException;
 
 import org.sejda.io.BufferedCountingChannelWriter;
@@ -53,20 +55,7 @@ class IndirectReferencesAwareCOSWriter extends DefaultCOSWriter
     @Override
     void writeValue(COSBase value) throws IOException
     {
-        if (context.hasIndirectReferenceFor(value))
-        {
-            context.getIndirectReferenceFor(value).accept(this);
-        }
-        else
-        {
-            value.accept(this);
-        }
-    }
-
-    @Override
-    public void close() throws IOException
-    {
-        super.close();
+        ofNullable((COSBase) context.getIndirectReferenceFor(value)).orElse(value).accept(this);
     }
 
 }


=====================================
src/main/java/org/sejda/sambox/output/ObjectsStreamPDFBodyObjectsWriter.java
=====================================
@@ -62,8 +62,7 @@ public class ObjectsStreamPDFBodyObjectsWriter implements PDFBodyObjectsWriter
         requireNotNullArg(delegate, "Delegate writer cannot be null");
         this.context = context;
         this.delegate = delegate;
-        currentStream = new ObjectsStream(context);
-        context.createIndirectReferenceFor(currentStream);
+        this.currentStream = new ObjectsStream(context);
     }
 
     @Override
@@ -76,31 +75,29 @@ public class ObjectsStreamPDFBodyObjectsWriter implements PDFBodyObjectsWriter
         }
         else
         {
-            IndirectCOSObjectReference streamRef = context.getIndirectReferenceFor(currentStream);
             context.addWritten(
                     CompressedXrefEntry.compressedEntry(ref.xrefEntry().getObjectNumber(),
-                            streamRef.xrefEntry().getObjectNumber(), currentStream.counter));
+                            currentStream.reference().xrefEntry().getObjectNumber(),
+                            currentStream.counter));
             currentStream.addItem(ref);
-            LOG.trace("Added ref {} to object stream {}", ref, streamRef);
+            LOG.trace("Added ref {} to object stream {}", ref, currentStream.reference());
         }
         if (currentStream.isFull())
         {
             doWriteObjectsStream();
             currentStream = new ObjectsStream(context);
-            context.createIndirectReferenceFor(currentStream);
         }
 
     }
 
     private void doWriteObjectsStream() throws IOException
     {
-        IndirectCOSObjectReference ref = context.getIndirectReferenceFor(currentStream);
-        LOG.debug("Writing object stream {}", ref);
+        LOG.debug("Writing object stream {}", currentStream.reference());
         currentStream.prepareForWriting();
         IndirectCOSObjectReference length = context
                 .createNonStorableInObjectStreamIndirectReference();
         currentStream.setItem(COSName.LENGTH, length);
-        delegate.writeObject(ref);
+        delegate.writeObject(currentStream.reference());
         LOG.trace("Writing object stream length {}", length);
         delegate.writeObject(length);
     }
@@ -130,6 +127,7 @@ public class ObjectsStreamPDFBodyObjectsWriter implements PDFBodyObjectsWriter
         private FastByteArrayOutputStream data = new FastByteArrayOutputStream();
         private DefaultCOSWriter dataWriter;
         private InputStream filtered;
+        private IndirectCOSObjectReference reference;
 
         public ObjectsStream(PDFWriteContext context)
         {
@@ -149,6 +147,7 @@ public class ObjectsStreamPDFBodyObjectsWriter implements PDFBodyObjectsWriter
                     // nothing
                 }
             };
+            this.reference = context.createIndirectReferenceFor(this);
         }
 
         public boolean hasItems()
@@ -194,6 +193,11 @@ public class ObjectsStreamPDFBodyObjectsWriter implements PDFBodyObjectsWriter
             this.data = null;
         }
 
+        IndirectCOSObjectReference reference()
+        {
+            return this.reference;
+        }
+
         @Override
         public void close() throws IOException
         {


=====================================
src/main/java/org/sejda/sambox/output/PDFBodyWriter.java
=====================================
@@ -34,6 +34,7 @@ import org.sejda.sambox.cos.COSName;
 import org.sejda.sambox.cos.COSNull;
 import org.sejda.sambox.cos.COSStream;
 import org.sejda.sambox.cos.COSVisitor;
+import org.sejda.sambox.cos.IndirectCOSObject;
 import org.sejda.sambox.cos.IndirectCOSObjectReference;
 import org.sejda.sambox.input.ExistingIndirectCOSObject;
 import org.sejda.sambox.input.IncrementablePDDocument;
@@ -130,7 +131,7 @@ class PDFBodyWriter implements COSVisitor, Closeable
         for (int i = 0; i < array.size(); i++)
         {
             COSBase item = ofNullable(array.get(i)).orElse(COSNull.NULL);
-            if (item instanceof ExistingIndirectCOSObject || item instanceof COSDictionary)
+            if (shouldBeIndirect(item))
             {
                 onPotentialIndirectObject(item);
             }
@@ -147,8 +148,7 @@ class PDFBodyWriter implements COSVisitor, Closeable
         for (COSName key : value.keySet())
         {
             COSBase item = ofNullable(value.getItem(key)).orElse(COSNull.NULL);
-            if (item instanceof ExistingIndirectCOSObject || item instanceof COSDictionary
-                    || COSName.THREADS.equals(key))
+            if (shouldBeIndirect(item) || COSName.THREADS.equals(key))
             {
                 onPotentialIndirectObject(item);
             }
@@ -180,6 +180,12 @@ class PDFBodyWriter implements COSVisitor, Closeable
 
     }
 
+    private boolean shouldBeIndirect(COSBase item)
+    {
+        return (item instanceof ExistingIndirectCOSObject || item instanceof COSDictionary
+                || item instanceof IndirectCOSObject);
+    }
+
     /**
      * Called during the visit on the objects graph, when a potential indirect object is met. Default implementation
      * creates a new indirect reference for it.
@@ -196,7 +202,7 @@ class PDFBodyWriter implements COSVisitor, Closeable
     {
         if (!context.hasIndirectReferenceFor(item))
         {
-            stack.add(context.getOrCreateIndirectReferenceFor(item));
+            stack.add(context.createIndirectReferenceFor(item));
         }
     }
 


=====================================
src/main/java/org/sejda/sambox/output/PDFWriteContext.java
=====================================
@@ -31,8 +31,6 @@ import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.function.Function;
 
 import org.sejda.sambox.cos.COSBase;
-import org.sejda.sambox.cos.COSName;
-import org.sejda.sambox.cos.COSNull;
 import org.sejda.sambox.cos.COSObjectKey;
 import org.sejda.sambox.cos.IndirectCOSObjectIdentifier;
 import org.sejda.sambox.cos.IndirectCOSObjectReference;
@@ -120,32 +118,24 @@ class PDFWriteContext
     private IndirectCOSObjectReference createNewReference(COSBase item,
             Function<COSBase, IndirectCOSObjectReference> supplier)
     {
-        // It's an existing indirect object
-        if (item instanceof ExistingIndirectCOSObject)
+        IndirectCOSObjectReference newRef = supplier.apply(item);
+        LOG.trace("Created new indirect reference {} for {}", newRef, item.id());
+        // It's not an existing indirect object
+        if (!(item instanceof ExistingIndirectCOSObject))
         {
-            ExistingIndirectCOSObject existingItem = (ExistingIndirectCOSObject) item;
-            IndirectCOSObjectReference newRef = supplier.apply(item);
-            LOG.trace("Created new indirect reference {} replacing the existing one {}", newRef,
-                    existingItem.id());
-            // if a COSName was indirect in the original doc we write it as indirect but we don't as indirect every
-            // occurrence of it, just this
-            if (!(item.getCOSObject() instanceof COSName))
-            {
-                lookupNewRef.put(existingItem.id(), newRef);
-            }
-            return newRef;
-
+            // it's a new COSBase
+            item.idIfAbsent(new IndirectCOSObjectIdentifier(newRef.xrefEntry().key(), contextId));
         }
-        if (item instanceof COSNull)
+        // we store the ID if the item reference can be reused. At this point we should always have an id since we get
+        // here only with ExistingIndirectCOSObject, COSDictionary or IndirectCOSObject
+        if (item.hasId())
         {
-            // we don't associate any id or store any lookup for COSNull
-            return supplier.apply(item);
+            lookupNewRef.put(item.id(), newRef);
+        }
+        else
+        {
+            LOG.warn("Unexpected indirect reference for {}", item);
         }
-        // it's a new COSBase
-        IndirectCOSObjectReference newRef = supplier.apply(item);
-        LOG.trace("Created new indirect reference '{}' ", newRef);
-        item.idIfAbsent(new IndirectCOSObjectIdentifier(newRef.xrefEntry().key(), contextId));
-        lookupNewRef.put(item.id(), newRef);
         return newRef;
     }
 
@@ -158,22 +148,22 @@ class PDFWriteContext
      */
     IndirectCOSObjectReference getOrCreateIndirectReferenceFor(COSBase item)
     {
-        if (hasIndirectReferenceFor(item))
-        {
-            // I met it already
-            return lookupNewRef.get(item.id());
-        }
-        return createIndirectReferenceFor(item);
+        return ofNullable(getIndirectReferenceFor(item))
+                .orElseGet(() -> createIndirectReferenceFor(item));
     }
 
     /**
      * @param item
      * @return the {@link IndirectCOSObjectReference} for the given item or null if an
-     * {@link IndirectCOSObjectReference} has not been created for the item.
+     * {@link IndirectCOSObjectReference} has not been created for the item or the item has no id.
      */
     IndirectCOSObjectReference getIndirectReferenceFor(COSBase item)
     {
-        return lookupNewRef.get(item.id());
+        if (item.hasId())
+        {
+            return lookupNewRef.get(item.id());
+        }
+        return null;
     }
 
     /**


=====================================
src/main/java/org/sejda/sambox/pdmodel/PDDocument.java
=====================================
@@ -702,5 +702,10 @@ public class PDDocument implements Closeable
     {
         return PDFParser.parse(SeekableSources.seekableSourceFrom(file));
     }
+    
+    public boolean hasParseErrors()
+    {
+        return this.document.getTrailer().getFallbackScanStatus() != null;
+    }
 
 }


=====================================
src/main/java/org/sejda/sambox/pdmodel/graphics/color/PDColorSpace.java
=====================================
@@ -95,12 +95,9 @@ public abstract class PDColorSpace implements COSObjectable
         if (colorSpace.hasId() && resources != null)
         {
             ResourceCache cache = resources.getResourceCache();
-            if (cache != null)
+            if (cache != null && isAllowedCache(result))
             {
-                if (isAllowedCache(result))
-                {
-                    cache.put(colorSpace.id().objectIdentifier, result);
-                }
+                cache.put(colorSpace.id().objectIdentifier, result);
             }
         }
 
@@ -109,15 +106,8 @@ public abstract class PDColorSpace implements COSObjectable
 
     public static boolean isAllowedCache(PDColorSpace colorSpace)
     {
-        if (colorSpace instanceof PDPattern)
-        {
-            // cannot cache PDPattern color spaces in a global cache, they carry page resources
-            return false;
-        }
-        else
-        {
-            return true;
-        }
+        // cannot cache PDPattern color spaces in a global cache, they carry page resources
+        return !(colorSpace instanceof PDPattern);
     }
 
     /**
@@ -136,11 +126,11 @@ public abstract class PDColorSpace implements COSObjectable
     private static PDColorSpace createUncached(COSBase colorSpace, PDResources resources,
             boolean wasDefault, int recursionAccumulator) throws IOException
     {
-        if(recursionAccumulator > 4) 
+        if (recursionAccumulator > 4)
         {
             throw new IOException("Could not create color space, infinite recursion detected");
         }
-        
+
         colorSpace = colorSpace.getCOSObject();
         if (colorSpace instanceof COSName)
         {


=====================================
src/main/java/org/sejda/sambox/pdmodel/graphics/shading/PDShading.java
=====================================
@@ -227,7 +227,10 @@ public abstract class PDShading implements COSObjectable
         {
             COSBase colorSpaceDictionary = dictionary.getDictionaryObject(COSName.CS,
                     COSName.COLORSPACE);
-            colorSpace = PDColorSpace.create(colorSpaceDictionary);
+            if (colorSpaceDictionary != null) 
+            {
+                colorSpace = PDColorSpace.create(colorSpaceDictionary);
+            }
         }
         return colorSpace;
     }


=====================================
src/main/java/org/sejda/sambox/xref/FileTrailer.java
=====================================
@@ -29,6 +29,7 @@ import org.sejda.sambox.pdmodel.common.PDDictionaryWrapper;
 public class FileTrailer extends PDDictionaryWrapper
 {
     private long xrefOffset = -1;
+    private String fallbackScanStatus = null; 
 
     public FileTrailer()
     {
@@ -57,4 +58,12 @@ public class FileTrailer extends PDDictionaryWrapper
     {
         return COSName.XREF.equals(getCOSObject().getCOSName(COSName.TYPE));
     }
+
+    public String getFallbackScanStatus() {
+        return fallbackScanStatus;
+    }
+
+    public void setFallbackScanStatus(String fallbackScanStatus) {
+        this.fallbackScanStatus = fallbackScanStatus;
+    }
 }



View it on GitLab: https://salsa.debian.org/java-team/libsambox-java/-/commit/785e2b271dc974e6d2ebaa37e0fc6a5b73495349

-- 
View it on GitLab: https://salsa.debian.org/java-team/libsambox-java/-/commit/785e2b271dc974e6d2ebaa37e0fc6a5b73495349
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20211001/c442b60f/attachment.htm>


More information about the pkg-java-commits mailing list