如何在打印到&#34时设置文件名; Microsoft打印到PDF"在德尔福

时间:2017-01-19 17:31:26

标签: delphi pdf printing

我正在尝试在打印到PDF时设置文件名。设置(Printers.pas)Printer.Title适用于默认大多数PDF打印引擎(Adobe,CutePDF)的PDF文件名,但它不适用于" Microsoft打印到PDF"也不是" Microsoft XPS Document Writer"

在调用Printer.BeginDoc时调用的打印对话框中设置文件名的正确方法是什么?如果设置Printer.Title是正确的方法,那么是否有针对" Windows打印到PDF"?

的解决方法

使用Delphi XE。

谢谢!

3 个答案:

答案 0 :(得分:3)

你可以试试。

var
  DeviceMode: THandle;
  Device, Driver, Port: array[0..80] of Char;
begin
  Printer.PrinterIndex := Printer.Printers.IndexOf('Microsoft Print to PDF');
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  Printer.SetPrinter(Device, Driver, 'C:\Temp\Test.pdf', 0);

  Printer.BeginDoc;
  Printer.Canvas.TextOut(100, 100, 'Test');
  Printer.EndDoc;
end;

答案 1 :(得分:2)

如果在没有vcl的情况下进行打印,则可以设置输出路径。这意味着您必须使用TDocInfo单元中名为WinApi.Windows的{​​{3}}结构。我已经适应了DOCINFO的官方例子:

procedure TForm1.Button1Click(Sender: TObject);
var
  Pd : TPrintDlg;
  DocInfo: TDocInfo;
const
  DOC_NAME = 'Stack Overflow';
  FILE_NAME = 'C:\temp\print\SO.pdf';
  MAX_PATH = 260;
begin
  Pd := default(TPrintDlg);
  Pd.lStructSize := sizeof(Pd);
  Pd.hWndOwner := Form1.Handle;
  Pd.Flags := PD_RETURNDC;
  if PrintDlg(pd) then begin
    DocInfo := Default(TDocInfo);
    DocInfo.cbSize := SizeOf(DocInfo);
    DocInfo.lpszDocName := StrAllocW(32);
    DocInfo.lpszOutput := StrAllocW(MAX_PATH);
    lStrCpynW(DocInfo.lpszDocName, DOC_NAME, Length(DOC_NAME) * sizeof(char));
    lStrCpynW(DocInfo.lpszOutput, FILE_NAME, Length(FILE_NAME) * sizeof(char));
    StartDoc(Pd.hDc, DocInfo);
    StartPage(Pd.hDc);
    TextOut(Pd.hDc, 100, 100, 'Page 1', 6);
    EndPage(Pd.hDc);
    StartPage(Pd.hDc);
    TextOut(Pd.hDc, 100, 100, 'Page 2', 6);
    EndPage(Pd.hDc);
    EndDoc(Pd.hDc);
    StrDisposeW(DocInfo.lpszDocName);
    StrDisposeW(DocInfo.lpszOutput);
  end;
end;

如果您选择" Microsoft Print To Pdf" 作为打印机,则设置lpszOutput可以设置输出文件名。

Embarcadero

答案 2 :(得分:0)

Marc Adans的答案是使用Delphi 7和Windows 10的一个很好的起点,它概括了您期望的方式(请记住filename参数的PChar方面)。我还没有将其推广到多页输出,但是我希望它能正常工作。这对我来说是个有用的方法。