问题
I am trying to set the filename when printing to PDF. Setting (Printers.pas) Printer.Title works to default the PDF filename for most PDF printing engines (Adobe, CutePDF), however it does not work for "Microsoft print to PDF" nor "Microsoft XPS Document Writer"
What is the correct way to set the filename in the print dialog invoked when Printer.BeginDoc is called? If setting Printer.Title is the correct way, then is there a workaround for "Windows print to PDF"?
Using Delphi XE.
Thanks!
回答1:
You can try.
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;
回答2:
You can set the output path if you do printing without vcl. That means you have to use the DOCINFO structure, named TDocInfo
from the WinApi.Windows
unit. I've sligtly adapted the official example from Embarcadero:
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;
Setting lpszOutput
enables you to set the output file name if you select "Microsoft Print To Pdf" as printer.
回答3:
Marc Adans answer is a good starting point with Delphi 7 and Windows 10 and generalizes the way you would expect (keeping in mind the PChar aspect of the filename parameter). I have not generalized to multi-page output, but I would expect it to work fine. This is a useful approach for me.
来源:https://stackoverflow.com/questions/41748116/how-to-set-filename-when-printing-to-microsoft-print-to-pdf-in-delphi