use*_*960 5 printing pdf delphi
我正在尝试在打印为 PDF 时设置文件名。设置 (Printers.pas) Printer.Title 可以为大多数 PDF 打印引擎(Adobe、CutePDF)默认 PDF 文件名,但它不适用于“Microsoft 打印到 PDF”或“Microsoft XPS 文档编写器”
在调用 Printer.BeginDoc 时调用的打印对话框中设置文件名的正确方法是什么?如果设置 Printer.Title 是正确的方法,那么“Windows 打印到 PDF”是否有解决方法?
使用 Delphi XE。
谢谢!
小智 5
你可以试试。
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;
Run Code Online (Sandbox Code Playgroud)
如果不使用 vcl 进行打印,可以设置输出路径。这意味着您必须使用DOCINFO结构,TDocInfo从WinApi.Windows单元命名。我稍微改编了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;
Run Code Online (Sandbox Code Playgroud)
lpszOutput如果选择“Microsoft Print To Pdf”作为打印机,则可以通过设置设置输出文件名。