- 如何输出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 = 596;
PDF_PAGE_HEIGHT_A4 = 842;
{*
* 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 := 0;
LineFlg := true;
LinePos := - OffsetX;
while LinePos < aWidth do
begin
if LinePos > 0 then
begin
MoveTo(LinePos, 0);
SetPen(Canvas, LineFlg);
LineTo(LinePos, aHeight - 1);
end;
inc(LineCount);
LineFlg := not LineFlg;
LinePos := trunc(LineCount * LINE_PITCH / 20) - OffsetX;
end;
和
LineCount := 0;
LinePos := 0;
while LinePos < self.Width do
begin
TextOut(LinePos + 1, 1, IntToStr(LineCount));
inc(LineCount);
LinePos := trunc(LineCount * LINE_PITCH / 10);
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属性为真(默认值)以在设计界面上缩小显示。