What if you do this? Are there two rectangles? Is one of them at the right place?
It works for me on a real printer. CUPS-PDF has no margins.
procedure TForm1.Button1Click(Sender: TObject);
begin
if PrintDialog1.Execute then
begin
Caption:=Inttostr(TPrinterCanvas(Printer.Canvas).LeftMargin)+' '+Inttostr(TPrinterCanvas(Printer.Canvas).TopMargin);
Printer.BeginDoc;
Printer.Canvas.Rectangle(
round(2*Printer.XDPI / 2.54),
round(2*Printer.YDPI / 2.54),
round(3*Printer.XDPI / 2.54),
round(3*Printer.YDPI / 2.54));
Printer.Canvas.Rectangle(
round(2*Printer.XDPI / 2.54)-TPrinterCanvas(Printer.Canvas).LeftMargin,
round(2*Printer.YDPI / 2.54)-TPrinterCanvas(Printer.Canvas).TopMargin,
round(3*Printer.XDPI / 2.54)-TPrinterCanvas(Printer.Canvas).LeftMargin,
round(3*Printer.YDPI / 2.54)-TPrinterCanvas(Printer.Canvas).TopMargin);
Printer.EndDoc;
end;
end;
Probably you can get these values also in a more "official" way by using
Printer.PaperSize.PaperRect
I don't know. Please test.