Sie sind auf Seite 1von 4

% % % % % % % % % % % % % %

Copyright (C) 2001 Aladdin Enterprises. All rights reserved. This software is provided AS-IS with no warranty, either express or implied. This software is distributed under license and may not be copied, modified or distributed except as expressly authorized under the terms of the license contained in the file LICENSE in this distribution. For more information about licensing, please refer to http://www.ghostscript.com/licensing/. For information on commercial licensing, go to http://www.artifex.com/licensing/ or contact Artifex Software, Inc., 101 Lucas Valley Road #110, San Rafael, CA 94903, U.S.A., +1(415)492-9861.

% $Id$ % Print Linearized PDF hint streams % Utilities /read1 { % <file> read1 <value> read not { (**** Unexpected EOF) = flush quit } if } bind def /read2 { % <file> read2 <value> dup read1 8 bitshift exch read1 add } bind def /read4 { % <file> read4 <value> dup read2 16 bitshift exch read2 add } bind def % Free variables: Bits, Bitsleft /readninit { % - <readninit> /Bits 0 def /Bitsleft 0 def } bind def /pdftoken { % <file> pdftoken <token> dup token pop dup type /nametype eq 1 index xcheck and { dup dup (<<) cvn eq exch ([) eq or { exec exch { dup pdftoken dup dup (>>) cvn eq exch (]) eq or { exch pop exec exit } if exch } loop } { exch pop } ifelse } { exch pop } ifelse } bind def /makemask { % <nbits> makemask <mask> 1 exch bitshift 1 sub } bind def /readn { % <file> <nbits> readn <value> dup Bitsleft le { exch pop /Bitsleft Bitsleft 2 index sub def makemask Bits Bitsleft neg bitshift and

} { Bitsleft makemask Bits and exch Bitsleft sub exch 1 index bitshift 3 1 roll /Bits 2 index read1 def /Bitsleft 8 def readn add } ifelse } bind def /sread { % <string> sread <file> 0 () /SubFileDecode filter } bind def /ptag { % <pre-tag> <proc> <post-tag> ptag 3 -1 roll print (: ) print exch exec ( % ) print = } bind def % Print the linearization parameters dictionary. /plpkeys << /E (end of p. 1 objects) /L (total file length) /H (PHS start + length) /N (# of pages) /O (p. 1 object #) /T (offset of first main xref entry) >> def /plpdict { % <dict> plpdict (<<) = plpkeys { 2 index 2 index .knownget { % Stack: dict key label value ( ) print 3 -1 roll ===only ( ) print ===only ( % ) print = } { pop pop } ifelse } forall { plpkeys 2 index known { pop pop } { ( ) print exch ===only ( ) print === } ifelse } forall (>>) = } bind def % Print the Page Offset Hint Table. /ppoht { % <npages> <file> ppoht 20 dict begin /f exch def /npages exch def readninit (1) { (2) { (3) { (4) { (5) { (6) { (7) { a) ptag f f f f f f f read4 read4 read2 read4 read2 read4 read2 =only } (least # objs/page) ptag =only } (offset of p. 1 object (+PHS length if beyond PHS)) ptag dup =only /nb3 exch def } (# bits for # objs/page delta) ptag =only } (least # bytes/page) ptag dup =only /nb5 exch def } (# bits for # bytes/page delta) ptag =only } (least content stream offset-in-page) ptag dup =only /nb7 exch def } (# bits for content stream offset delt

(8) { f read4 =only } (least content stream length) ptag (9) { f read2 dup =only /nb9 exch def } (# bits for content stream length delt a) ptag (10) { f read2 dup =only /nb10 exch def } (# bits for # of shared obj refs) pt ag (11) { f read2 dup =only /nb11 exch def } (# bits for shared obj indices) ptag (12) { f read2 dup =only /nb12 exch def } (# bits for shared obj ref pos numer ators) ptag (13) { f read2 =only } (shared obj ref pos denominator) ptag (*1) { [ npages { f nb3 readn } repeat ] ==only } (# objs/page deltas (see 1,3 )) ptag (*2) { [ npages { f nb5 readn } repeat ] ==only } (# bytes/page deltas (see 4, 5)) ptag (*3) { [ npages { f nb10 readn } repeat ] dup ==only /nso exch def } (# of sha red obj refs (see 10)) ptag (*4) { [ nso { [ exch { f nb11 readn } repeat ] } forall ] ==only } (shared ob j indices (see 11)) ptag (*5) { [ nso { [ exch { f nb12 readn } repeat ] } forall ] ==only } (shared ob j ref pos numerators (see 12)) ptag (*6) { [ npages { f nb7 readn } repeat ] ==only } (content stream offset-in-pa ge deltas (see 6,7)) ptag (*7) { [ npages { f nb9 readn } repeat ] ==only } (content stream length delta s (see 8,9)) ptag end } bind def % Print the Shared Objects Hint Table. /psoht { % <file> psoht 20 dict begin /f exch def readninit (1) { f read4 =only } (first shared obj #) ptag (2) { f read4 =only } (first shared obj offset (+PHS length if beyond PHS)) pt ag (3) { f read4 dup =only /n3 exch def } (# of p. 1 shared objs) ptag (4) { f read4 dup =only /n4 exch def } (total # of shared objs) ptag (5) { f read2 dup =only /nb5 exch def } (# bits for # of shared objs/group) pt ag (6) { f read4 =only } (least shared obj group length) ptag (7) { f read2 dup =only /nb7 exch def } (# bits for shared obj group length de lta) ptag /nse n4 def (*1) { [ nse { f nb7 readn (see 6,7)) ptag (*2) { [ nse { f 1 readn } ptag (*3:) = md5s { 0 ne { ( ) print f 16 string (%stdout) (w) file dup } if } forall (*4) { [ nse { f nb5 readn } repeat ] ==only } (shared obj group length deltas repeat ] dup ==only /md5s exch def } (MD5 present?) % temp dict

readstring pop 3 -1 roll writehexstring closefile () = } repeat ] ==only } (# objs/group (see 5)) ptag

end } bind def

% temp dict

% Print the Primary Hint Stream of a PDF file. /pphs { % <file> pphs /pdf exch def % Read the linearization parameter dictionary. { pdf pdftoken /obj eq { exit } if } loop pdf pdftoken /lpdict exch def /lpdict type /dicttype eq { lpdict /Linearized known } { false } ifelse { (Not a linearized PDF file.) = stop } if lpdict plpdict flush % Read the primary hint stream. null { pdf pdftoken dup /stream eq { pop exit } if exch pop } loop /phsdict exch def % Remove Length if indirect reference. phsdict 0 known { phsdict 0 undef phsdict /Length undef } if (PHS: ) print phsdict === flush pdf 0 (endstream) /SubFileDecode filter dup 64000 string readstring pop exch closefile sread /phsdata exch def % Decode the hint stream data if necessary. phsdict /Filter .knownget { phsdata exch filter dup 5000 string readstring pop exch closefile sread /phsdata exch def } if % Adobe says we can assume /P = 0. (Page Offset Hint Table:) = lpdict /N get phsdata phsdict /S get string readstring pop sread ppoht (Shared Objects Hint Table:) = phsdata psoht } bind def % Check for command line arguments. [ shellarguments { ] dup length 1 eq { 0 get (r) file dup pphs closefile } { (Usage: pphs filename.pdf\n) print flush } ifelse } { pop } ifelse