177 lines
5.4 KiB
PostScript
177 lines
5.4 KiB
PostScript
% Copyright (C) 1991, 1992 Aladdin Enterprises. All rights reserved.
|
|
% Distributed by Free Software Foundation, Inc.
|
|
%
|
|
% This file is part of Ghostscript.
|
|
%
|
|
% Ghostscript is distributed in the hope that it will be useful, but
|
|
% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
|
|
% to anyone for the consequences of using it or for whether it serves any
|
|
% particular purpose or works at all, unless he says so in writing. Refer
|
|
% to the Ghostscript General Public License for full details.
|
|
%
|
|
% Everyone is granted permission to copy, modify and redistribute
|
|
% Ghostscript, but only under the conditions described in the Ghostscript
|
|
% General Public License. A copy of this license is supposed to have been
|
|
% given to you along with Ghostscript so you can know your rights and
|
|
% responsibilities. It should be in a file named COPYING. Among other
|
|
% things, the copyright notice and this notice must be preserved on all
|
|
% copies.
|
|
|
|
% Extract the ASCII text from a PostScript file. Nothing is displayed.
|
|
% Instead, lines are written to stdout as follows:
|
|
% F <height> <width> (<fontname>)
|
|
% indicate font height and width of a space
|
|
% S <x> <y> (<string>) <width>
|
|
% display a string
|
|
% P
|
|
% end of page
|
|
%
|
|
% <height> is an integer expressed in tenths of a point
|
|
% <width> is an integer in tenths of a point.
|
|
% <x> and <y> are integer coordinates, in tenths of a point, with origin
|
|
% at lower left.
|
|
% <string> and <fontname> are string represented with the standard
|
|
% PostScript escape conventions.
|
|
% The idea is similar to Glenn Reid's `distillery', only a lot more
|
|
% simple-minded, and less robust.
|
|
|
|
% Note that this code will only work properly if systemdict is writable
|
|
% and if `binding' the definitions of operators defined as procedures
|
|
% is deferred. For this reason, it is normally invoked with
|
|
% gs -q -dNOBIND -dWRITESYSTEMDICT gs_2asc.ps
|
|
|
|
% Thanks to J Greely <jgreely@cis.ohio-state.edu> for improvements
|
|
% to this code.
|
|
|
|
/QUIET true def
|
|
systemdict wcheck { systemdict } { userdict } ifelse begin
|
|
|
|
% Disable the display operators.
|
|
|
|
/eofill { newpath } odef
|
|
/erasepage { } odef
|
|
/fill { newpath } odef
|
|
/stroke { newpath } odef
|
|
|
|
% The image operators must read the input, but do nothing.
|
|
|
|
/colorimage { gsave nulldevice //colorimage grestore } odef
|
|
/image { gsave nulldevice //image grestore } odef
|
|
/imagemask { gsave nulldevice //imagemask grestore } odef
|
|
|
|
% Redefine the end-of-page operators.
|
|
|
|
/copypage { (P\n) //print } odef
|
|
/showpage { copypage erasepage initgraphics } odef
|
|
|
|
% Redefine `show'.
|
|
|
|
% Set things up so our output will be in tenths of a point, with origin at
|
|
% lower left. This isolates us from the peculiarities of individual devices.
|
|
/.show.ident.matrix matrix def
|
|
/.show.ident
|
|
{ gsave initmatrix 0.1 dup scale .show.ident.matrix currentmatrix grestore
|
|
} def
|
|
/.coord { transform .show.ident itransform } odef
|
|
/.dcoord { dtransform .show.ident idtransform } odef
|
|
/.showfont
|
|
%old code - This didn't work right for me with all fonts.
|
|
%
|
|
% { 0 currentfont /FontBBox get dup 3 get exch 1 get sub
|
|
% currentfont /FontMatrix get dtransform dtransform
|
|
% exch abs exch abs max round
|
|
% (F ) //print //.stdout exch write==only (\n) //print
|
|
% } odef
|
|
%
|
|
%unfortunately, my way bombs on one of my test files in
|
|
%--%show_continue--(?!). It's from dvi2ps, which molests
|
|
%the fonts in some way. --jgreely
|
|
{ (F ) //print
|
|
gsave
|
|
% figure out (roughly) the maximum height of the current
|
|
% font. I picked this string for a mix of ascenders and
|
|
% descenders, with digits tossed in in case of oldstyle
|
|
newpath 0 0 moveto
|
|
(Xyhq69) false charpath flattenpath pathbbox newpath
|
|
exch 4 -1 roll sub 3 1 roll exch sub .dcoord
|
|
round abs //.stdout exch write==only pop
|
|
( ) //print
|
|
% oddly enough, the "charpath...pathbbox" stuff didn't work
|
|
% right for space in courier
|
|
( ) stringwidth
|
|
.dcoord pop
|
|
round //.stdout exch write==only
|
|
% ( ) //print
|
|
% //.stdout currentfont /FontName get
|
|
% dup type /nametype eq { =string cvs } if
|
|
% write==only
|
|
(\n) //print
|
|
grestore
|
|
} odef
|
|
|
|
/.showstring
|
|
{ (S ) //print
|
|
gsave
|
|
currentpoint .coord
|
|
exch round dup //.stdout exch write==only
|
|
( ) //print
|
|
exch round dup //.stdout exch write==only
|
|
( ) //print
|
|
moveto dup //.stdout exch write==only
|
|
( ) //print
|
|
grestore dup stringwidth pop 0 rmoveto
|
|
stringwidth .dcoord pop
|
|
round //.stdout exch write==only
|
|
(\n) //print
|
|
} odef
|
|
|
|
/show
|
|
{ .showfont .showstring
|
|
} odef
|
|
|
|
% Redefine the other string display operators in terms of `show'.
|
|
|
|
/.show1 { ( ) dup 0 3 index put exch pop .showstring } odef
|
|
/ashow
|
|
{ .showfont
|
|
{ .show1 2 copy rmoveto } forall
|
|
exch neg exch neg rmoveto
|
|
} odef
|
|
/widthshow
|
|
{ .showfont
|
|
{ 2 copy .show1 eq { 1 index 2 index rmoveto } if } forall
|
|
pop pop pop
|
|
} odef
|
|
/awidthshow
|
|
{ .showfont
|
|
{ dup .show1 3 index eq { 4 index 5 index rmoveto } if
|
|
2 copy rmoveto
|
|
} forall
|
|
exch neg exch neg rmoveto
|
|
pop pop pop
|
|
} odef
|
|
/kshow
|
|
{ .showfont
|
|
{ .show1 dup exec } forall pop
|
|
} odef
|
|
|
|
% Redirect the printing operators.
|
|
|
|
/.stdout (_temp_.out) (w) file def
|
|
/.stderr (_temp_.err) (w) file def
|
|
/print { //.stdout exch writestring } odef
|
|
|
|
end
|
|
|
|
% Bind the operators we just defined, and all the others if we didn't
|
|
% do it before.
|
|
|
|
bindoperators
|
|
NOBIND currentdict systemdict ne and
|
|
{ systemdict begin bindoperators end }
|
|
if
|
|
|
|
% Make systemdict read-only if it wasn't already.
|
|
|
|
systemdict wcheck { systemdict readonly pop } if
|