Recent

Author Topic: Can't print with more than 72 DPI resolution!  (Read 7372 times)

mdkass

  • New member
  • *
  • Posts: 8
Can't print with more than 72 DPI resolution!
« on: September 14, 2011, 01:52:03 pm »
After getting the printer device and begining the printing functions I always get xdpi and ydpi equal to 72!
My printer can print with 600 dpi

can any expert help me please?

Shebuka

  • Sr. Member
  • ****
  • Posts: 422
Re: Can't print with more than 72 DPI resolution!
« Reply #1 on: September 14, 2011, 02:15:42 pm »
After getting the printer device and begining the printing functions I always get xdpi and ydpi equal to 72!
My printer can print with 600 dpi

can any expert help me please?
I don't understand the question... Show a test project with description of what you need to achieve.

mdkass

  • New member
  • *
  • Posts: 8
Re: Can't print with more than 72 DPI resolution!
« Reply #2 on: September 15, 2011, 12:43:15 pm »
Code: [Select]
if PrintDialogSetup.Execute then //here the user can choose his printer.
begin
   Printer.BeginDoc;
   //Printer.xdpi,Printer.ydpi are always equal to 72 and this gives low quality prints
   // some printing code here
   Printer.EndDoc;
end;
I'm sure that my printer can print with 600 dpi and its driver is installed correctly.

alanphys

  • New Member
  • *
  • Posts: 39
Re: Can't print with more than 72 DPI resolution!
« Reply #3 on: January 03, 2012, 11:15:25 am »
If you are printing under linux it generally returns 72 dpi as documents are first converted to PostScript and then printed.

I said in a previous post that this is always the case, but I have just tried this on an HP Laserjet 1200 with Lazarus 09.31 and Printer.XDPI is reporting the resolution as 1200 which is the max resolution of the printer. Problem is the normal printing mode is 600 dpi. I could have sworn that previously this printer was reporting 72 dpi. Obviously something must have changed. Sigh... pull hair out.):

OK, my apologies, Linux is now giving the correct dpi in printer pixels same as Windows, see bug tracker 13356. I don't know about Mac OS X though.
« Last Edit: January 03, 2012, 01:04:48 pm by alanphys »
Alanphys

murray

  • New member
  • *
  • Posts: 5
Re: Can't print with more than 72 DPI resolution!
« Reply #4 on: September 07, 2012, 01:22:40 pm »
Linux is now giving the correct dpi in printer pixels same as Windows, see bug tracker 13356. I don't know about Mac OS X though.

Sorry for cutting in here, but I think this issue is still alive and present on Mac OS X. To test this, I have written a small app which has a button and a TPrintDialog on a form. The OnClick of the button code is below (excuse the badly factored code, but it's a knock-up). I have run this on MacOS and saved the print to PDF, and on Windows used pdfcreator to save the PDF. To cross-check, I have also verified that the output looks the same when printed to the same, real printer (a LaserJet 1320), so these PDFs reflect actual printout.

As I see it, there are actually three differences to be concerned about (margins/printable area, text size, line thickness), but this topic is only about line thickness, which seems to be caused by the 72dpi setting (having read bug 13356). It would appear that this has been fixed in linux, but those changes have not been ported to macos.

I can't believe that I'm the only one seeing this, so it makes me wonder if I'm approaching the printing from the wrong angle. Is there another technique for getting consistent behaviour from the same codebase across all platforms, or is this still a bug?

Thanks,

Murray.



procedure TForm1.Button1Click(Sender: TObject);
var
  lh : integer;
begin
  if not PrintDialog1.Execute then exit;

  with printer do
  begin
    BeginDoc;
    lh := Canvas.TextHeight('X');
    Canvas.Rectangle(0,0,PageWidth-1, PageHeight-1);
    Canvas.Polyline([point(0,0),point(PageWidth-1, PageHeight-1)]);
    Canvas.Polyline([point(0,PageHeight-1),point(PageWidth-1, 0)]);
    Canvas.TextOut(XDPI, YDPI+lh,   'PageWidth='+IntToStr(PageWidth));
    Canvas.TextOut(XDPI, YDPI+lh*2, 'PageHeight='+IntToStr(PageHeight));
    Canvas.TextOut(XDPI, YDPI+lh*3, 'XDPI='+IntToStr(XDPI));
    Canvas.TextOut(XDPI, YDPI+lh*4, 'YDPI='+IntToStr(YDPI));

    Canvas.TextOut(XDPI, YDPI+lh*6, 'Canvas.PageWidth='+IntToStr(TPrinterCanvas(Canvas).PageWidth));
    Canvas.TextOut(XDPI, YDPI+lh*7, 'Canvas.PageHeight='+IntToStr(TPrinterCanvas(Canvas).PageHeight));

    Canvas.TextOut(XDPI, YDPI+lh*9 ,'Canvas.PaperWidth='+IntToStr(TPrinterCanvas(Canvas).PaperWidth));
    Canvas.TextOut(XDPI, YDPI+lh*10,'Canvas.PaperHeight='+IntToStr(TPrinterCanvas(Canvas).PaperHeight));

    Canvas.TextOut(XDPI, YDPI+lh*11,'Canvas.TopMargin='+IntToStr(TPrinterCanvas(Canvas).TopMargin));
    Canvas.TextOut(XDPI, YDPI+lh*12,'Canvas.BottomMargin='+IntToStr(TPrinterCanvas(Canvas).BottomMargin));
    Canvas.TextOut(XDPI, YDPI+lh*13,'Canvas.LeftMargin='+IntToStr(TPrinterCanvas(Canvas).LeftMargin));
    Canvas.TextOut(XDPI, YDPI+lh*14,'Canvas.RightMargin='+IntToStr(TPrinterCanvas(Canvas).RightMargin));
    EndDoc;
  end
end;

zeljko

  • Hero Member
  • *****
  • Posts: 1057
    • http://wiki.lazarus.freepascal.org/User:Zeljan
Re: Can't print with more than 72 DPI resolution!
« Reply #5 on: September 23, 2012, 08:46:46 am »
That's because printer dpi is hardcoded for carbon (not implemented)
Look in components/printers/carbon/carbonprinters.inc

function TCarbonPrinter.GetXDPI: Integer;
begin
  Result := 72;
end;

function TCarbonPrinter.GetYDPI: Integer;
begin
  Result := 72;
end;