我正在尝试在打印到PDF时设置文件名。设置(Printers.pas)Printer.Title适用于默认大多数PDF打印引擎(Adobe,CutePDF)的PDF文件名,但它不适用于" Microsoft打印到PDF"也不是" Microsoft XPS Document Writer"
在调用Printer.BeginDoc时调用的打印对话框中设置文件名的正确方法是什么?如果设置Printer.Title是正确的方法,那么是否有针对" Windows打印到PDF"?
的解决方法使用Delphi XE。
谢谢!
答案 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
可以设置输出文件名。
答案 2 :(得分:0)
Marc Adans的答案是使用Delphi 7和Windows 10的一个很好的起点,它概括了您期望的方式(请记住filename参数的PChar方面)。我还没有将其推广到多页输出,但是我希望它能正常工作。这对我来说是个有用的方法。