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 2013/11/17 15:31:03 UTC

svn commit: r1542735 [1/4] - in /pdfbox/branches/1.8: ./ fontbox/src/main/java/org/apache/fontbox/ttf/ pdfbox/src/main/java/org/apache/pdfbox/filter/ pdfbox/src/main/java/org/apache/pdfbox/io/ pdfbox/src/main/java/org/apache/pdfbox/pdfparser/ pdfbox/sr...

Author: lehmi
Date: Sun Nov 17 14:31:02 2013
New Revision: 1542735

URL: http://svn.apache.org/r1542735
Log:
merged the following changes from trunk into 1.8 branch:

PDFBOX-1622	r1512433
PDFBOX-1627	r1490022,r1490023
PDFBOX-1632	r1495799,r1497507
PDFBOX-1638	r1504214,r1515165,r1515905
PDFBOX-1639	r1493503
PDFBOX-1655	r1505737
PDFBOX-1657	r1504210
PDFBOX-1663	r1512661
PDFBOX-1681	r1512367
PDFBOX-1694	r1517273,r1517281
PDFBOX-1702	r1517288
PDFBOX-1735	r1528826
PDFBOX-1737	r1528833


Modified:
    pdfbox/branches/1.8/   (props changed)
    pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/GlyphTable.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85InputStream.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85OutputStream.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFObjectStreamParser.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/VisualSignatureParser.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/edit/PDPageContentStream.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2Font.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1AfmPfbFont.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObject.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/util/TextNormalize.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightConstants.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/PreflightDocument.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/action/ActionManagerFactory.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/font/Type3FontValidator.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/parser/PreflightParser.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/AcroFormValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/BookmarkValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/CatalogValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/PageTreeValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/StreamValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ActionsValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/AnnotationValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ExtGStateValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/FontValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/GraphicObjectPageValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ResourcesValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ShaddingPatternValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/SinglePageValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/TilingPatternValidationProcess.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/utils/ContextHelper.java
    pdfbox/branches/1.8/preflight/src/main/java/org/apache/pdfbox/preflight/xobject/XObjFormValidator.java

Propchange: pdfbox/branches/1.8/
------------------------------------------------------------------------------
  Merged /pdfbox/trunk:r1490022-1490023,1493503,1495799,1504210,1504214,1505737,1512367,1512433,1512661,1515165,1515905,1517273,1517281,1517288,1528826,1528833

Modified: pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/GlyphTable.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/GlyphTable.java?rev=1542735&r1=1542734&r2=1542735&view=diff
==============================================================================
--- pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/GlyphTable.java (original)
+++ pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/GlyphTable.java Sun Nov 17 14:31:02 2013
@@ -22,7 +22,7 @@ import java.io.IOException;
  * A table in a true type font.
  * 
  * @author Ben Litchfield (ben@benlitchfield.com)
- * @version $Revision: 1.1 $
+ * 
  */
 public class GlyphTable extends TTFTable
 {
@@ -30,9 +30,9 @@ public class GlyphTable extends TTFTable
      * Tag to identify this table.
      */
     public static final String TAG = "glyf";
-    
+
     private GlyphData[] glyphs;
-    
+
     /**
      * This will read the required data from the stream.
      * 
@@ -40,7 +40,7 @@ public class GlyphTable extends TTFTable
      * @param data The stream to read the data from.
      * @throws IOException If there is an error reading the data.
      */
-    public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+    public void initData(TrueTypeFont ttf, TTFDataStream data) throws IOException
     {
         MaximumProfileTable maxp = ttf.getMaximumProfile();
         IndexToLocationTable loc = ttf.getIndexToLocation();
@@ -50,27 +50,26 @@ public class GlyphTable extends TTFTable
         int numGlyphs = maxp.getNumGlyphs();
         // the end of the glyph table
         long endOfGlyphs = offsets[numGlyphs];
-        long currentOffset = -1;
         long offset = getOffset();
         glyphs = new GlyphData[numGlyphs];
-        for( int i=0; i<numGlyphs; i++ )
+        for (int i = 0; i < numGlyphs; i++)
         {
             // end of glyphs reached?
             if (endOfGlyphs == offsets[i])
             {
                 break;
             }
-            // don't repeat glyphs
-            if (currentOffset == offsets[i])
+            // the current glyph isn't defined
+            // if the next offset equals the current index
+            if (offsets[i] == offsets[i + 1])
             {
                 continue;
             }
-            currentOffset = offsets[i];
             glyphs[i] = new GlyphData();
-            data.seek( offset + offsets[i] );
-            glyphs[i].initData( ttf, data );
+            data.seek(offset + offsets[i]);
+            glyphs[i].initData(ttf, data);
         }
-        for( int i=0; i<numGlyphs; i++ )
+        for (int i = 0; i < numGlyphs; i++)
         {
             GlyphData glyph = glyphs[i];
             // resolve composite glyphs
@@ -80,7 +79,7 @@ public class GlyphTable extends TTFTable
             }
         }
     }
-    
+
     /**
      * @return Returns the glyphs.
      */
@@ -88,7 +87,7 @@ public class GlyphTable extends TTFTable
     {
         return glyphs;
     }
-    
+
     /**
      * @param glyphsValue The glyphs to set.
      */

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java?rev=1542735&r1=1542734&r2=1542735&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java Sun Nov 17 14:31:02 2013
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.filter;
 
 import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
 import java.awt.image.DataBuffer;
 import java.awt.image.DataBufferByte;
 import java.io.IOException;
@@ -28,18 +29,20 @@ import javax.imageio.ImageIO;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpaceFactory;
 
 /**
  * This is used for the JPXDecode filter.
  *
- * @author <a href="mailto:timo.boehme@ontochem.com">Timo Böhme</a>
+ * @author <a href="mailto:timo.boehme@ontochem.com">Timo Boehme</a>
  *
  */
 public class JPXFilter implements Filter
 {
 
     /** Log instance. */
-    private static final Log log = LogFactory.getLog(JPXFilter.class);
+    private static final Log LOG = LogFactory.getLog(JPXFilter.class);
 
     /**
      * Decode JPEG2000 data using Java ImageIO library.
@@ -47,20 +50,30 @@ public class JPXFilter implements Filter
      * {@inheritDoc}
      *
      */
-    public void decode( InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex )
-        throws IOException
+    public void decode(InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex)
+            throws IOException
     {
-        BufferedImage bi = ImageIO.read( compressedData );
-        if ( bi != null )
+        BufferedImage bi = ImageIO.read(compressedData);
+        if (bi != null)
         {
             DataBuffer dBuf = bi.getData().getDataBuffer();
-            if ( dBuf.getDataType() == DataBuffer.TYPE_BYTE )
+            if (dBuf.getDataType() == DataBuffer.TYPE_BYTE)
             {
-                result.write( ( ( DataBufferByte ) dBuf ).getData() );
+                // maybe some wrong/missing values have to be revised/added
+                ColorModel colorModel = bi.getColorModel();
+                if (options.getItem(COSName.COLORSPACE) == null)
+                {
+                    options.setItem(COSName.COLORSPACE,
+                            PDColorSpaceFactory.createColorSpace(null, colorModel.getColorSpace()));
+                }
+                options.setInt(COSName.BITS_PER_COMPONENT, colorModel.getPixelSize() / colorModel.getNumComponents());
+                options.setInt(COSName.HEIGHT, bi.getHeight());
+                options.setInt(COSName.WIDTH, bi.getWidth());
+                result.write(((DataBufferByte) dBuf).getData());
             }
             else
             {
-                log.error( "Image data buffer not of type byte but type " + dBuf.getDataType() );
+                LOG.error("Image data buffer not of type byte but type " + dBuf.getDataType());
             }
         }
     }
@@ -68,9 +81,9 @@ public class JPXFilter implements Filter
     /**
      * {@inheritDoc}
      */
-    public void encode( InputStream rawData, OutputStream result, COSDictionary options, int filterIndex )
-        throws IOException
+    public void encode(InputStream rawData, OutputStream result, COSDictionary options, int filterIndex)
+            throws IOException
     {
-        System.err.println( "Warning: JPXFilter.encode is not implemented yet, skipping this stream." );
+        LOG.error("Warning: JPXFilter.encode is not implemented yet, skipping this stream.");
     }
 }

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85InputStream.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85InputStream.java?rev=1542735&r1=1542734&r2=1542735&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85InputStream.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85InputStream.java Sun Nov 17 14:31:02 2013
@@ -17,14 +17,14 @@
 package org.apache.pdfbox.io;
 
 import java.io.FilterInputStream;
-import java.io.InputStream;
 import java.io.IOException;
+import java.io.InputStream;
 
 /**
  * This class represents an ASCII85 stream.
  *
  * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
- * @version $Revision: 1.6 $
+ *
  */
 public class ASCII85InputStream extends FilterInputStream
 {
@@ -35,12 +35,20 @@ public class ASCII85InputStream extends 
     private byte[] ascii;
     private byte[] b;
 
+    private static final char TERMINATOR = '~';
+    private static final char OFFSET = '!';
+    private static final char NEWLINE = '\n';
+    private static final char RETURN = '\r';
+    private static final char SPACE = ' ';
+    private static final char PADDING_U = 'u';
+    private static final char Z = 'z';
+
     /**
      * Constructor.
      *
      * @param is The input stream to actually read from.
      */
-    public ASCII85InputStream( InputStream is )
+    public ASCII85InputStream(InputStream is)
     {
         super(is);
         index = 0;
@@ -59,9 +67,9 @@ public class ASCII85InputStream extends 
      */
     public final int read() throws IOException
     {
-        if( index >= n )
+        if (index >= n)
         {
-            if(eof)
+            if (eof)
             {
                 return -1;
             }
@@ -70,69 +78,72 @@ public class ASCII85InputStream extends 
             byte z;
             do
             {
-                int zz=(byte)in.read();
-                if(zz==-1)
+                int zz = (byte) in.read();
+                if (zz == -1)
                 {
-                    eof=true;
+                    eof = true;
                     return -1;
                 }
-                z = (byte)zz;
-            }  while( z=='\n' || z=='\r' || z==' ');
+                z = (byte) zz;
+            } while (z == NEWLINE || z == RETURN || z == SPACE);
 
-            if (z == '~' || z=='x')
+            if (z == TERMINATOR)
             {
-                eof=true;
-                ascii=b=null;
+                eof = true;
+                ascii = b = null;
                 n = 0;
                 return -1;
             }
-            else if (z == 'z')
+            else if (z == Z)
             {
-                b[0]=b[1]=b[2]=b[3]=0;
+                b[0] = b[1] = b[2] = b[3] = 0;
                 n = 4;
             }
             else
             {
-                ascii[0]=z; // may be EOF here....
-                for (k=1;k<5;++k)
+                ascii[0] = z; // may be EOF here....
+                for (k = 1; k < 5; ++k)
                 {
                     do
                     {
-                        int zz=(byte)in.read();
-                        if(zz==-1)
+                        int zz = (byte) in.read();
+                        if (zz == -1)
                         {
-                            eof=true;
+                            eof = true;
                             return -1;
                         }
-                        z=(byte)zz;
-                    } while ( z=='\n' || z=='\r' || z==' ' );
-                    ascii[k]=z;
-                    if (z == '~' || z=='x')
+                        z = (byte) zz;
+                    } while (z == NEWLINE || z == RETURN || z == SPACE);
+                    ascii[k] = z;
+                    if (z == TERMINATOR)
                     {
+                        // don't include ~ as padding byte
+                        ascii[k] = (byte) PADDING_U;
                         break;
                     }
                 }
                 n = k - 1;
-                if ( n==0 )
+                if (n == 0)
                 {
                     eof = true;
                     ascii = null;
                     b = null;
                     return -1;
                 }
-                if ( k < 5 )
+                if (k < 5)
                 {
-                    for (++k; k < 5; ++k )
+                    for (++k; k < 5; ++k)
                     {
-                        ascii[k] = 0x21;
+                        // use 'u' for padding
+                        ascii[k] = (byte) PADDING_U;
                     }
-                    eof=true;
+                    eof = true;
                 }
                 // decode stream
-                long t=0;
-                for ( k=0; k<5; ++k)
+                long t = 0;
+                for (k = 0; k < 5; ++k)
                 {
-                    z=(byte)(ascii[k] - 0x21);
+                    z = (byte) (ascii[k] - OFFSET);
                     if (z < 0 || z > 93)
                     {
                         n = 0;
@@ -143,10 +154,10 @@ public class ASCII85InputStream extends 
                     }
                     t = (t * 85L) + z;
                 }
-                for ( k = 3; k>=0; --k)
+                for (k = 3; k >= 0; --k)
                 {
-                    b[k] = (byte)(t & 0xFFL);
-                    t>>>=8;
+                    b[k] = (byte) (t & 0xFFL);
+                    t >>>= 8;
                 }
             }
         }
@@ -166,24 +177,24 @@ public class ASCII85InputStream extends 
      */
     public final int read(byte[] data, int offset, int len) throws IOException
     {
-        if(eof && index>=n)
+        if (eof && index >= n)
         {
             return -1;
         }
-        for(int i=0;i<len;i++)
+        for (int i = 0; i < len; i++)
         {
-            if(index<n)
+            if (index < n)
             {
-                data[i+offset]=b[index++];
+                data[i + offset] = b[index++];
             }
             else
             {
                 int t = read();
-                if ( t == -1 )
+                if (t == -1)
                 {
                     return i;
                 }
-                data[i+offset]=(byte)t;
+                data[i + offset] = (byte) t;
             }
         }
         return len;

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85OutputStream.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85OutputStream.java?rev=1542735&r1=1542734&r2=1542735&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85OutputStream.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/io/ASCII85OutputStream.java Sun Nov 17 14:31:02 2013
@@ -24,7 +24,7 @@ import java.io.OutputStream;
  * This class represents an ASCII85 output stream.
  *
  * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
- * @version $Revision: 1.7 $
+ *
  */
 public class ASCII85OutputStream extends FilterOutputStream
 {
@@ -42,22 +42,25 @@ public class ASCII85OutputStream extends
     private int maxline;
     private boolean flushed;
     private char terminator;
+    private static final char OFFSET = '!';
+    private static final char NEWLINE = '\n';
+    private static final char Z = 'z';
 
     /**
      * Constructor.
      *
      * @param out The output stream to write to.
      */
-    public ASCII85OutputStream( OutputStream out )
+    public ASCII85OutputStream(OutputStream out)
     {
-        super( out );
-        lineBreak = 36*2;
-        maxline = 36*2;
-        count=0;
-        indata=new byte[4];
-        outdata=new byte[5];
-        flushed=true;
-        terminator='~';
+        super(out);
+        lineBreak = 36 * 2;
+        maxline = 36 * 2;
+        count = 0;
+        indata = new byte[4];
+        outdata = new byte[5];
+        flushed = true;
+        terminator = '~';
     }
 
     /**
@@ -67,11 +70,11 @@ public class ASCII85OutputStream extends
      */
     public void setTerminator(char term)
     {
-        if(term<118 || term>126 || term=='z')
+        if (term < 118 || term > 126 || term == Z)
         {
             throw new IllegalArgumentException("Terminator must be 118-126 excluding z");
         }
-        terminator=term;
+        terminator = term;
     }
 
     /**
@@ -91,11 +94,11 @@ public class ASCII85OutputStream extends
      */
     public void setLineLength(int l)
     {
-        if( lineBreak > l )
+        if (lineBreak > l)
         {
             lineBreak = l;
         }
-        maxline=l;
+        maxline = l;
     }
 
     /**
@@ -111,44 +114,33 @@ public class ASCII85OutputStream extends
     /**
      * This will transform the next four ascii bytes.
      */
-    private final void  transformASCII85()
+    private final void transformASCII85()
     {
-        long word;
-        word=( (((indata[0] << 8) | (indata[1] &0xFF)) << 16) |
-        ( (indata[2] & 0xFF) << 8) | (indata[3] & 0xFF)
-        )    & 0xFFFFFFFFL;
-        // System.out.println("word=0x"+Long.toString(word,16)+" "+word);
+        long word = ((((indata[0] << 8) | (indata[1] & 0xFF)) << 16) | ((indata[2] & 0xFF) << 8) | (indata[3] & 0xFF)) & 0xFFFFFFFFL;
 
-        if (word == 0 )
+        if (word == 0)
         {
-            outdata[0]=(byte)'z';
-            outdata[1]=0;
+            outdata[0] = (byte) Z;
+            outdata[1] = 0;
             return;
         }
         long x;
-        x=word/(85L*85L*85L*85L);
-        // System.out.println("x0="+x);
-        outdata[0]=(byte)(x+'!');
-        word-=x*85L*85L*85L*85L;
-
-        x=word/(85L*85L*85L);
-        // System.out.println("x1="+x);
-        outdata[1]=(byte)(x+'!');
-        word-=x*85L*85L*85L;
-
-        x=word/(85L*85L);
-        // System.out.println("x2="+x);
-        outdata[2]=(byte)(x+'!');
-        word-=x*85L*85L;
-
-        x=word/85L;
-        // System.out.println("x3="+x);
-        outdata[3]=(byte)(x+'!');
+        x = word / (85L * 85L * 85L * 85L);
+        outdata[0] = (byte) (x + OFFSET);
+        word -= x * 85L * 85L * 85L * 85L;
+
+        x = word / (85L * 85L * 85L);
+        outdata[1] = (byte) (x + OFFSET);
+        word -= x * 85L * 85L * 85L;
+
+        x = word / (85L * 85L);
+        outdata[2] = (byte) (x + OFFSET);
+        word -= x * 85L * 85L;
 
-        // word-=x*85L;
+        x = word / 85L;
+        outdata[3] = (byte) (x + OFFSET);
 
-        // System.out.println("x4="+(word % 85L));
-        outdata[4]=(byte)((word%85L)+'!');
+        outdata[4] = (byte) ((word % 85L) + OFFSET);
     }
 
     /**
@@ -160,97 +152,73 @@ public class ASCII85OutputStream extends
      */
     public final void write(int b) throws IOException
     {
-        flushed=false;
-        indata[count++]=(byte)b;
-        if(count < 4 )
+        flushed = false;
+        indata[count++] = (byte) b;
+        if (count < 4)
         {
             return;
         }
         transformASCII85();
-        for(int i=0;i<5;i++)
+        for (int i = 0; i < 5; i++)
         {
-            if(outdata[i]==0)
+            if (outdata[i] == 0)
             {
                 break;
             }
             out.write(outdata[i]);
-            if(--lineBreak==0)
+            if (--lineBreak == 0)
             {
-                out.write('\n');
-                lineBreak=maxline;
+                out.write(NEWLINE);
+                lineBreak = maxline;
             }
         }
         count = 0;
     }
 
     /**
-     * This will write a chunk of data to the stream.
-     *
-     * @param b The byte buffer to read from.
-     * @param off The offset into the buffer.
-     * @param sz The number of bytes to read from the buffer.
-     *
-     * @throws IOException If there is an error writing to the underlying stream.
-     */
-    public final void write(byte[] b,int off, int sz) throws IOException
-    {
-        for(int i=0;i<sz;i++)
-        {
-            if(count < 3)
-            {
-                indata[count++]=b[off+i];
-            }
-            else
-            {
-                write(b[off+i]);
-            }
-        }
-    }
-
-    /**
      * This will flush the data to the stream.
      *
      * @throws IOException If there is an error writing the data to the stream.
      */
     public final void flush() throws IOException
     {
-        if(flushed)
+        if (flushed)
         {
             return;
         }
-        if(count > 0 )
+        if (count > 0)
         {
-            for( int i=count; i<4; i++ )
+            for (int i = count; i < 4; i++)
             {
-                indata[i]=0;
+                indata[i] = 0;
             }
             transformASCII85();
-            if(outdata[0]=='z')
+            if (outdata[0] == Z)
             {
-                for(int i=0;i<5;i++) // expand 'z',
+                for (int i = 0; i < 5; i++) // expand 'z',
                 {
-                    outdata[i]=(byte)'!';
+                    outdata[i] = (byte) OFFSET;
                 }
             }
-            for(int i=0;i<count+1;i++)
+            for (int i = 0; i < count + 1; i++)
             {
                 out.write(outdata[i]);
-                if(--lineBreak==0)
+                if (--lineBreak == 0)
                 {
-                    out.write('\n');
-                    lineBreak=maxline;
+                    out.write(NEWLINE);
+                    lineBreak = maxline;
                 }
             }
         }
-        if(--lineBreak==0)
+        if (--lineBreak == 0)
         {
-            out.write('\n');
+            out.write(NEWLINE);
         }
         out.write(terminator);
-        out.write('\n');
+        out.write(NEWLINE);
         count = 0;
-        lineBreak=maxline;
-        flushed=true;
+        lineBreak = maxline;
+        flushed = true;
         super.flush();
     }
 
@@ -263,28 +231,12 @@ public class ASCII85OutputStream extends
     {
         try
         {
-            super.close();
-        }
-        finally
-        {
-            indata=outdata=null;
-        }
-    }
-
-    /**
-     * This will flush the stream.
-     *
-     * @throws Throwable If there is an error.
-     */
-    protected void finalize() throws Throwable
-    {
-        try
-        {
             flush();
+            super.close();
         }
         finally
         {
-            super.finalize();
+            indata = outdata = null;
         }
     }
 }

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java?rev=1542735&r1=1542734&r2=1542735&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java Sun Nov 17 14:31:02 2013
@@ -19,15 +19,12 @@ package org.apache.pdfbox.pdfparser;
 import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.pdfbox.io.PushBackInputStream;
-import org.apache.pdfbox.io.RandomAccess;
-
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSBoolean;
@@ -41,7 +38,8 @@ import org.apache.pdfbox.cos.COSObject;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.cos.COSString;
 import org.apache.pdfbox.exceptions.WrappedIOException;
-
+import org.apache.pdfbox.io.PushBackInputStream;
+import org.apache.pdfbox.io.RandomAccess;
 import org.apache.pdfbox.persistence.util.COSObjectKey;
 
 /**
@@ -54,6 +52,10 @@ import org.apache.pdfbox.persistence.uti
 public abstract class BaseParser
 {
 
+    private static final long OBJECT_NUMBER_THRESHOLD = 10000000000L;
+
+    private static final long GENERATION_NUMBER_THRESHOLD = 65535;
+    
     /**
      * system property allowing to define size of push back buffer.
      */
@@ -1586,6 +1588,36 @@ public abstract class BaseParser
     }
 
     /**
+     * This will read a long from the Stream and throw an {@link IllegalArgumentException} if the long value
+     * has more than 10 digits (i.e. : bigger than {@link #OBJECT_NUMBER_THRESHOLD})
+     * @return
+     * @throws IOException
+     */
+    protected long readObjectNumber() throws IOException
+    {
+        long retval = readLong();
+        if(retval < 0 || retval >= OBJECT_NUMBER_THRESHOLD) {
+            throw new IOException("Object Number '" + retval + "' has more than 10 digits or is negative");
+        }
+        return retval;
+    }
+    
+    /**
+     * This will read a integer from the Stream and throw an {@link IllegalArgumentException} if the integer value
+     * has more than the maximum object revision (i.e. : bigger than {@link #GENERATION_NUMBER_THRESHOLD})
+     * @return
+     * @throws IOException
+     */
+    protected int readGenerationNumber() throws IOException
+    {
+        int retval = readInt();
+        if(retval < 0 || retval >= GENERATION_NUMBER_THRESHOLD) {
+            throw new IOException("Generation Number '" + retval + "' has more than 5 digits");
+        }
+        return retval;
+    }
+    
+    /**
      * This will read an integer from the stream.
      *
      * @return The integer that was read from the stream.
@@ -1597,8 +1629,57 @@ public abstract class BaseParser
         skipSpaces();
         int retval = 0;
 
+        StringBuilder intBuffer = readStringNumber();
+
+        try
+        {
+            retval = Integer.parseInt( intBuffer.toString() );
+        }
+        catch( NumberFormatException e )
+        {
+            pdfSource.unread(intBuffer.toString().getBytes("ISO-8859-1"));
+            throw new IOException( "Error: Expected an integer type, actual='" + intBuffer + "'" );
+        }
+        return retval;
+    }
+    
+
+    /**
+     * This will read an long from the stream.
+     *
+     * @return The long that was read from the stream.
+     *
+     * @throws IOException If there is an error reading from the stream.
+     */
+    protected long readLong() throws IOException
+    {
+        skipSpaces();
+        long retval = 0;
+
+        StringBuilder longBuffer = readStringNumber();
+
+        try
+        {
+            retval = Long.parseLong( longBuffer.toString() );
+        }
+        catch( NumberFormatException e )
+        {
+            pdfSource.unread(longBuffer.toString().getBytes("ISO-8859-1"));
+            throw new IOException( "Error: Expected a long type, actual='" + longBuffer + "'" );
+        }
+        return retval;
+    }
+
+    /**
+     * This method is used to read a token by the {@linkplain #readInt()} method and the {@linkplain #readLong()} method.
+     *  
+     * @return the token to parse as integer or long by the calling method.
+     * @throws IOException throws by the {@link #pdfSource} methods.
+     */
+    protected final StringBuilder readStringNumber() throws IOException
+    {
         int lastByte = 0;
-        StringBuffer intBuffer = new StringBuffer();
+        StringBuilder buffer = new StringBuilder();
         while( (lastByte = pdfSource.read() ) != 32 &&
                 lastByte != 10 &&
                 lastByte != 13 &&
@@ -1606,22 +1687,13 @@ public abstract class BaseParser
                 lastByte != 0 && //See sourceforge bug 853328
                 lastByte != -1 )
         {
-            intBuffer.append( (char)lastByte );
+            buffer.append( (char)lastByte );
         }
         if( lastByte != -1 )
         {
             pdfSource.unread( lastByte );
         }
-
-        try
-        {
-            retval = Integer.parseInt( intBuffer.toString() );
-        }
-        catch( NumberFormatException e )
-        {
-            pdfSource.unread(intBuffer.toString().getBytes("ISO-8859-1"));
-            throw new IOException( "Error: Expected an integer type, actual='" + intBuffer + "'" );
-        }
-        return retval;
+        return buffer;
     }
+
 }

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java?rev=1542735&r1=1542734&r2=1542735&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java Sun Nov 17 14:31:02 2013
@@ -335,6 +335,8 @@ public class NonSequentialPDFParser exte
             // seek to xref table
             setPdfSource(prev);
 
+            // skip white spaces
+            skipSpaces();
             // -- parse xref
             if (pdfSource.peek() == 'x')
             {
@@ -455,8 +457,8 @@ public class NonSequentialPDFParser exte
     private long parseXrefObjStream(long objByteOffset) throws IOException
     {
         // ---- parse indirect object head
-        readInt();
-        readInt();
+        readObjectNumber();
+        readGenerationNumber();
         readPattern(OBJ_MARKER);
 
         COSDictionary dict = parseCOSDictionary();
@@ -1178,8 +1180,8 @@ public class NonSequentialPDFParser exte
                 setPdfSource(offsetOrObjstmObNr);
 
                 // ---- we must have an indirect object
-                final int readObjNr = readInt();
-                final int readObjGen = readInt();
+                final long readObjNr = readObjectNumber();
+                final long readObjGen = readGenerationNumber();
                 readPattern(OBJ_MARKER);
 
                 // ---- consistency check

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFObjectStreamParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFObjectStreamParser.java?rev=1542735&r1=1542734&r2=1542735&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFObjectStreamParser.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFObjectStreamParser.java Sun Nov 17 14:31:02 2013
@@ -44,7 +44,7 @@ public class PDFObjectStreamParser exten
         LogFactory.getLog(PDFObjectStreamParser.class);
 
     private List<COSObject> streamObjects = null;
-    private List<Integer> objectNumbers = null;
+    private List<Long> objectNumbers = null;
     private COSStream stream;
 
     /**
@@ -92,13 +92,13 @@ public class PDFObjectStreamParser exten
         {
             //need to first parse the header.
             int numberOfObjects = stream.getInt( "N" );
-            objectNumbers = new ArrayList<Integer>( numberOfObjects );
+            objectNumbers = new ArrayList<Long>( numberOfObjects );
             streamObjects = new ArrayList<COSObject>( numberOfObjects );
             for( int i=0; i<numberOfObjects; i++ )
             {
-                int objectNumber = readInt();
-                int offset = readInt();
-                objectNumbers.add( new Integer( objectNumber ) );
+                long objectNumber = readObjectNumber();
+                long offset = readLong();
+                objectNumbers.add( new Long( objectNumber ) );
             }
             COSObject object = null;
             COSBase cosObject = null;

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java?rev=1542735&r1=1542734&r2=1542735&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java Sun Nov 17 14:31:02 2013
@@ -183,6 +183,7 @@ public class PDFParser extends BaseParse
                 {
                     break;
                 }
+                                
                 try
                 {
                     // don't reset flag to false if it is already true
@@ -205,7 +206,19 @@ public class PDFParser extends BaseParse
                          * we skipped over an object
                          */
                         LOG.warn("Parsing Error, Skipping Object", e);
+                        
+                        skipSpaces();
+                        long lastOffset = pdfSource.getOffset();
                         skipToNextObj();
+                        
+                        /* the nextObject is the one we want to skip 
+                         * so read the 'Object Number' without interpret it
+                         * in order to force the skipObject
+                         */
+                        if (lastOffset == pdfSource.getOffset()) {
+                            readStringNumber();
+                            skipToNextObj();
+                        }
                     }
                     else
                     {
@@ -508,7 +521,7 @@ public class PDFParser extends BaseParse
         //we are going to parse an normal object
         else
         {
-            int number = -1;
+            long number = -1;
             int genNum = -1;
             String objectKey = null;
             boolean missingObjectNumber = false;
@@ -521,7 +534,7 @@ public class PDFParser extends BaseParse
                 }
                 else
                 {
-                    number = readInt();
+                    number = readObjectNumber();
                 }
             }
             catch( IOException e )
@@ -530,12 +543,12 @@ public class PDFParser extends BaseParse
                 //statements after an object, of course this is nonsense
                 //but because we want to support as many PDFs as possible
                 //we will simply try again
-                number = readInt();
+                number = readObjectNumber();
             }
             if( !missingObjectNumber )
             {
                 skipSpaces();
-                genNum = readInt();
+                genNum = readGenerationNumber();
 
                 objectKey = readString( 3 );
                 //System.out.println( "parseObject() num=" + number +
@@ -677,7 +690,7 @@ public class PDFParser extends BaseParse
         /* This integer is the byte offset of the first object referenced by the xref or xref stream
          * Needed for the incremental update (PREV)
          */
-        getDocument().setStartXref(readInt());
+        getDocument().setStartXref(readLong());
         return true;
     }
 
@@ -710,8 +723,8 @@ public class PDFParser extends BaseParse
          */
         while(true)
         {
-            int currObjID = readInt(); // first obj id
-            int count = readInt(); // the number of objects in the xref table
+            long currObjID = readObjectNumber(); // first obj id
+            long count = readLong(); // the number of objects in the xref table
             skipSpaces();
             for(int i = 0; i < count; i++)
             {

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/VisualSignatureParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/VisualSignatureParser.java?rev=1542735&r1=1542734&r2=1542735&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/VisualSignatureParser.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/VisualSignatureParser.java Sun Nov 17 14:31:02 2013
@@ -176,7 +176,7 @@ public class VisualSignatureParser exten
         else 
         {
             //we are going to parse an normal object
-            int number = -1;
+            long number = -1;
             int genNum = -1;
             String objectKey = null;
             boolean missingObjectNumber = false;
@@ -189,7 +189,7 @@ public class VisualSignatureParser exten
                 } 
                 else 
                 {
-                    number = readInt();
+                    number = readObjectNumber();
                 }
             } 
             catch(IOException e) 
@@ -198,12 +198,12 @@ public class VisualSignatureParser exten
                 //statements after an object, of course this is nonsense
                 //but because we want to support as many PDFs as possible
                 //we will simply try again
-                number = readInt();
+                number = readObjectNumber();
             }
             if(!missingObjectNumber)
             {
                 skipSpaces();
-                genNum = readInt();
+                genNum = readGenerationNumber();
 
                 objectKey = readString(3);
                 //System.out.println( "parseObject() num=" + number +