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 +