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