How to set filename when printing to “Microsoft print to PDF” in delphi

大城市里の小女人 提交于 2019-12-19 03:58:48

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!