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 2016/01/31 16:54:49 UTC
svn commit: r1727837 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
Author: lehmi
Date: Sun Jan 31 15:54:49 2016
New Revision: 1727837
URL: http://svn.apache.org/viewvc?rev=1727837&view=rev
Log:
PDFBOX-3189: detect broken object streams, remove missing object streams when rebuilding the xref table
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java?rev=1727837&r1=1727836&r2=1727837&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java Sun Jan 31 15:54:49 2016
@@ -610,11 +610,12 @@ public class COSParser extends BaseParse
for (COSObject obj : objToBeParsed.remove(objToBeParsed.firstKey()))
{
COSBase parsedObj = parseObjectDynamically(obj, false);
-
- obj.setObject(parsedObj);
- addNewToList(toBeParsedList, parsedObj, addedObjects);
-
- parsedObjects.add(getObjectId(obj));
+ if (parsedObj != null)
+ {
+ obj.setObject(parsedObj);
+ addNewToList(toBeParsedList, parsedObj, addedObjects);
+ parsedObjects.add(getObjectId(obj));
+ }
}
}
}
@@ -818,7 +819,16 @@ public class COSParser extends BaseParse
{
// parse object stream
PDFObjectStreamParser parser = new PDFObjectStreamParser((COSStream) objstmBaseObj, document);
- parser.parse();
+ try
+ {
+ parser.parse();
+ }
+ catch(IOException exception)
+ {
+ LOG.debug("Stop reading object stream "+objstmObjNr+" due to an exception", exception);
+ // the error is handled in parseDictObjects
+ return;
+ }
// get set of object numbers referenced for this object stream
final Set<Long> refObjNrs = xrefTrailerResolver.getContainedObjectNumbers(objstmObjNr);
@@ -1279,6 +1289,34 @@ public class COSParser extends BaseParse
bfSearchForObjects();
if (bfSearchCOSObjectKeyOffsets != null && !bfSearchCOSObjectKeyOffsets.isEmpty())
{
+ List<COSObjectKey> objStreams = new ArrayList<COSObjectKey>();
+ // find all object streams
+ for (COSObjectKey key : xrefOffset.keySet())
+ {
+ Long offset = xrefOffset.get(key);
+ if (offset != null && offset < 0 )
+ {
+ COSObjectKey objStream = new COSObjectKey(-offset, 0);
+ if (!objStreams.contains(objStream))
+ {
+ objStreams.add(new COSObjectKey(-offset, 0));
+ }
+ }
+ }
+ // remove all found object streams
+ for (COSObjectKey key : bfSearchCOSObjectKeyOffsets.keySet())
+ {
+ objStreams.remove(key);
+ }
+ // remove all objects which are part of an object stream which wasn't found
+ for (COSObjectKey key : objStreams)
+ {
+ Set<Long> objects = xrefTrailerResolver.getContainedObjectNumbers((int)(key.getNumber()));
+ for (Long objNr :objects)
+ {
+ xrefOffset.remove(new COSObjectKey(objNr, 0));
+ }
+ }
LOG.debug("Replaced read xref table with the results of a brute force search");
xrefOffset.putAll(bfSearchCOSObjectKeyOffsets);
}