summaryrefslogtreecommitdiff
path: root/gs/toolbin/pdf_info.ps
blob: 667bf95661a4b5b070e5ecbc18ee3e9b2bf95338 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
%!PS
% Copyright (C) 2007 Artifex Software, Inc.  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: pdf_info.ps 6300 2005-12-28 19:56:24Z alexcher $

% Dump some info from a PDF file

% usage: gs -dNODISPLAY -q -sFile=____.pdf [-dDumpMediaSizes] [-dDumpFontsUsed [-dShowEmbeddedFonts] ] toolbin/pdf_info.ps

/showoptions {
  (           where "options" are:) =
  (           -dDumpMediaSizes=false    (default true) MediaBox and CropBox for each page) =
  (           -dDumpFontsNeeded=false   (default true)Fonts used, but not embedded) =
  (           -dDumpFontsUsed           List all fonts used) =
  (           -dShowEmbeddedFonts       only meaningful with -dDumpFontsUsed) =
  (\n          If no options are given, the default is -dDumpMediaSizes -dDumpFontsNeeded) =
  () =
  flush
} bind def

/DumpMediaSizes where { pop } { /DumpMediaSizes true def } ifelse
/DumpFontsNeeded where { pop } { /DumpFontsNeeded true def } ifelse

[ shellarguments
  { counttomark 1 eq {
      dup 0 get (-) 0 get ne { 
	% File specified on the command line using:  -- toolbin/pdf_info.ps infile.pdf
	/File exch def
	false	% don't show usage
      } {
	true	% show usage and quit
      } ifelse
    } { true } ifelse
    {
      (\n*** Usage: gs [options] -- toolbin/pdf_info.ps infile.pdf  ***\n\n) print
      showoptions
      quit
    } if
  } if
   
/File where not {
  (\n   *** Missing input file name \(use -sFile=____.pdf\)\n) =
  (    usage: gs -dNODISPLAY -q -sFile=____.pdf [ options ] toolbin/pdf_info.ps\n) =
  showoptions
  quit
} if
pop			% discard the dict from where

/QUIET true def		% in case they forgot

() =
File dup (r) file runpdfbegin
/PDFPageCount pdfpagecount def
(        ) print print ( has ) print PDFPageCount =print ( pages.\n) =
flush

% Print out the "Info" dictionary if present
Trailer /Info knownoget {
   dup /Title knownoget { (Title: ) print = flush } if
   dup /Author knownoget { (Author: ) print = flush } if
   dup /Subject knownoget { (Subject: ) print = flush } if
   dup /Keywords knownoget { (Keywords: ) print = flush } if
   dup /Creator knownoget { (Creator: ) print = flush } if
   dup /Producer knownoget { (Producer: ) print = flush } if
   dup /CreationDate knownoget { (CreationDate: ) print = flush } if
   dup /ModDate knownoget { (ModDate: ) print = flush } if
   dup /Trapped knownoget { (Trapped: ) print = flush } if
} if	% if Info known

DumpMediaSizes
{
() =
% Print out the Page Size info for each page.
  1 1 PDFPageCount {
    dup (Page ) print =print 
    pdfgetpage dup
    /MediaBox pget {
      aload pop exch 4 1 roll exch sub 3 1 roll sub
      ( MediaBox: [ ) print =print ( ) print =print ( ]) print
    } if
    dup /CropBox pget {
      aload pop exch 4 1 roll exch sub 3 1 roll sub
      ( CropBox: [ ) print =print ( ) print =print ( ]) print
    } if
    dup /Rotate pget {
       (    Rotate = ) print =print
    } if
    pageusestransparency {
	(     Page uses transparency features) print
    } if
    () = flush
  } for
} if

% List of standard font names for use when we are showing the FontsNeeded
/StdFontNames [
 /Times-Roman /Helvetica /Courier /Symbol
 /Times-Bold /Helvetica-Bold /Courier-Bold /ZapfDingbats
 /Times-Italic /Helvetica-Oblique /Courier-Oblique
 /Times-BoldItalic /Helvetica-BoldOblique /Courier-BoldOblique
] def

/getPDFfonts {	%	(filename) getPDFfonts array_of_font_names
  /FontsUsed 1000 dict def	% this will increase if needed
  mark
  1 1 PDFPageCount {
    pdfgetpage			% get pagedict
    /Resources pget {
      /Font knownoget {
	{ exch pop oforce
          dup /DescendantFonts knownoget {
            exch pop 0 get oforce
          } if
       	  dup /FontDescriptor knownoget {
            dup /FontFile known 1 index /FontFile2 known or exch /FontFile3 known or
	    /ShowEmbeddedFonts where { pop pop false} if {
	      pop			% skip embedded fonts
	    } {
	      /BaseFont knownoget pop	%  not embedded
	    } ifelse
	  } {
	    /BaseFont knownoget pop	% no FontDescriptor, not embedded
	  } ifelse
	  counttomark 0 gt { FontsUsed exch null put } if	% stick it in the dict
	} forall		% traverse the dictionary
      } if
    } if 
  } for
  % If DumpFontsUsed is not true, then remove the 'standard' fonts from the list
  systemdict /DumpFontsUsed known not {
    StdFontNames {
      FontsUsed 1 index known { FontsUsed 1 index undef } if
      pop
    } forall
  } if
  
  % Now dump the FontsUsed dict into an array so we can sort it.
  [ FontsUsed { pop } forall ]
  { 100 string cvs exch 100 string cvs exch lt } .sort
} bind def

systemdict /DumpFontsUsed known
{
  (\nFont or CIDFont resources used:) =
  getPDFfonts { = } forall
} {
  DumpFontsNeeded {
    getPDFfonts
    dup length 0 gt {
      (\nFonts Needed that are not embedded \(system fonts required\):) =
      { (    ) print = } forall
    } {
      pop
      (\nNo system fonts are needed.) =
    } ifelse
  } if 
} ifelse


quit