%!PS-Adobe-3.0 %%Title: TrueTypeToType42.ps %%Creator: T.H.Barton %%CreationDate: May 2001 %%BoundingBox: 0 0 612 792 %%Pages: 1 % Usage: % This program runs under GhostScript, (NB it will not run under GhostView), % to produce the PostScript type 42 font equivalent of a TrueType font. It % uses the GhostScript .loadttfont procedure to load the Type 42 font % dictionary on the stack and, to have access to this command, you must % use a recent version of GhostScript. I developed the program using % GhostScript 6.51 and am now running it under version 7.00. % The command line is: % -IC:\GS\GS7.00 == % In my own case, the full path name of my GhostScript file is: % C:\GS\GS7.00\bin\gswin32.exe % The full path name of this file, i.e. the file you are reading, is: % D:\Fonts\TrueType\Utilities\TrueTypeToType42.ps % All my TrueType fonts are in folder C:\Winnt\Fonts so that the % full path name of Arial.ttf is: % C:\Winnt\Fonts\Arial.ttf % and the command to start the conversion on my machine is: % C:\GS\GS6.50\bin\gswin32.exe -IC:\GS\GS6.51 == D:\Fonts\TrueType\Utilities\TrueTypeToType42.ps C:\Winnt\Fonts\Arial.ttf % I have incorporated most of this into a batch file so that I % only have to enter the root name, i.e. without the extension .TTF, % of the True Type font file. % % Three output files are produced, all in the directory designated as % the value of the /Path key. Change this value to suit your needs. % Search for /Path, you will find it about line 306. % One output file is the PostScript Type 42 file. Its root name % is the name of the font. In the case of Arial, it is ArialMT. % Its extension is .pfa. % The second output file is called ShowAllGlyphs.ps. It is a PostScript % file which, when viewed in GhostScript or downloaded to a PostScript % printer, will display all the glyphs defined by the font alongside % their names in ASCII sort order. This file contains % in its prologue a copy of the Type 42 font file so that it is % and independent entity, i.e. you do not need the font in your % printer. The price paid for this convenience is the large size % of the file. % The third file is a permanent copy of the report made to the % GhostScript standard output window during execution of the % program. It is called TrueTypeToType42.out. % % Many TrueType fonts define a large number of glyphs, Arial.ttf defines % 1296, and program execution can take a long time even on a fairly % modern system. You are reassured that progress is being made during % the periods of seeming inactivity by numerous messages displayed on % the GhostScript standard output screen. These messages are also % copied to file TrueTypeToType42 so that you have a permanent record. % The screen shows a list of all the required and optional components % of the Type 42 file as listed in Tables 5.2, 5.3, and 5.7 of the % PostScript Language Reference. It states whether a component was % found or not found. If a required component is not found, you are % warned that PostScript will reject the font. The number of glyphs % defined by the font is displayed along with other potentially % useful information. % % The program uses three internally defined GhostScript commands, % .loadttfont, concatstrings, and .quit, which are not recognized % by standard PostScript. % .loadttfont is defined in the GhostScript file gs_tt.ps. It % converts a TrueType font to Type 42 and loads the Type 42 font % dictionary on the stack. % concatstrings takes two strings as its arguments, pops them % from the stack, concatenates them and leaves the result on % the stack. % I have not found a definition of .quit but it seems to require % two integers as input parameters and stops processing with the % GhostScript stdout window displaying an error code whose value % is the second of the two integers. % % TrueType fonts frequently define very large numbers of glyphs and, % as a consequence, may be large. My copy of Arial, defines 1296 % glyphs and occupies 267 KB. Because the translation to Type 42 % requires the conversion of eight bit character strings in sfnts % to hexadecimal strings, the Type 42 font file is almost twice as % long as the True Type file. In my case ArialMT.pfa contains 496 KB. % % I have set setpagedevice for simplex printing from the manual % input tray of my printer. You will wish to change these to % suit your printer. Search for setpagedevice and follow the comments % just above it. (You will find it at about line 619.) % %%EndComments %%BeginProlog % Procedure AAA takes a keyname expressed as a string as it sole % argument. Prior to use of AAA, the dictionary loaded on the stack % by applying .loadttfont to the TrueType font file, is given the name TTF. % Within the procedure, the string argument to AAA is called KN % and when required it is converted to a keyname by cvn. First, % it is established whether the key is defined within TTF % or not using the PostScript command known. If not, a message is % printed on stdout (the screen) and false is loaded on the stack. % If it is defined, the value of the key KN and true are loaded on % the stack, true in the top position and the value below it. % /AAA { /KN exch def TTF KN cvn known { TTF KN cvn get KN ( is defined in this font.\n) concatstrings print RFO KN ( is defined in this font.\n) concatstrings writestring true } { KN ( not defined in this font.\n) concatstrings print RFO KN ( not defined in this font.\n) concatstrings writestring false } ifelse } def /R 1 def /O 0 def % The following procedures translate the various components to suit the % Type 42 format. Some are used more than once, justifying their % creation. as procedures. Some are only used once but having them % as procedures clarifies the main program. /NumberProc { /RorO exch def % RorO = Required or Optional { Outfile ( /) KN concatstrings ( ) concatstrings writestring 20 string cvs (\n) concatstrings Outfile exch writestring } { RorO 1 eq { Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring Outfile (% Because it is a required parameter, the font will not be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } { Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring Outfile (% Because it is not a required parameter, the font will be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } ifelse } ifelse } def /NumericalMatrixProc { /RorO exch def { Outfile ( /) KN concatstrings ( [ ) concatstrings writestring {20 string cvs ( ) concatstrings Outfile exch writestring} forall Outfile (]\n) writestring } { RorO 1 eq { Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring Outfile (% Because it is a required parameter, the font will not be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } { Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring Outfile (% Because it is a required parameter, the font will not be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } ifelse } ifelse } def /NameProc { /RorO exch def { ( /FontName /) exch concatstrings (\n) concatstrings Outfile exch writestring } { Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring RorO 1 eq { Outfile (% Because it is a required parameter, the font will not be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } { Outfile (% Because it is not a required parameter, the font will be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } ifelse } ifelse } def /DictProc { /RorO exch def { Outfile ( /FontInfo\n <<\n) writestring { exch 20 string cvs Outfile ( /) writestring Outfile exch writestring Outfile ( ) writestring dup type (stringtype) eq { Outfile (\() writestring Outfile exch writestring Outfile (\)\n) writestring } { 20 string cvs Outfile exch writestring Outfile (\n) writestring } ifelse } forall Outfile ( >>\n) writestring } { RorO 1 eq { Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring Outfile (% Because it is a required parameter, the font will not be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } { Outfile (% Because it is not a required parameter, the font will be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } ifelse } ifelse } def /EncodingProc { /RorO exch def { Outfile ( /Encoding [\n) writestring { Outfile ( /) writestring 48 string cvs Outfile exch writestring Outfile (\n) writestring } forall Outfile ( ]\n) writestring } { RorO 1 eq { Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring Outfile (% Because it is a required parameter, the font will not be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } { Outfile (% Because it is not a required parameter, the font will be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } ifelse } ifelse } def /CharStringsProc { % /NG 0 def /RorO exch def { Outfile ( /CharStrings\n <<\n) writestring { exch Outfile ( /) writestring 48 string cvs dup Outfile exch writestring GlyphArray i 3 2 roll put Outfile ( ) writestring 48 string cvs Outfile exch writestring Outfile (\n) writestring /i i 1 add def } forall Outfile ( >>\n) writestring NG 20 string cvs print ( glyphs are defined in this font.\n) print flush RFO NG 20 string cvs ( glyphs are defined in this font.\n) concatstrings writestring } { RorO 1 eq { Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring Outfile (% Because it is a required parameter, the font will not be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } { Outfile (% Because it is not a required parameter, the font will be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } ifelse } ifelse } def /SfntsProc { /RorO exch def { /S1 1 string def Outfile ( /sfnts [\n) writestring { Outfile ( <\n ) writestring /ln 0 def { S1 exch 0 exch put Outfile S1 writehexstring /ln ln 1 add def ln 36 eq { /ln 0 def Outfile (\n ) writestring } if } forall Outfile (>\n) writestring } forall Outfile ( ]\n) writestring } { RorO 1 eq { Outfile (% /) KN concatstrings ( is not defined in this font file.\n) concatstrings writestring Outfile (% Because it is a required parameter, the font will not be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } { Outfile (% Because it is not a required parameter, the font will be\n) writestring Outfile (% acceptable to PostScript.\n) writestring } ifelse } ifelse } def % PSS, = Print Stack and Stop, is a debugging aid. When called it prints % the contents of the stack at the time of the call and stops with error % code 88 /PSS {(\n\nStack contents =\n) print pstack (End of stack contents\n\n) print 8 88 .quit} def %%EndProlog %%BeginSetup % % The value of the keyname Path is the full path to the location where you % want the output files. As you can see, I create them in D:\Temp\ and % transfer them from there to where I really wand them. You should change % this path to suit your needs. % /Path (D:\\Temp\\) def %%EndSetup mark shellarguments { counttomark /narg exch def narg 1 eq not { (Error message #2 from TrueTypeToType42.ps\n) print (The call to TrueTypeToType42.ps must have one command line argument.\n) print ( The path name of the TTF file\n) print (You have ) print narg 10 string cvs print ( arguments.\n) print (Please correct and try again.\n\n\n) print 9 99 .quit } if } { (Error message #1 from TrueTypeToType42.ps\n) print (You must use the -- command line switch in the call to GhostScript.\n) print (Please correct and try again.\n\n\n) print 9 99 .quit } ifelse % The command line argument, converted to a string, is now on the stack. % It is the full path name of the TrueType font file. /InfilePath exch def pop % Open the TrueType font file for reading and call it Infile InfilePath (r) file /Infile exch def % Convert Infile to a Type 42 font dictionary, call that dictionary TTF, % and close Infile. Infile .loadttfont /TTF exch def Infile closefile % Get the number of glyphs and define an array to receive their names. TTF /CharStrings get length /NG exch def /GlyphArray NG array def /i 0 def % Get the PostScript name of the font and open the output % file using that for its root and .pfa for its extension. % Call this file Outfile. Path TTF /FontName get concatstrings (.pfa) concatstrings (w) file /Outfile exch def Outfile (%!PS-TrueType font\n) writestring % Open the report file in the current directory. This file receives, % in ASCII text format, the same report on the progress of this program % as is written to the GhostScript standard output window. /ReportFile (TrueTypeToType42.out) def Path ReportFile concatstrings /ReportPath exch def ReportPath (w) file /RFO exch def RFO (Report from TrueTypeToType42 on the conversion of file ) InfilePath concatstrings (\n) concatstrings writestring (\nThe font name is ) TTF /FontName get concatstrings (\n\n) concatstrings dup print RFO exch writestring % Open the Type 42 font dictionary file with left double guillemets. Outfile (<<\n) writestring % The next section is a search, and processing if found, of all the % required and optional elements of a Type 42 font dictionary as % laid out in tables 5.2, 5.3, and 5.7 of the PostScript Language % Reference, PLR. % Entries common to all font dictionaries, Table 5.2 of PLR % The value of FontType is an integer. Required (FontType) AAA R NumberProc % The value of Fontmatrix is a numerical matrix containing six numbers. Required (FontMatrix) AAA R NumericalMatrixProc % The value of /FontName is a name type object, e.g. /Times-Roman. Required (FontName) AAA R NameProc % The value of FontInfo is a dictionary whose contents are defined in % Table 5.5 of PLR. Optional (FontInfo) AAA O DictProc % The value of LanguageLevel is an integer. Optional (LanguageLevel) AAA O NumberProc % The value of WMode is an integer. Optional (WMode) AAA O NumberProc % Additional entries common to all base fonts, Table 5.3 of PLR % The value of Encoding is an array of names. Required (Encoding) AAA R EncodingProc % The value of FontBBox is a numerical array. Required (FontBBox) AAA R NumericalMatrixProc % The value of UniqueID is an integer. Optional (UniqueID) AAA O NumberProc % The value of XUID is a numerical array. Optional (XUID) AAA O NumericalMatrixProc % Additional entries specific to Type 42 fonts, Table 5.7 % The value of CharStrings is a dictionary of glyph names and numbers. % Required (CharStrings) AAA R CharStringsProc % The value of sfnts is an array of strings. Required (sfnts) AAA R SfntsProc % The value of PaintType is an integer. Required (PaintType) AAA R NumberProc % The value of StrokeWidth is a number. Optional (StrokeWidth) AAA O NumberProc % The following four items are all optional and seem to rarely occur % in a TrueType font file. (I have not so far encountered any of them.) % If one or more are found, that will be the time to add the appropriate % processing procedure. % The value of Metrica is a dictionary. Optional (Metrics) AAA { == } if % The value of Metrics2 is a dictionary. Optional (Metrics2) AAA { == } if % The value of CDevProc is a procedure. Optional (CDevProc) AAA { == } if % The value of GlyphDirectory is either an array or dictionary. Optional (GlyphDirectory) AAA { == } if % Terminate the Type 42 font dictionary and name the font with the % name found as the value of the key /FontName Outfile (>> begin FontName currentdict end definefont pop\n) writestring Outfile closefile % Sorting the glyph names. A bubble sort is used. This is slow but is % easy to write. Please feel free to substitute a more efficient % algorithm. (Sorting the glyph names into ASCII order.\n) print (This may take several minutes depending on the number of glyphs.\n) print (PLEASE BE PATIENT.\n) print flush RFO (\nSorting the glyph names into ASCII order.\n) writestring RFO (This may take several minutes depending on the number of glyphs.\n) writestring RFO (PLEASE BE PATIENT.\n) writestring /nit 0 def { /i 0 def /j 1 def /nex 0 def /nit nit 1 add def { GlyphArray i get /S1 exch def GlyphArray j get /S2 exch def S1 S2 gt { GlyphArray i S2 put GlyphArray j S1 put /nex nex 1 add def } if /i i 1 add def /j j 1 add def j NG eq { exit } if } loop nex 0 eq {exit} if nit 100 mod 0 eq { (Traversed the array of glyph names ) print nit 20 string cvs print ( times.\n) print flush RFO (Traversed the array of glyph names ) nit 20 string cvs concatstrings ( times.\n) concatstrings writestring } if nit NG 2 mul eq { (Error message from TrueTypeToType42\n) print (Bubble sort of glyph names not completed because of\n) print (an excessive number of iterations.\n) print ( nit = ) print 20 string cvs print (\n) print RFO (\nError message from TrueTypeToType42\n) writestring RFO (Bubble sort of glyph names not completed because of\n) writestring RFO (an excessive number of iterations.\n) writestring RFO ( nit = ) 20 string cvs concatstrings (\n) concatstrings writestrings 8 88 .quit } if } loop (Sort completed. The glyph array has been traversed ) print nit 20 string cvs print ( times.\n\n) print RFO (\nSort completed. The glyph array has been traversed ) nit 20 string cvs concatstrings ( times\n) concatstrings writestring % The glyph names are now in ASCII sort order in an array called GlyphArray. % Now determine the number of pages of output required for displaying all the glyphs NG 141 sub dup 0 le {pop /iii 0 def}{/iii exch def} ifelse iii 150 mod 0 eq { iii 150 idiv 1 add /NPG exch def} { iii 150 idiv 2 add /NPG exch def } ifelse (Now create the file ShowAllGlyphs.ps which will display all ) print NG 20 string cvs print (\n) print (glyphs in ASCII sort order on ) print NPG 20 string cvs print ( pages of output.\n) print % Creating the PostScript file which will print the glyphs. % Open the output file for writing (D:\\Temp\\ShowAllGlyphs.ps) (w) file /OF exch def OF (%%!PS-Adobe-3.0\n) writestring OF (%%Title: ShowAllGlyphs.ps\n) writestring OF (%%Creator: TrueTypeTpType42.ps\n) writestring OF (%%CreationDate: April 2002\n) writestring OF (%%BoundingBox: 0 0 612 792\n) writestring OF (%%Pages: ) NPG 10 string cvs concatstrings (\n) concatstrings writestring OF (%%EndComments\n) writestring OF (%%BeginProlog\n) writestring % concatstrings is defined in GhostScript but not in PostScript so it % is put here for printing on a PostScript printer. OF (/concatstrings {\n) writestring OF ( /concatdict 6 dict def\n) writestring OF ( concatdict begin\n) writestring OF ( /s2 exch def\n) writestring OF ( /s1 exch def\n) writestring OF ( s1 length /l1 exch def\n) writestring OF ( s2 length /l2 exch def\n) writestring OF ( /strng l1 l2 add string def\n) writestring OF ( strng 0 s1 putinterval\n) writestring OF ( strng l1 s2 putinterval\n) writestring OF ( strng\n) writestring OF ( end\n) writestring OF (} def\n) writestring % Procedure ctr centers a string OF (/ctr{\n) writestring OF ( 4 -2 roll 2 copy translate\n) writestring OF ( 4 -2 roll exch dup rotate exch\n) writestring OF ( dup stringwidth pop 2 div neg 0 moveto show\n) writestring OF ( neg rotate\n) writestring OF ( neg exch neg exch translate\n) writestring OF (} def\n) writestring % Procedure dl draws a line between two points OF (/dl{moveto lineto stroke} def\n) writestring OF (/mt{moveto} def\n) writestring % Procedure nl starts a new line OF (/nl {\n) writestring OF ( count 0 eq {1.0}{\n) writestring OF ( dup type 20 string cvs dup\n) writestring OF ( (integertype) eq exch\n) writestring OF ( (realtype) eq xor not {1.0} if\n) writestring OF ( } ifelse\n) writestring OF ( dy mul neg yp add /yp exch store xp yp moveto\n) writestring OF (} def\n) writestring % Procedure rj right justifies a string OF (/rj{\n) writestring OF ( 4 -2 roll 2 copy translate\n) writestring OF ( 4 -2 roll exch dup rotate exch\n) writestring OF ( dup stringwidth pop neg 0 moveto show\n) writestring OF ( neg rotate\n) writestring OF ( neg exch neg exch translate\n) writestring OF (} def\n) writestring OF (/sg{setgray} def\n) writestring % Procedure PB1 grids the first page OF (/PB1 {\n) writestring OF ( 0.7 sg 2.0 slw 36 36 540 720 rectstroke\n) writestring OF ( 36 711 576 711 dl\n) writestring OF ( 216 36 216 711 dl 396 36 396 711 dl 0 sg\n) writestring OF (} def\n) writestring % Procedure PBX grids all pages after the first. It takes a single integer % argument, the page number and prints Page at top right of page. OF (/PBX {\n) writestring OF ( gsave\n) writestring OF ( /ipg exch def\n) writestring OF ( 594 766 0 /Times-Bold 14 selectfont) ((Page )) concatstrings ( ipg 10 string cvs concatstrings rj\n) concatstrings writestring OF ( 0.7 sg 2.0 slw 36 36 540 720 rectstroke\n) writestring OF ( 216 36 216 756 dl 396 36 396 756 dl 0 sg\n) writestring OF ( grestore\n) writestring OF (} def\n) writestring OF (/sh{show} def\n) writestring OF (/slw{setlinewidth} def\n) writestring % Procedure F1 defines 12 point Times Roman for printing the glyph names and % procedure F2 defines the TrueType font at 12 points for printing the glyphs. OF (/F1 {/Times-Roman 12 selectfont} def\n) writestring OF (/F2 \{/) TTF /FontName get concatstrings ( 12 selectfont} def\n) concatstrings writestring % Open the Type 42 version of the font file for reading and call it FF Path TTF /FontName get concatstrings (.pfa) concatstrings (r) file /FF exch def % The following loop copies the Type 42 version of the font file to the glyph display file { FF 500 string readline { % I have had problems with the length of this string. It seems to be long enough now but if you get an error message from readline, try increasing it. OF exch (\n) concatstrings writestring } { pop exit } ifelse } loop FF closefile % OF (%%EndProlog\n) writestring OF (%%BeginSetup\n) writestring % I have set Duplex to false so that you can use this with a simplex only printer. % However, if you have duplex capability, you will probably want to use it % so change the value of Duplex to true. % I have also set MediaPosition to 3 to suit my printer. You will probably % have to change the value to suit your printer. OF (<< /Duplex false /MediaPosition 3 >> setpagedevice\n) writestring OF (/NG ) NG 20 string cvs concatstrings ( def\n) concatstrings writestring OF (%%EndSetup\n) writestring OF (%%Page: 1 1\n) writestring OF (/ypo 710 def /dy 14 def /xpo 42 def /xppo xpo 147 add def\n) writestring OF (PB1\n) writestring OF (/Times-Bold 18 selectfont\n) writestring OF ( 306 738 0 \() TTF /FontName get concatstrings ( Glyphs) concatstrings (\) ctr\n) concatstrings writestring OF (/Times-Bold 12 selectfont\n) writestring OF (306 723 0 (All ) NG 20 string cvs concatstrings ( glyphs are shown in ASCII sort order) concatstrings ctr\n) writestring OF (F2\n) writestring % Now print the first page (Creating the first page\n) print OF (/yp ypo def /xp xpo 180 sub def /xpp xp 147 add def\n) writestring /IG 0 def NG 144 gt {/RPT 144 def}{/RPT NG def} ifelse 3 { IG NG ge {exit} if OF (/yp ypo def /xp xp 180 add def /xpp xpp 180 add def\n) writestring 48 { OF (1.0 nl F1 \() GlyphArray IG get concatstrings (\) show) concatstrings ( xpp yp mt ) concatstrings writestring OF (F2 /) GlyphArray IG get concatstrings ( glyphshow\n) concatstrings writestring /IG IG 1 add def IG NG ge {exit} if } repeat } repeat OF (showpage\n) writestring % If IG is greater than or equal to NG the job is done, else create subsequent pages. OF (/ypo ypo dy 3 mul add def\n) writestring /IPG 1 def { IG NG ge {exit} if % The next line is a safety switch. If something goes wrong you may be stuck in this % loop forever. The next line exits if IPG exceeds 20. This allows for a maximum of % 3013 glyphs which is well beyond anything I have encountered. If it is too small, % increase the maximum page number to suit. IPG 20 gt {exit} if /IPG IPG 1 add def (Creating page ) IPG 10 string cvs concatstrings (\n) concatstrings print OF (%%Page: ) IPG 10 string cvs concatstrings ( ) concatstrings IPG 10 string cvs concatstrings (\n) concatstrings writestring OF (/yp ypo def /xp xpo def\n) writestring OF IPG 10 string cvs ( PBX\n) concatstrings writestring OF (/yp ypo def /xp xpo 180 sub def /xpp xp 147 add def\n) writestring NG 144 gt {/RPT 144 def}{/RPT NG def} ifelse 3 { IG NG ge {exit} if OF (/yp ypo def /xp xp 180 add def /xpp xpp 180 add def\n) writestring 51 { OF (1.0 nl F1 \() GlyphArray IG get concatstrings (\) show) concatstrings ( xpp yp mt ) concatstrings writestring OF (F2 /) GlyphArray IG get concatstrings ( glyphshow\n) concatstrings writestring /IG IG 1 add def IG NG ge {exit} if } repeat } repeat OF (showpage\n) writestring } loop OF (%%Trailer\n) writestring OF (%%EOF) writestring OF closefile (Three output files have been created:\n) print ( ) TTF /FontName get concatstrings (.pfa,\n) concatstrings print ( ShowAllGlyphs.ps\n) print ( TrueTypeToType42.out\n) print (They will be found in folder ) Path concatstrings (\n) concatstrings print %%Trailer %%EOF