123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756 |
- % Copyright (C) 2000, 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: dumphint.ps,v 1.2 2004/04/08 16:18:25 giles Exp $
- % Linearized PDF hint formatting utility.
- %
- % Linearized PDF hints generated by Acrobat suite seem to deviate from
- % the published specification.
- %
- % /P (page offset hint table) key in hint stream is not generated by
- % Adobe products. The key is no longer required in PDF 1.5.
- %
- % Per-page items 4 and 5 of the page offset hint table start from 1st
- % page rather than 2nd page as the spec claims.
- %
- % All array entries start from the new byte boundary.
- %
- /table_width 79 def
- /col1_width 66 def
- % Skip bits to the next byte boundary
- /bytealign { % <stream> bytealign -
- begin /N 0 def /B 0 def end
- } bind def
- % Set bit stream position and align it to byte boundary
- /set_align { % <<>> pos set_align -
- exch begin
- S exch setfileposition
- /N 0 def /B 0 def
- end
- } bind def
- % Read requested number of bits from the bit stream.
- /bitread { % <bstream> <width> bitwrite <value>
- exch begin
- 0 % bit val
- {
- 1 index N .min % bit val m
- dup 3 1 roll % bit m val m
- bitshift % bit m val<<m
- B 2 index N sub % bit m val<<m B m-N
- bitshift add % bit m val<<m+B>>(N-m)
- 3 -1 roll % m val' bit
- 2 index sub % m val' bit'
- 3 -1 roll % val' bit' m
- N exch sub dup % val' bit' N' N'
- 1 exch bitshift % val' bit' N' 1<<N'
- 1 sub B and % val' bit' N' B&(1<<N')
- /B exch def % val' bit' N'
- /N exch def % val' bit'
- dup 0 le {
- pop exit % val'
- } if
- /N N 8 add def
- /B B 8 bitshift S read not { 0 ( *** EOF! *** ) = } if add def
- exch
- } loop % bit' val'
- end
- } bind def
- % Print a string several times
- /multiprint { % cnt (s) multiprint -
- exch { dup print } repeat pop
- } bind def
- % Split the line into 2 substrings.
- /split_line { % (s) split_line () ()
- dup length col1_width gt {
- col1_width 1 sub
- dup -1 0 {
- dup % (s) w i i
- 3 index % (s) w i i ()
- exch get % (s) w i c
- 32 eq {
- exch pop exit
- } if
- pop
- } for
- 1 add % (s) w'
- 1 index exch % (s) (s) w'
- 0 exch % (s) (s) 0 w'
- getinterval % (s) (v)
- } {
- dup % (s) (s)
- } ifelse
- (\n) search {
- 4 1 roll % (pre) (s) (post) (match)
- pop pop % (pre) (s)
- 1 index length % (pre) (s) len
- 1 add % (pre) (s) len+1
- } {
- exch % (pre) (s)
- 1 index length % (pre) (s) len
- } ifelse
- 1 index length % (pre) (s) len Len
- 1 index sub % (pre) (s) len Len-len
- getinterval % (pre) (post)
- } bind def
- % Print a 2 column table. The string is printed in 1st column
- % left-aligned. The number is printed in 2nd column right-aligned.
- /two_column { % n () two_column -
- split_line % n (a) ()
- 3 1 roll % () n (a)
- dup length % () n (a) len
- exch print % () n len
- exch =string cvs % () len (n)
- dup length % () len (n) len2
- 3 -1 roll add % () (n) len+len2
- //table_width % () (n) len+len2 78
- exch sub % () (n) 78-len+len2
- ( ) multiprint % () (n)
- = % ()
- { dup length 0 eq { exit } if
- split_line exch =
- } loop
- pop
- () =
- } bind def
- % Print the header of a hint table
- /table_header { % () table_header -
- dup length dup
- table_width exch sub 2 idiv % () len sp
- dup ( ) multiprint % () len sp
- 3 -1 roll = % len sp
- ( ) multiprint % len
- (=) multiprint
- ()= ()=
- } bind def
- % Pretty-print an array on top level
- /dump_array { % [ ] dump_array -
- ([) = ( ) print
- 1 exch {
- =string cvs % pos ()
- dup length dup % pos () len len
- 3 index add 1 add % pos () len len+pos+1
- table_width gt {
- () =
- ( ) print % pos () len
- 2 add % pos () pos'
- 3 1 roll print pop % pos'
- } {
- ( ) print % pos () len
- exch print % pos len
- add 1 add % pos'
- } ifelse
- } forall
- pop
- () = (]) =
- } bind def
- % Pretty-print an array on 2nd level
- /dump_array2 { % [ ] dump_array2 -
- ( [) print
- 3 exch {
- =string cvs % pos ()
- dup length dup % pos () len len
- 3 index add 1 add % pos () len len+pos+1
- table_width 2 sub gt {
- () =
- ( ) print % pos () len
- 4 add % pos () pos'
- 3 1 roll print pop % pos'
- } {
- ( ) print % pos () len
- exch print % pos len
- add 1 add % pos'
- } ifelse
- } forall
- pop
- ( ]) =
- } bind def
- % Print an array header
- /array_header {
- () = =
- } bind def
- % Analyze the page offset hint table.
- /dump_page_offset_table { % - dump_page_offset_table -
- hint_stream
-
- dup 32 bitread
- dup /hint_minnop exch def
- (1. The least number of objects in a page.) two_column
- dup 32 bitread
- dup /hint_1st_obj exch def
- (2. Location of the first page's page object.) two_column
- dup 16 bitread
- dup /hint_maxnopbits exch def
- (3. Bits for difference between max and min number of page objects.) two_column
- dup 32 bitread
- dup /hint_minpl exch def
- (4. Least length of a page.) two_column
- dup 16 bitread
- dup /hint_maxplbits exch def
- (5. Bits for difference between max and min length of a page.) two_column
- dup 32 bitread
- dup /hint_minsco exch def
- (6. Least start of Contents offset. )
- 1 index 0 ne { (\n*** Acrobat expects 0 ***) concatstrings } if
- two_column
- dup 16 bitread
- dup /hint_maxscobits exch def
- (7. Bits for difference between max and min offset to the start of the content stream.) two_column
- dup 32 bitread
- dup /hint_mincl exch def
- (8. Least contents length.) two_column
- dup 16 bitread
- dup /hint_maxclbits exch def
- (9. Bits needed to represent the greatest Contents length.) two_column
- dup 16 bitread
- dup /hint_maxsorbits exch def
- (10. Bits needed to represent the greatest number of Shared Object references.) two_column
- dup 16 bitread
- dup /hint_sobits exch def
- (11. Bits needed to identify a Shared Object.) two_column
- dup 16 bitread
- dup /hint_numfbits exch def
- (12. Bits needed to represent numerator of fraction.) two_column
- dup 16 bitread
- dup /hint_denf exch def
- (13. Denominator of fraction.) two_column
- pop
- LinearizationParams /N get
- % 1. Number of objects in the page.
- hint_stream bytealign
- /hint_page_obj [
- 2 index {
- hint_stream hint_maxnopbits bitread
- hint_minnop add
- } repeat
- ] readonly def
- (1. Number of objects on the page) array_header
- hint_page_obj dump_array
- % 2, Page length in bytes.
- hint_stream bytealign
- /hint_page_len [
- 2 index {
- hint_stream hint_maxplbits bitread
- hint_minpl add
- } repeat
- ] readonly def
- (2. Page length in bytes.) array_header
- hint_page_len dump_array
- % 3, Number of shared objects referenced from the page
- hint_stream bytealign
- /hint_page_sobj [
- 2 index {
- hint_stream hint_maxsorbits bitread
- } repeat
- ] readonly def
- (3. Number of shared objects referenced from the page.) array_header
- hint_page_sobj dump_array
- % 4. Index into the shared objects hint table
- hint_stream bytealign
- /hint_page_sobj_id [
- 0 1 4 index 1 sub {
- hint_page_sobj exch get [
- exch {
- hint_stream hint_sobits bitread
- } repeat
- ] readonly
- } for
- ] readonly def
- (4. Index into the shared objects hint table.) array_header
- ([) =
- hint_page_sobj_id { dump_array2 } forall
- (])=
- % 5. Fractional position for each shared object reference
- hint_stream bytealign
- /hint_page_sobj_pos [
- 0 1 4 index 1 sub {
- hint_page_sobj exch get [
- exch {
- hint_stream hint_numfbits bitread
- hint_denf div
- } repeat
- ] readonly
- } for
- ] readonly def
- (5. Fractional position for each shared object reference. ) array_header
- ([)=
- hint_page_sobj_pos { dump_array2 } forall
- (])=
- % 6. Offset of the page's content stream from the beginning of the page.
- hint_stream bytealign
- /hint_page_content_offset [
- 2 index {
- hint_stream hint_maxscobits bitread
- hint_minsco add
- } repeat
- ] readonly def
- (6. Offset of the page's content stream from the beginning of the page.) array_header
- hint_page_content_offset dump_array
- % 7. Length of the page's content stream in bytes.
- hint_stream bytealign
- /hint_page_content_len [
- 2 index {
- hint_stream hint_maxclbits bitread
- hint_mincl add
- } repeat
- ] readonly def
- (7. Length of the page's content stream in bytes.) array_header
- hint_page_content_len dump_array
- pop
- } bind def
- % Analyze tha shared object hint table
- /dump_shared_object_table {
- hint_stream
-
- dup 32 bitread
- dup /shint_1st_obj_id exch def
- (1. Object number of the first object in the shared objects section) two_column
- dup 32 bitread
- dup /shint_1st_obj_pos exch def
- (2. Location of the first object in the shared objects section.) two_column
- dup 32 bitread
- dup /shint_1st_shared exch def
- (3. The number of shared object entries for the first page.) two_column
- dup 32 bitread
- dup /shint_all_shared exch def
- (4. Number of shared object entries for the shared objects section including 1st page.) two_column
- dup 16 bitread
- dup /shint_group_bits exch def
- (5. Number of bits needed to represent the greatest number of objects in a shared object group.) two_column
- dup 32 bitread
- dup /shint_group_least_sz exch def
- (6. Least length of a shared object group in bytes.) two_column
- dup 16 bitread
- dup /shint_group_diff_bits exch def
- (7. Bits for the difference between the greatest and least length of a shared object group size.) two_column
- pop
- (1. length of the object group in bytes.) array_header
- hint_stream bytealign
- /shint_group_sz [
- shint_all_shared {
- hint_stream shint_group_diff_bits bitread
- shint_group_least_sz add
- } repeat
- ] readonly def
- shint_group_sz dump_array
- (2. MD5 signature flag) array_header
- hint_stream bytealign
- /shint_md5_flags
- [ shint_all_shared
- { hint_stream 1 bitread
- } repeat
- ] readonly def
- shint_md5_flags dump_array
- (3. MD5 signature string) array_header
- false shint_md5_flags { 0 ne or } forall {
- shint_md5_flags {
- 0 eq {
- (<>)=
- } {
- hint_stream /S get 128 string
- readstring pop
- dup length 128 eq {
- ==
- } { pop (Error reading nd5 string.) ==
- } ifelse
- } ifelse
- } forall
- } {
- () = (none) =
- } ifelse
- (4. The number of objects in the group.) array_header
- hint_stream bytealign
- /shint_group_cnt [
- shint_all_shared {
- hint_stream shint_group_bits bitread
- } repeat
- ] readonly def
- shint_group_cnt dump_array
- } bind def
- % Analyze the thumbnail hint table.
- /dump_thumbnail_table {
- hint_stream
- dup 32 bitread
- dup /thint_1st_obj_id exch def
- (1. Object number of the first thumbnail image.) two_column
- dup 32 bitread
- dup /thint_1st_obj_pos exch def
- (2. Location of the first thumbnail image.) two_column
- dup 32 bitread
- dup /thint_page_cnt exch def
- (3. Number of pages that have thumbnail images.) two_column
- dup 16 bitread
- dup /thint_no_thumbnail_bits exch def
- (4. Bits for the max number of consecutive pages without a thumbnail image.) two_column
- dup 32 bitread
- dup /thint_min_sz exch def
- (5. The least length of a thumbnail image in bytes.) two_column
- dup 15 bitread
- dup /thint_obj_sz_bits exch def
- (6. Bits for the difference between max and min length of a thumbnail image.) two_column
- dup 32 bitread
- dup /thint_min_obj_cnt exch def
- (7. The least number of objects in a thumbnail image.) two_column
- dup 16 bitread
- dup /thint_obj_cnt_bits exch def
- (8. Bits for the difference between max and min number of objects in a thumbnail image.) two_column
- dup 32 bitread
- dup /thint_1st_shared_obj exch def
- (9. First object in the thumbnail shared objects section.) two_column
- dup 32 bitread
- dup /thint_1st_shared_pos exch def
- (10. Location of the first object in the thumbnail shared objects section.) two_column
- dup 32 bitread
- dup /thint_shared_cnt exch def
- (11. Number of thumbnail shared objects.) two_column
- dup 32 bitread
- dup /thint_shared_section_sz exch def
- (12. Length of the thumbnail shared objects section in bytes.) two_column
- pop
- LinearizationParams /N get
- (1. The number of preceding pages lacking a thumbnail image.) array_header
- hint_stream bytealign
- /thint_no_thumbnail_pages [
- 2 index {
- hint_stream thint_no_thumbnail_bits bitread
- } repeat
- ] readonly def
- thint_no_thumbnail_pages dump_array
- (2. Number of objects in this page's thumbnail image.) array_header
- hint_stream bytealign
- /thint_page_obj_cnt [
- 2 index {
- hint_stream thint_obj_cnt_bits bitread
- thint_min_obj_cnt add
- } repeat
- ] readonly def
- thint_page_obj_cnt dump_array
- (3. Length of this page's thumbnail image in bytes.) array_header
- hint_stream bytealign
- /thint_page_obj_sz [
- 2 index {
- hint_stream thint_obj_sz_bits bitread
- thint_min_sz add
- } repeat
- ] readonly def
- thint_page_obj_sz dump_array
- pop
- } bind def
- % Analyze the generic hint table.
- % The hint field names are re-used.
- /dump_generic_table {
- hint_stream
- dup 32 bitread
- dup /ghint_1st_obj exch def
- (1. Object number of the first object in the group.) two_column
- dup 32 bitread
- dup /ghint_1st_obj_pos exch def
- (2. Location of the first object in the group.) two_column
- dup 32 bitread
- dup /ghint_obj_cnt exch def
- (3. Number of objects in the group.) two_column
- dup 32 bitread
- dup /ghint_group_sz exch def
- (4. Length of the object group in bytes.) two_column
- pop
- } bind def
- % Analyze the interactive hint table.
- % The hint field names are re-used.
- /dump_interactive_table {
- hint_stream
- dup 32 bitread
- dup /ihint_1st_obj exch def
- (1. Object number of the first object in the group.) two_column
- dup 32 bitread
- dup /ihint_1st_obj_pos exch def
- (2. Location of the first object in the group.) two_column
- dup 32 bitread
- dup /ihint_obj_cnt exch def
- (3. Number of objects in the group.) two_column
- dup 32 bitread
- dup /ihint_group_sz exch def
- (4. Length of the object group in bytes.) two_column
- dup 32 bitread
- dup /ihint_shared_cnt exch def
- (5. Number of shared object references.) two_column
- dup 16 bitread
- dup /ihint_shared_obj_bits exch def
- (6. Bits for the max shared object id used by the interactive form or the logical structure hierarchy.)
- 1 index hint_sobits ne {
- (\n*** This fiels is not equal to max shared object ID bits ***) concatstrings
- } if
- pop
- (7. Shared object identifier.) array_header
- hint_stream bytealign
- /ihint_shared_obj_id [
- ihint_shared_cnt {
- hint_stream hint_sobits bitread
- } repeat
- ] readonly def
- ihint_shared_obj_id dump_array
- } bind def
- % Enumerate all documented hint tables.
- /dump_all_tables { % <<stream>> dump_all_tables -
- (Page offset hint table) table_header
- hint_stream 0 set_align
- dump_page_offset_table
- (S, Shared object hint table) table_header
- dup /S .knownget {
- hint_stream exch set_align
- dump_shared_object_table
- } {
- (Required table is not found.) error_msg
- } ifelse
- dup /T .knownget {
- (T, Thumbnail hint table) table_header
- hint_stream exch set_align
- dump_thumbnail_table
- } if
- dup /O .knownget {
- (O, Outline hint table) table_header
- hint_stream exch set_align
- dump_generic_table
- } if
- dup /A .knownget {
- (A, Thread information hint table) table_header
- hint_stream exch set_align
- dump_generic_table
- } if
- dup /E .knownget {
- (E, Named destination hint table) table_header
- hint_stream exch set_align
- dump_generic_table
- } if
- dup /V .knownget {
- (V, Interactive form hint table) table_header
- hint_stream exch set_align
- dump_interactive_table
- } if
- dup /I .knownget {
- (I, Information dictionary hint table) table_header
- hint_stream exch set_align
- dump_generic_table
- } if
- dup /C .knownget {
- (C, Logical structure hint table) table_header
- hint_stream exch set_align
- dump_interactive_table
- } if
- dup /L .knownget {
- (L, Page label hint table) table_header
- hint_stream exch set_align
- dump_generic_table
- } if
- pop
- } bind def
- % Load PDF file and extract the hint stream.
- /pdf_dump_hints { % <infile> pdf_dump_hints -
- dup (r) file % fname
- false exch % fname F file
- {
- dup 7 string readstring pop % fname F file ()
- (%PDF-1.) ne { pop exit } if % fname F file
- dup 0 setfileposition
- dup token not { pop exit } if % fname F file obj
- dup type /integertype ne { pop exit } if % fname F file obj
- 1 index token not { pop pop exit } if % fname F file obj gen
- dup type /integertype ne {pop pop exit}if % fname F file obj gen
- 4 2 roll % fname obj gen F file
- dup 0 setfileposition
- exch true or % fname obj gen file T
- exit
- } loop
- {
- pdfdict begin
- pdfopenfile dup begin
- 40 dict begin
- /IDict exch def
- .setsafe
- % Read all objects into memory.
- Trailer touch
- resolveR % fname <<>>
- dup /Linearized known {
- dup /L get % fname <<>> Len
- 3 -1 roll status not { 0 0 0 0 } if % <<>> Len
- pop pop exch pop % <<>> Len len
- eq {
- /LinearizationParams exch def
- LinearizationParams /H get
- dup length 2 eq {
- 0 get PDFoffset add PDFfile exch setfileposition
- PDFfile token pop
- PDFfile token pop
- resolveR dup true resolvestream
- /ReusableStreamDecode filter
- bitstream dup bytealign
- /hint_stream exch def
- dump_all_tables
- } {
- pop
- (Overflow hint stream is not supported.) =
- } ifelse
- } {
- pop
- (Wrong file length in linearization dictionary.) =
- } ifelse
- } {
- pop (The file is not linearized.) =
- } ifelse
- end % temporary dict
- end % IDict
- end
- } {
- pop
- (Input file is not a valid PDF file.) =
- } ifelse
- } bind def
- % Initial setup
- /dump_hints {
- counttomark 1 eq {
- exch pop
- save exch
- 3000000 setvmthreshold
- pdfoptdict begin
- pdf_dump_hints
- end
- restore
- true
- } {
- cleartomark false
- } ifelse
- } bind def
- /shellarguments {false} def
- (pdfopt.ps) runlibfile
- currentdict /shellarguments undef
- % Check for command line arguments.
- mark shellarguments {
- dump_hints not {
- (Usage: gs -dNODISPLAY -- dumphint.ps input.pdf) = flush
- } if
- } {
- pop
- } ifelse
- % EOF
|