~ubuntu-branches/ubuntu/lucid/ghostscript/lucid-proposed

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
%   Copyright (C) 2009 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 that
%   license.  Refer to licensing information at http://www.artifex.com/
%   or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
%   San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
%
% $Id:$
%
% Extract Fonts from a PDF file
%
%	Font files are written with the same name as in the PDF, which
%       may be of the form ABCDEF+fontname if the font is a subset.
%
% example usage:
%
%	gs -q -dNODISPLAY extractFonts.ps -c "(somefile.pdf) extractFonts quit"
%

% Copy one file to another.
% Close the files when finished
/copyfile		% <infile> <outfile> copyfile -
 { 0 mark 32000 string
    { 4 index 1 index readstring
      exch 5 index 1 index writestring
      length 5 -1 roll add 4 1 roll
      not { exit } if
    } loop
   cleartomark 3 -1 roll closefile
   pop closefile
 } bind def

/extractFonts {	%	(filename) extractFonts 
  /FontsFound 100 dict def
  (r) file runpdfbegin
  1 1 pdfpagecount % stack: first_page# last_page#
  {
    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
	    {
              % embedded font found!
	      dup /BaseFont oget
	      FontsFound 1 index known not {
		1 index /Subtype oget
		FontsFound 2 index 2 index put	% mark the font we found
		% data for different types of fonts is handled separately
		% stack: -dict- BaseFont Subtype
		dup /Type1 eq {
		  2 index /FontDescriptor oget
		  dup /FontFile knownoget {
		    true resolvestream
		    2 index 100 string cvs (.pfb) concatstrings
		    (Extracting Type1 font: ) print dup = flush
		    (w) file copyfile
		  } if
		  /FontFile3 knownoget {
		    dup /Subtype oget /Type1C ne {
		      (Warning: Font ) print 2 index =print ( of type: ) print dup
		      /Subtype oget =print ( is being written with extension .cff) = flush
		    } if
		    true resolvestream
		    2 index 100 string cvs (.cff) concatstrings
		    (Extracting Type1C font: ) print dup = flush
		    (w) file copyfile
		  } if
		} if
		dup /TrueType eq {
		  2 index /FontDescriptor oget
		  dup ===
		  /FontFile2 oget true resolvestream
		  2 index 100 string cvs (.ttf) concatstrings
		  (Extracting TrueType font: ) print dup = flush
		  (w) file copyfile
		} if
	        pop pop		% done with BaseFont and Subtype
	      } if	% end if font not already in FontsFound
	      pop  % done with the font resource dictionary
	    } {
	      pop	%  not embedded
	    } ifelse
	  } {
	    pop		% no FontDescriptor, not embedded
	  } ifelse
	} forall	% traverse the Font resource dictionary
      } if
    } if 
  } for
} bind def