Delphi 如何在打印到“时设置文件名”;“Microsoft打印到PDF”;在德尔菲

Delphi 如何在打印到“时设置文件名”;“Microsoft打印到PDF”;在德尔菲,delphi,pdf,printing,Delphi,Pdf,Printing,我试图在打印为PDF时设置文件名。设置(Printers.pas)Printer.Title可用于大多数PDF打印引擎(Adobe、CutePDF)的默认PDF文件名,但不适用于“Microsoft print to PDF”或“Microsoft XPS Document Writer” 调用Printer.BeginDoc时,在调用的打印对话框中设置文件名的正确方法是什么?如果设置Printer.Title是正确的方法,那么“Windows打印到PDF”是否有解决方法 使用delphixe

我试图在打印为PDF时设置文件名。设置(Printers.pas)Printer.Title可用于大多数PDF打印引擎(Adobe、CutePDF)的默认PDF文件名,但不适用于“Microsoft print to PDF”或“Microsoft XPS Document Writer”

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

使用delphixe


谢谢

如果不使用vcl进行打印,则可以设置输出路径。这意味着您必须使用
WinApi.Windows
单元中名为
TDocInfo
的结构。我粗略地改编了以下官方示例:

如果选择“Microsoft Print to Pdf”作为打印机,则通过设置
lpszOutput
可以设置输出文件名

你可以试试

var
设备模式:THandle;
设备、驱动程序、端口:字符数组[0..80];
开始
Printer.PrinterIndex:=Printer.Printers.IndexOf('Microsoft Print to PDF');
打印机.GetPrinter(设备、驱动程序、端口、设备模式);
打印机.SetPrinter(设备,驱动程序,'C:\Temp\Test.pdf',0);
Printer.BeginDoc;
Printer.Canvas.TextOut(100100,'Test');
Printer.EndDoc;
结束;

你不能。作为替代,你可以使用Arnaud Bouchez'excellent动态创建PDF文件。非常好!比另一个答案好得多,应该是可以接受的答案。我尝试过:-Bullzip PDF-不起作用(打印成Postscript格式)-BLC easyPDF-不起作用(仍然提示输入文件名)-Microsoft Print to PDF-完全按照原始问题的要求起作用。所以这个答案并不是一个通用的解决方案,但问题似乎存在于每个单独的PDF打印机驱动程序中,而不是这个答案。
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;