我正在编写一个WYSIWYG页面设计器应用程序,它允许用户将图像和文本放到设计器面板上,然后将面板打印到PDF。
在我的应用程序的页面设置选项中,用户需要选择页面大小,然后根据所选页面大小,它将在屏幕上显示根据尺寸调整大小的面板(例如A4选择= 8.5 x 11英寸和Panel将根据这些像素尺寸调整大小。)
然后,当用户单击“打印”时,Panel的内容将被绘制为具有所选尺寸的PDF文件。
我正在使用wPDF组件集,特别是TWPPDFPrinter组件来创建PDF。
我的问题:
提前致谢。
答案 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。