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

Posted

技术标签:

【中文标题】如何获取所有纸张尺寸名称和相应的像素尺寸?【英文标题】:How to get all paper size names and corresponding pixel dimensions? 【发布时间】:2011-08-19 13:32:12 【问题描述】:

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

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

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

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

我的问题:

    如何获取所有纸张尺寸名称的列表,然后如何获取它们对应的 wPDFPrinter 尺寸?

提前致谢。

【问题讨论】:

请准确定义“所有纸张尺寸”的含义 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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;

【讨论】:

谢谢你的答案。但是第一件事是TWPPDFPrinter是一个组件,那么如何选择这个作为打印机索引呢? @Steve - 我以为它是一台打印机...无论如何,您要么获得假脱机程序中定义的所有表单的列表,要么获得特定打印机支持的表单列表。对于前者,将“nil”作为OpenPrinter 的第一个参数传递,对于后者,您应该将打印机名称作为“OpenPrinter”的第一个参数传递。 (当然,实际上并不完全需要选择打印机,只需将“nil”或有效的“打印机名称”传递给 OpenPrinter)。 OTOH 似乎没有什么不同。请参阅注释on this page,我可以在此处进行验证,并且网络上的线程数量相同。简而言之,如果您想获取特定打印机支持的列表,请不要使用“EnumForms”,请使用“DeviceCapabilities”。 感谢 Sertac。这很有帮助。【参考方案3】:

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

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

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

瞧瞧。

【讨论】:

以上是关于如何获取所有纸张尺寸名称和相应的像素尺寸?的主要内容,如果未能解决你的问题,请参考以下文章

ASP 里如何获取图片的尺寸呀? 谢谢!

C#打印的时候如何设置A4纸张为横向

[紧急求助]mapx 如何打印任何尺寸纸张?

如何获取图像文件的尺寸?

更改打印机默认纸张大小

EXCEL中纸张尺寸如何让设置自定义大小?