天天看点

关于Lazarus下PowerPDF控件的使用

  • 如何输出PDF

PowerPDF使用TPRPage作为页面容器,只要简单地将一个生成好的TPRPage输出到TPReport中即可生成PDF文件的一个页面,页面的尺寸由TPRPage的高度宽度决定。

PReport1.FileName:= 'test.pdf';
  PReport1.BeginDoc;
  PReport1.Print(PRPage1);
  PReport1.EndDoc;  
           
  • 尺寸和位置的计算

PDF格式的默认DPI是72,PowerPDF也使用这个数据,参见常量定义如下:

{*
   * PreDefined page size
   *}
  PDF_PAGE_WIDTH_A4 = ;
  PDF_PAGE_HEIGHT_A4 = ;

  {*
   * Dafault page size.
   *}
  PDF_DEFAULT_PAGE_WIDTH = PDF_PAGE_WIDTH_A4;
  PDF_DEFAULT_PAGE_HEIGHT = PDF_PAGE_HEIGHT_A4;
           

A4页面实际尺寸是219×297mm,程序里常量设置的默认的尺寸是596×842,计算得到dpi是72。确认无误。

  • 设计期网格尺寸的修正

但是,同样的A4页面在设计期页面上的显示出的网格数只有大约15.7×22.3(格),既不是英寸,也不是厘米。

检查PReport单元,发现在网格绘制时使用了一个常量

LINE_PITCH: integer = 378;

,检查涉及这个常量的代码(摘录)

// drawing vertical lines.
    LineCount := ;
    LineFlg := true;
    LinePos := - OffsetX;
    while LinePos < aWidth do
    begin
      if LinePos >  then
      begin
        MoveTo(LinePos, );
        SetPen(Canvas, LineFlg);
        LineTo(LinePos, aHeight - );
      end;
      inc(LineCount);
      LineFlg := not LineFlg;
      LinePos := trunc(LineCount * LINE_PITCH / ) - OffsetX;
    end;  
           

LineCount := ;
    LinePos := ;
    while LinePos < self.Width do
    begin
      TextOut(LinePos + , , IntToStr(LineCount));
      inc(LineCount);
      LinePos := trunc(LineCount * LINE_PITCH / );
    end;
           

按设计来说,这个网格应当是作为0.5和1cm的标尺使用的,也就是说,LINE_PITCH应当是代表每厘米像素数的10倍。

1/2.54×DPI=LINE_PITCH/10

10/2.54×DPI=378

2.54/10=DPI/378

DPI=2.54/10×378

求得DPI=96.012,即,网格是按96dpi的分辨率绘制的,而前面提到,尺寸的计算是按72dpi进行,因此导致网格显示不正常。

计算得到新的LINE_PICTH值:283.7,修正并重新编译后,网格显示正常。

  • 高精度图片的使用

72dpi的精度不足以满足大多数场合对于图片输出的需要,因此需要对插入的图片做调整。

在TPRImage里提供了ScaleX和ScaleY两个属性用于将高DPI的图片按比例缩小成对应于72dpi的尺寸输出。

例如,如果需要288dpi的精度输出一个1英寸×1英寸的图片,可以将一个288像素×288像素的图片置入一个设置为72像素×72像素的TPRImage,并设置ScaleX和ScaleY为0.25(4倍dpi,缩放为1/4),同时设置Stretch属性为真(默认值)以在设计界面上缩小显示。

继续阅读