From 1c7c6dd161856c121416c1acb39239a073713104 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 8 Mar 2009 18:58:34 +0000 Subject: fix offset calculation bug when writing object streams git-svn-id: svn+q:///qpdf/trunk@657 71b93d88-0707-0410-a8cf-f5a4172ac649 --- qpdf/fix-qdf | 38 +++++++++++++++++++++++++++++--------- 1 file 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 = ""; } -- cgit v1.2.3-54-g00ecf