The resolution is mostly not the problem. And if you rely on the information given by the printer drivers you often run in trouble.
Asking GetDeviceCaps will give you often nonsens.
And the relationship of height and width often differs between the (basic) image, a printer and a preview and an icon.
So what I do is to enhance my above example to
Procedure TForm1.MainGraph (Can: TCanvas; fx,fy : single);
where fx and fy are the factors for width and height.
I am assuming that the main image is always fx=1 and fy= 1
so fx and fy for a printer are
fx := Printer.PageWidth/Image1Width;
fy := Printer.PageHeight/Image1.height;
In reality you (most) have to swap PageWidth and PageHeight as an image on the screen is typically landscape and the printer not - but that is a second issue.
And then I only have to do
Can.TextOut (round (x1*fx), round(y1*fy),'A Text');
Winni