如何获取所有纸张尺寸名称和相应的像素尺寸?

时间:2011-08-19 13:32:13

标签: delphi

我正在编写一个WYSIWYG页面设计器应用程序,它允许用户将图像和文本放到设计器面板上,然后将面板打印到PDF。

在我的应用程序的页面设置选项中,用户需要选择页面大小,然后根据所选页面大小,它将在屏幕上显示根据尺寸调整大小的面板(例如A4选择= 8.5 x 11英寸和Panel将根据这些像素尺寸调整大小。)

然后,当用户单击“打印”时,Panel的内容将被绘制为具有所选尺寸的PDF文件。

我正在使用wPDF组件集,特别是TWPPDFPrinter组件来创建PDF。

我的问题:

  1. 如何获取所有纸张尺寸名称的列表,以及如何获取wPDFPrinter的相应尺寸?
  2. 提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以使用EnumForms和查询本地打印服务器获取纸张尺寸列表。见this question

答案 1 :(得分:1)

获取系统中定义的所有打印机表单的列表:

uses
  winspool, printers;

...


procedure TForm1.Button1Click(Sender: TObject);
var
  HPrinter: THandle;
  Forms: array of TFormInfo1;
  Count, Needed, Returned: DWORD;
  i: Integer;
begin
  Memo1.Clear;
  if OpenPrinter(nil, HPrinter, nil) then begin
    try
      if not EnumForms(HPrinter, 1, nil, 0, Needed, Returned) then begin

        // we should fail here since we didn't pass a buffer
        if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
          RaiseLastOSError;

        Count := (Needed div SizeOf(TFormInfo1)) + 1;
        SetLength(Forms, Count);
        if EnumForms(HPrinter, 1, @Forms[0], SizeOf(TFormInfo1) * Count, Needed,
            Returned) then begin
          if Returned < Count then
            SetLength(Forms, Returned);
          for i := 0 to Returned - 1 do begin
             Memo1.Lines.Add(Format('Paper name: %s,   Paper size: %dmm x %dmm',
                            [Forms[i].pName,
                             Forms[i].Size.cx div 1000,
                             Forms[i].Size.cy div 1000]))
          end;
        end else
          RaiseLastOSError;
      end;
    finally
      ClosePrinter(HPrinter);
    end;
  end else
    RaiseLastOSError;
end;

答案 2 :(得分:0)

为什么不使用默认的打印机设置对话框?

将以下处理程序链接到OnAccept操作的TFilePrintSetup事件:

procedure TForm1.FilePrintSetup1Accept(Sender: TObject);
var
  Scale: Single;
begin
  Scale := Printer.PageHeight / Printer.PageWidth;
  DesignerPanel.Height := Round(DesignerPanel.Width * Scale);
end;

Étvoila。