aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2009-03-08 19:58:34 +0100
committerJay Berkenbilt <ejb@ql.org>2009-03-08 19:58:34 +0100
commit1c7c6dd161856c121416c1acb39239a073713104 (patch)
treeb5e32381367db18c0ee44b90d5f4fb5acfa325e8
parent8bd09112812f1f0579b9c95e819540d2c6be6e4d (diff)
downloadqpdf-1c7c6dd161856c121416c1acb39239a073713104.tar.zst
fix offset calculation bug when writing object streams
git-svn-id: svn+q:///qpdf/trunk@657 71b93d88-0707-0410-a8cf-f5a4172ac649
-rwxr-xr-xqpdf/fix-qdf38
1 files changed, 29 insertions, 9 deletions
diff --git a/qpdf/fix-qdf b/qpdf/fix-qdf
index bdc96717..7dc1f7e4 100755
--- a/qpdf/fix-qdf
+++ b/qpdf/fix-qdf
@@ -72,6 +72,7 @@ my $st_done = ++$cur_state;
my @ostream = ();
my @ostream_offsets = ();
+my @ostream_discarded = ();
my $ostream_idx = 0;
my $ostream_id = 0;
my $ostream_extends = "";
@@ -130,13 +131,17 @@ while (defined($line = get_line()))
}
elsif ($state == $st_in_ostream_dict)
{
- if ($line =~ m,/Extends (\d+ 0 R),)
+ if ($line =~ m/^stream/)
{
- $ostream_extends = $1;
+ $state = $st_in_ostream_offsets;
}
- elsif ($line =~ m/^stream/)
+ else
{
- $state = $st_in_ostream_offsets;
+ push(@ostream_discarded, $line);
+ if ($line =~ m,/Extends (\d+ 0 R),)
+ {
+ $ostream_extends = $1;
+ }
}
# discard line
}
@@ -149,6 +154,10 @@ while (defined($line = get_line()))
$state = $st_in_ostream_outer;
push(@ostream, $line);
}
+ else
+ {
+ push(@ostream_discarded, $line);
+ }
# discard line
}
elsif ($state == $st_in_ostream_outer)
@@ -327,16 +336,20 @@ sub write_ostream
++$onum;
$offsets .= "$onum $_\n";
}
+ my $offset_adjust = length($offsets);
$first += length($offsets);
$stream_length += length($offsets);
- print " /Length $stream_length\n";
- print " /N $n\n";
- print " /First $first\n";
+ my $dict_data = "";
+ $dict_data .= " /Length $stream_length\n";
+ $dict_data .= " /N $n\n";
+ $dict_data .= " /First $first\n";
if ($ostream_extends)
{
- print " /Extends $ostream_extends\n";
+ $dict_data .= " /Extends $ostream_extends\n";
}
- print ">>\n";
+ $dict_data .= ">>\n";
+ $offset_adjust += length($dict_data);
+ print $dict_data;
print "stream\n";
print $offsets;
foreach (@ostream)
@@ -344,9 +357,16 @@ sub write_ostream
print $_;
}
+ for (@ostream_discarded)
+ {
+ $offset -= length($_);
+ }
+ $offset += $offset_adjust;
+
$ostream_idx = 0;
$ostream_id = 0;
@ostream = ();
@ostream_offsets = ();
+ @ostream_discarded = ();
$ostream_extends = "";
}