You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2022/07/18 06:29:44 UTC

svn commit: r1902832 - in /pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf: RandomAccessReadDataStream.java TTFParser.java

Author: lehmi
Date: Mon Jul 18 06:29:44 2022
New Revision: 1902832

URL: http://svn.apache.org/viewvc?rev=1902832&view=rev
Log:
PDFBOX-5435: reduce memory footprint 

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/RandomAccessReadDataStream.java
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/RandomAccessReadDataStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/RandomAccessReadDataStream.java?rev=1902832&r1=1902831&r2=1902832&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/RandomAccessReadDataStream.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/RandomAccessReadDataStream.java Mon Jul 18 06:29:44 2022
@@ -20,7 +20,9 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.pdfbox.io.IOUtils;
 import org.apache.pdfbox.io.RandomAccessRead;
+import org.apache.pdfbox.io.RandomAccessReadBuffer;
 
 /**
  * An implementation of the TTFDataStream using RandomAccessRead as source.
@@ -35,13 +37,12 @@ class RandomAccessReadDataStream extends
     /**
      * Constructor.
      * 
-     * @param randomAccessRead
+     * @param randomAccessRead source to be read from
      * 
-     * @throws IOException If there is a problem creating the RandomAccessReadBufferedFile.
+     * @throws IOException If there is a problem reading the source data.
      */
     RandomAccessReadDataStream(RandomAccessRead randomAccessRead) throws IOException
     {
-        this.randomAccessRead = randomAccessRead;
         length = randomAccessRead.length();
         data = new byte[(int) length];
         int remainingBytes = data.length;
@@ -51,10 +52,24 @@ class RandomAccessReadDataStream extends
         {
             remainingBytes -= amountRead;
         }
-        randomAccessRead.seek(0);
+        this.randomAccessRead = new RandomAccessReadBuffer(data);
     }
     
     /**
+     * Constructor.
+     * 
+     * @param inputStream source to be read from
+     * 
+     * @throws IOException If there is a problem reading the source data.
+     */
+    RandomAccessReadDataStream(InputStream inputStream) throws IOException
+    {
+        data = IOUtils.toByteArray(inputStream);
+        length = data.length;
+        this.randomAccessRead = new RandomAccessReadBuffer(data);
+    }
+
+    /**
      * Get the current position in the stream.
      * @return The current position in the stream.
      * @throws IOException If an error occurs while reading the stream.

Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java?rev=1902832&r1=1902831&r2=1902832&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/TTFParser.java Mon Jul 18 06:29:44 2022
@@ -21,7 +21,6 @@ import java.io.InputStream;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.io.RandomAccessRead;
-import org.apache.pdfbox.io.RandomAccessReadBuffer;
 
 /**
  * TrueType font file parser.
@@ -72,6 +71,10 @@ public class TTFParser
             dataStream.close();
             throw ex;
         }
+        finally
+        {
+            randomAccessRead.close();
+        }
     }
 
     /**
@@ -84,7 +87,21 @@ public class TTFParser
     public TrueTypeFont parseEmbedded(InputStream inputStream) throws IOException
     {
         this.isEmbedded = true;
-        return parse(new RandomAccessReadBuffer(inputStream));
+        RandomAccessReadDataStream dataStream = new RandomAccessReadDataStream(inputStream);
+        try
+        {
+            return parse(dataStream);
+        }
+        catch (IOException ex)
+        {
+            // close only on error (source is still being accessed later)
+            dataStream.close();
+            throw ex;
+        }
+        finally
+        {
+            inputStream.close();
+        }
     }
 
     /**