summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/lib/dumphint.ps
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlgs/lib/dumphint.ps')
-rw-r--r--Master/tlpkg/tlgs/lib/dumphint.ps756
1 files changed, 756 insertions, 0 deletions
diff --git a/Master/tlpkg/tlgs/lib/dumphint.ps b/Master/tlpkg/tlgs/lib/dumphint.ps
new file mode 100644
index 00000000000..c5e1e2f81f4
--- /dev/null
+++ b/Master/tlpkg/tlgs/lib/dumphint.ps
@@ -0,0 +1,756 @@
+% 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 8284 2007-10-10 17:40:38Z giles $
+% 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