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 2014/10/22 19:10:57 UTC
svn commit: r1633653 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java
Author: lehmi
Date: Wed Oct 22 17:10:57 2014
New Revision: 1633653
URL: http://svn.apache.org/r1633653
Log:
PDFBOX-2441: added check/repair of xref stream offset, rearrange some code
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java?rev=1633653&r1=1633652&r2=1633653&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java Wed Oct 22 17:10:57 2014
@@ -369,14 +369,11 @@ public class NonSequentialPDFParser exte
long startXrefOffset = document.getStartXref();
// check the startxref offset
- if (isLenient)
+ long fixedOffset = checkXRefOffset(startXrefOffset);
+ if (fixedOffset > -1)
{
- long fixedOffset = checkXRefOffset(startXrefOffset);
- if (fixedOffset > -1)
- {
- startXrefOffset = fixedOffset;
- }
- document.setStartXref(startXrefOffset);
+ startXrefOffset = fixedOffset;
+ document.setStartXref(startXrefOffset);
}
long prev = startXrefOffset;
// ---- parse whole chain of xref tables/object streams using PREV
@@ -417,15 +414,22 @@ public class NonSequentialPDFParser exte
if(trailer.containsKey(COSName.XREF_STM))
{
int streamOffset = trailer.getInt(COSName.XREF_STM);
+ // check the xref stream reference
+ fixedOffset = checkXRefOffset(streamOffset);
+ if (fixedOffset > -1 && fixedOffset != streamOffset)
+ {
+ streamOffset = (int)fixedOffset;
+ trailer.setInt(COSName.XREF_STM, streamOffset);
+ }
setPdfSource(streamOffset);
skipSpaces();
parseXrefObjStream(prev, false);
}
prev = trailer.getInt(COSName.PREV);
- if (isLenient && prev > -1)
+ if (prev > -1)
{
// check the xref table reference
- long fixedOffset = checkXRefOffset(prev);
+ fixedOffset = checkXRefOffset(prev);
if (fixedOffset > -1 && fixedOffset != prev)
{
prev = fixedOffset;
@@ -437,10 +441,10 @@ public class NonSequentialPDFParser exte
{
// parse xref stream
prev = parseXrefObjStream(prev, true);
- if (isLenient && prev > -1)
+ if (prev > -1)
{
// check the xref table reference
- long fixedOffset = checkXRefOffset(prev);
+ fixedOffset = checkXRefOffset(prev);
if (fixedOffset > -1 && fixedOffset != prev)
{
prev = fixedOffset;
@@ -457,10 +461,7 @@ public class NonSequentialPDFParser exte
document.setTrailer(trailer);
document.setIsXRefStream(XRefType.STREAM == xrefTrailerResolver.getXrefType());
// check the offsets of all referenced objects
- if (isLenient)
- {
- checkXrefOffsets();
- }
+ checkXrefOffsets();
// ---- prepare encryption if necessary
COSBase trailerEncryptItem = document.getTrailer().getItem(COSName.ENCRYPT);
@@ -1682,6 +1683,11 @@ public class NonSequentialPDFParser exte
*/
private long checkXRefOffset(long startXRefOffset) throws IOException
{
+ // repair mode isn't available in non-lenient mode
+ if (!isLenient)
+ {
+ return startXRefOffset;
+ }
setPdfSource(startXRefOffset);
if (pdfSource.peek() == X && checkBytesAtOffset(XREF_TABLE))
{
@@ -1778,6 +1784,11 @@ public class NonSequentialPDFParser exte
*/
private void checkXrefOffsets() throws IOException
{
+ // repair mode isn't available in non-lenient mode
+ if (!isLenient)
+ {
+ return;
+ }
Map<COSObjectKey, Long> xrefOffset = xrefTrailerResolver.getXrefTable();
if (xrefOffset != null)
{