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 2012/01/04 19:09:17 UTC

svn commit: r1227249 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: cos/COSDocument.java io/PushBackInputStream.java pdfparser/PDFParser.java pdfparser/XrefTrailerResolver.java pdfwriter/COSWriter.java

Author: lehmi
Date: Wed Jan  4 18:09:16 2012
New Revision: 1227249

URL: http://svn.apache.org/viewvc?rev=1227249&view=rev
Log:
PDFBOX-1196: use long instead of int for object offsets as proposed by Timo Boehme

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/PushBackInputStream.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java?rev=1227249&r1=1227248&r2=1227249&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java Wed Jan  4 18:09:16 2012
@@ -60,8 +60,8 @@ public class COSDocument extends COSBase
     /**
      * Maps object and generation id to object byte offsets.
      */
-    private final Map<COSObjectKey, Integer> xrefTable =
-        new HashMap<COSObjectKey, Integer>();
+    private final Map<COSObjectKey, Long> xrefTable =
+        new HashMap<COSObjectKey, Long>();
 
     /**
      * Document trailer dictionary.
@@ -89,7 +89,7 @@ public class COSDocument extends COSBase
 
     private boolean warnMissingClose = true;
     
-    private int startXref;
+    private long startXref;
     
     private boolean closed = false;
 
@@ -618,7 +618,7 @@ public class COSDocument extends COSBase
      * Each entry maps ObjectKeys to byte offsets in the file.
      * @param xrefTableValues  xref table entries to be added
      */
-    public void addXRefTable( Map<COSObjectKey, Integer> xrefTableValues )
+    public void addXRefTable( Map<COSObjectKey, Long> xrefTableValues )
     {
         xrefTable.putAll( xrefTableValues );
     }
@@ -628,7 +628,7 @@ public class COSDocument extends COSBase
      * to byte offsets in the file.
      * @return mapping of ObjectsKeys to byte offsets
      */
-    public Map<COSObjectKey, Integer> getXrefTable()
+    public Map<COSObjectKey, Long> getXrefTable()
     {
         return xrefTable;
     }
@@ -639,7 +639,7 @@ public class COSDocument extends COSBase
      * 
      * @param startXrefValue the value for startXref
      */
-    public void setStartXref(int startXrefValue)
+    public void setStartXref(long startXrefValue)
     {
         startXref = startXrefValue;
     }
@@ -647,9 +647,9 @@ public class COSDocument extends COSBase
     /**
      * Return the startXref Position of the parsed document. This will only be needed for incremental updates.
      * 
-     * @return a int with the old position of the startxref
+     * @return a long with the old position of the startxref
      */
-    public int getStartXref()
+    public long getStartXref()
     {
       return startXref;
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/PushBackInputStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/PushBackInputStream.java?rev=1227249&r1=1227248&r2=1227249&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/PushBackInputStream.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/PushBackInputStream.java Wed Jan  4 18:09:16 2012
@@ -31,7 +31,7 @@ public class PushBackInputStream extends
     /*
      * The current position in the file. 
      */
-    private int offset = 0;
+    private long offset = 0;
     
     /**
      * Constructor.
@@ -71,7 +71,7 @@ public class PushBackInputStream extends
      * Returns the current byte offset in the file.
      * @return the int byte offset
      */
-    public int getOffset()
+    public long getOffset()
     {
         return offset;
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java?rev=1227249&r1=1227248&r2=1227249&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java Wed Jan  4 18:09:16 2012
@@ -429,7 +429,7 @@ public class PDFParser extends BaseParse
      */
     private boolean parseObject() throws IOException
     {
-        int currentObjByteOffset = pdfSource.getOffset();
+        long currentObjByteOffset = pdfSource.getOffset();
         boolean isEndOfFile = false;
         skipSpaces();
         //peek at the next character to determine the type of object we are parsing
@@ -642,7 +642,7 @@ public class PDFParser extends BaseParse
     * @param pb The COSBase of this conflictObj
     * @throws IOException
     */
-    private void addObjectToConflicts(int offset, COSObjectKey key, COSBase pb) throws IOException
+    private void addObjectToConflicts(long offset, COSObjectKey key, COSBase pb) throws IOException
     {
         COSObject obj = new COSObject(null);
         obj.setObjectNumber( COSInteger.get( key.getNumber() ) );
@@ -686,7 +686,7 @@ public class PDFParser extends BaseParse
      * @return false on parsing error
      * @throws IOException If an IO error occurs.
      */
-    private boolean parseXrefTable( int startByteOffset ) throws IOException
+    private boolean parseXrefTable( long startByteOffset ) throws IOException
     {
         if(pdfSource.peek() != 'x')
         {
@@ -734,7 +734,7 @@ public class PDFParser extends BaseParse
                 {
                     try
                     {
-                        int currOffset = Integer.parseInt(splitString[0]);
+                        long currOffset = Long.parseLong(splitString[0]);
                         int currGenID = Integer.parseInt(splitString[1]);
                         COSObjectKey objKey = new COSObjectKey(currObjID, currGenID);
                         xrefTrailerResolver.setXRef(objKey, currOffset);
@@ -839,7 +839,7 @@ public class PDFParser extends BaseParse
      * @param objByteOffset the offset to start at
      * @throws IOException if there is an error parsing the stream
      */
-    public void parseXrefStream( COSStream stream, int objByteOffset ) throws IOException
+    public void parseXrefStream( COSStream stream, long objByteOffset ) throws IOException
     {
         xrefTrailerResolver.nextXrefObj( objByteOffset );
         xrefTrailerResolver.setTrailer( stream );
@@ -860,11 +860,11 @@ public class PDFParser extends BaseParse
     private static class ConflictObj
     {
 
-        private int offset;
+        private long offset;
         private COSObjectKey objectKey;
         private COSObject object;
 
-        public ConflictObj(int offsetValue, COSObjectKey key, COSObject pdfObject)
+        public ConflictObj(long offsetValue, COSObjectKey key, COSObject pdfObject)
         {
             this.offset = offsetValue;
             this.objectKey = key;
@@ -890,7 +890,7 @@ public class PDFParser extends BaseParse
             while(conflicts.hasNext())
             {
                 ConflictObj o = conflicts.next();
-                Integer offset = new Integer(o.offset);
+                Long offset = new Long(o.offset);
                 if(document.getXrefTable().containsValue(offset))
                 {
                     COSObject pdfObject = document.getObjectFromPool(o.objectKey);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java?rev=1227249&r1=1227248&r2=1227249&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java Wed Jan  4 18:09:16 2012
@@ -54,25 +54,32 @@ public class XrefTrailerResolver
     /**
      * A class which represents a xref/trailer object.
      */
-    class XrefTrailerObj
+    private class XrefTrailerObj
     {
         private COSDictionary trailer = null;
-        private final Map<COSObjectKey, Integer> xrefTable = new HashMap<COSObjectKey, Integer>();
+        private final Map<COSObjectKey, Long> xrefTable = new HashMap<COSObjectKey, Long>();
+        
+        /**
+         *  Default cosntructor.
+         */
+        private XrefTrailerObj()
+        {
+        }
     }
 
-    private final Map<Integer, XrefTrailerObj> bytePosToXrefMap = new HashMap<Integer, XrefTrailerObj>();
+    private final Map<Long, XrefTrailerObj> bytePosToXrefMap = new HashMap<Long, XrefTrailerObj>();
     private XrefTrailerObj curXrefTrailerObj   = null;
     private XrefTrailerObj resolvedXrefTrailer = null;
 
     /** Log instance. */
-    private static final Log log = LogFactory.getLog( XrefTrailerResolver.class );
+    private static final Log LOG = LogFactory.getLog( XrefTrailerResolver.class );
 
     /**
      * Signals that a new XRef object (table or stream) starts.
      * @param startBytePos the offset to start at
      *
      */
-    public void nextXrefObj( final int startBytePos )
+    public void nextXrefObj( final long startBytePos )
     {
         bytePosToXrefMap.put( startBytePos, curXrefTrailerObj = new XrefTrailerObj() );
     }
@@ -83,12 +90,12 @@ public class XrefTrailerResolver
      * @param objKey The objkey, with id and gen numbers
      * @param offset The byte offset in this file
      */
-    public void setXRef( COSObjectKey objKey, int offset )
+    public void setXRef( COSObjectKey objKey, long offset )
     {
         if ( curXrefTrailerObj == null )
         {
             // should not happen...
-            log.warn( "Cannot add XRef entry for '" + objKey.getNumber() + "' because XRef start was not signalled." );
+            LOG.warn( "Cannot add XRef entry for '" + objKey.getNumber() + "' because XRef start was not signalled." );
             return;
         }
         curXrefTrailerObj.xrefTable.put( objKey, offset );
@@ -104,7 +111,7 @@ public class XrefTrailerResolver
         if ( curXrefTrailerObj == null )
         {
             // should not happen...
-            log.warn( "Cannot add trailer because XRef start was not signalled." );
+            LOG.warn( "Cannot add trailer because XRef start was not signalled." );
             return;
         }
         curXrefTrailerObj.trailer = trailer;
@@ -121,24 +128,24 @@ public class XrefTrailerResolver
      * Thus for incomplete PDF documents with missing
      * startxref one could call this method with parameter value -1.
      */
-    public void setStartxref( int startxrefBytePos )
+    public void setStartxref( long startxrefBytePosValue )
     {
         if ( resolvedXrefTrailer != null )
         {
-            log.warn( "Method must be called only ones with last startxref value." );
+            LOG.warn( "Method must be called only ones with last startxref value." );
             return;
         }
 
         resolvedXrefTrailer = new XrefTrailerObj();
         resolvedXrefTrailer.trailer = new COSDictionary();
 
-        XrefTrailerObj curObj = bytePosToXrefMap.get( startxrefBytePos );
-        List<Integer>  xrefSeqBytePos = new ArrayList<Integer>();
+        XrefTrailerObj curObj = bytePosToXrefMap.get( startxrefBytePosValue );
+        List<Long>  xrefSeqBytePos = new ArrayList<Long>();
 
         if ( curObj == null )
         {
             // no XRef at given position
-            log.warn( "Did not found XRef object at specified startxref position " + startxrefBytePos );
+            LOG.warn( "Did not found XRef object at specified startxref position " + startxrefBytePosValue );
 
             // use all objects in byte position order (last entries overwrite previous ones)
             xrefSeqBytePos.addAll( bytePosToXrefMap.keySet() );
@@ -148,10 +155,10 @@ public class XrefTrailerResolver
         {
             // found starting Xref object
             // add this and follow chain defined by 'Prev' keys
-            xrefSeqBytePos.add( startxrefBytePos );
+            xrefSeqBytePos.add( startxrefBytePosValue );
             while ( curObj.trailer != null )
             {
-                int prevBytePos = curObj.trailer.getInt( COSName.PREV, -1 );
+                long prevBytePos = curObj.trailer.getLong( COSName.PREV, -1L );
                 if ( prevBytePos == -1 )
                 {
                     break;
@@ -160,7 +167,7 @@ public class XrefTrailerResolver
                 curObj = bytePosToXrefMap.get( prevBytePos );
                 if ( curObj == null )
                 {
-                    log.warn( "Did not found XRef object pointed to by 'Prev' key at position " + prevBytePos );
+                    LOG.warn( "Did not found XRef object pointed to by 'Prev' key at position " + prevBytePos );
                     break;
                 }
                 xrefSeqBytePos.add( prevBytePos );
@@ -176,7 +183,7 @@ public class XrefTrailerResolver
         }
 
         // merge used and sorted XRef/trailer
-        for ( Integer bPos : xrefSeqBytePos )
+        for ( Long bPos : xrefSeqBytePos )
         {
             curObj = bytePosToXrefMap.get( bPos );
             if ( curObj.trailer != null )
@@ -192,6 +199,7 @@ public class XrefTrailerResolver
      * Gets the resolved trailer. Might return <code>null</code> in case
      * {@link #setStartxref(int)} was not called before.
      *
+     * @return the trailer if available
      */
     public COSDictionary getTrailer()
     {
@@ -202,8 +210,9 @@ public class XrefTrailerResolver
      * Gets the resolved xref table. Might return <code>null</code> in case
      *  {@link #setStartxref(int)} was not called before.
      *
+     * @return the xrefTable if available
      */
-    public Map<COSObjectKey, Integer> getXrefTable()
+    public Map<COSObjectKey, Long> getXrefTable()
     {
         return ( resolvedXrefTrailer == null ) ? null : resolvedXrefTrailer.xrefTable;
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java?rev=1227249&r1=1227248&r2=1227249&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java Wed Jan  4 18:09:16 2012
@@ -249,7 +249,7 @@ public class COSWriter implements ICOSVi
         {
           COSDocument cosDoc = doc.getDocument();
           
-          Map<COSObjectKey, Integer> xrefTable = cosDoc.getXrefTable();
+          Map<COSObjectKey, Long> xrefTable = cosDoc.getXrefTable();
           Set<COSObjectKey> keySet = xrefTable.keySet();
           long highestNumber=0;
           for ( COSObjectKey cosObjectKey : keySet ) 
@@ -758,17 +758,17 @@ public class COSWriter implements ICOSVi
      * that represent a cluster of the size 3. 5 is follow by three other
      * related numbers and create a cluster of size 4. etc.
      * 
-     * @param xRefEntries list with the xRef entries that was written
+     * @param xRefEntriesList list with the xRef entries that was written
      * @return a integer array with the ranges
      */
-    protected Integer[] getXRefRanges(List<COSWriterXRefEntry> xRefEntries)
+    protected Integer[] getXRefRanges(List<COSWriterXRefEntry> xRefEntriesList)
     {
         int nr = 0;
         int last = -2;
         int count = 1;
 
         ArrayList<Integer> list = new ArrayList<Integer>();
-        for( Object object : xRefEntries )
+        for( Object object : xRefEntriesList )
         {
             nr = (int)((COSWriterXRefEntry)object).getKey().getNumber();
             if (nr == last + 1)
@@ -789,7 +789,7 @@ public class COSWriter implements ICOSVi
             }
         }
         // If no new entry is found, we need to write out the last result
-        if(xRefEntries.size() > 0)
+        if(xRefEntriesList.size() > 0)
         {
             list.add(last - count + 1);
             list.add(count);