如何在delphi中打印到“Microsoft打印到PDF”时设置文件名

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)


ven*_*eis 2

如果不使用 vcl 进行打印,可以设置输出路径。这意味着您必须使用DOCINFO结构,TDocInfoWinApi.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”作为打印机,则可以通过设置设置输出文件名。

创建了 pdf 文件