From the quoted PS code I cannot see why it is not rendered. Maybe the "S" is missing at the end.
You can use this utility function which requires a reference canvas:
procedure TextOutOutline( ReferenceCanvas, Canvas : TCanvas; X,Y : Integer; const Text : String );
var dc : HDC;
l, q : Integer;
points: array of TPoint;
types: array of Byte;
begin
ReferenceCanvas.Font.Assign(Canvas.Font);
dc := ReferenceCanvas.Handle;
BeginPath(dc);
ReferenceCanvas.TextOut(0,0,Text);
EndPath(dc);
SetLength(points, 1);
SetLength(types, 1);
l := GetPath(dc, @points[0], @types[0], 0);
SetLength(points, l);
SetLength(types, l);
GetPath(dc, @points[0], @types[0], l);
for q := 0 to l-1 do
begin
inc(points[q].X, x);
inc(points[q].Y, Y);
end;
q := 1;
while (q < l) and (types[q] <> 6) and (q < 5) do inc(q);
if q<l then
PolyDraw(Canvas.Handle, points[q], types[q], l-q);
end;
It is used like this:
WPPDFPrinter1.Canvas.Brush.Color := clRed;
WPPDFPrinter1.Canvas.Pen.Color := clYellow;
WPPDFPrinter1.Canvas.Font.Size := 100;
BeginPath(WPPDFPrinter1.Canvas.Handle);
TextOutOutline(Canvas, WPPDFPrinter1.Canvas, 10, 10, 'Outline');
EndPath(WPPDFPrinter1.Canvas.Handle);
StrokeAndFillPath(WPPDFPrinter1.Canvas.Handle);
TextOutOutline Create the path data using a canvas which is not visible and then renders it to the wPDF Canvas.
The code also skips the first part of the path data because it is usually only the bounding box of the output.