221 lines · 6.8 KB · Text
RawDownload
%    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: pphs.ps,v 1.6 2003/08/08 18:45:05 ray Exp $% 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) { f read4 =only } (least # objs/page) ptag  (2) { f read4 =only } (offset of p. 1 object (+PHS length if beyond PHS)) ptag  (3) { f read2 dup =only /nb3 exch def } (# bits for # objs/page delta) ptag  (4) { f read4 =only } (least # bytes/page) ptag  (5) { f read2 dup =only /nb5 exch def } (# bits for # bytes/page delta) ptag  (6) { f read4 =only } (least content stream offset-in-page) ptag  (7) { f read2 dup =only /nb7 exch def } (# bits for content stream offset delta) ptag  (8) { f read4 =only } (least content stream length) ptag  (9) { f read2 dup =only /nb9 exch def } (# bits for content stream length delta) ptag  (10) { f read2 dup =only /nb10 exch def } (# bits for # of shared obj refs) ptag  (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 numerators) 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 shared obj refs (see 10)) ptag  (*4) { [ nso { [ exch { f nb11 readn } repeat ] } forall ] ==only } (shared obj indices (see 11)) ptag  (*5) { [ nso { [ exch { f nb12 readn } repeat ] } forall ] ==only } (shared obj ref pos numerators (see 12)) ptag  (*6) { [ npages { f nb7 readn } repeat ] ==only } (content stream offset-in-page deltas (see 6,7)) ptag  (*7) { [ npages { f nb9 readn } repeat ] ==only } (content stream length deltas (see 8,9)) ptag   end		% temp dict } 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)) ptag  (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) ptag  (6) { f read4 =only } (least shared obj group length) ptag  (7) { f read2 dup =only /nb7 exch def } (# bits for shared obj group length delta) ptag   /nse n4 def  (*1) { [ nse { f nb7 readn } repeat ] ==only } (shared obj group length deltas (see 6,7)) ptag  (*2) { [ nse { f 1 readn } repeat ] dup ==only /md5s exch def } (MD5 present?) ptag  (*3:) = md5s {    0 ne {      (  ) print f 16 string readstring pop      (%stdout) (w) file dup 3 -1 roll writehexstring closefile () =    } if  } forall  (*4) { [ nse { f nb5 readn } repeat ] ==only } (# objs/group (see 5)) ptag   end		% temp dict } bind def % 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