Einzelnen Beitrag anzeigen

Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
103 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Quickreport und Windows-Pdf-Printer

  Alt 1. Dez 2020, 14:21
hat jemand eine Idee, wie ich einem Quickreport bei der Ausgabe über den Windows PDF-Printer den Dateinamen mitgeben kann?
Ich vermute mal, Du willst den Drucker "Microsoft Print to PDF" per QuickRep.Print() nutzen, ohne den von tshubaka erwähnten QRExport-Filter.

Ohne tiefe Eingriffe in den Code von QuickReport wird das kaum möglich sein. Das Windows-API bietet zwar eine Möglichkeit, den Ausgabe-Dateinamen beim Start des Druckjobs mitzugeben, aber leider ist dies in Vcl.Printers.pas so verkapselt, dass man da nicht dran kommt:
Code:
procedure TPrinter.BeginDoc;
var
  DocInfo : TDocInfo;
begin
...
  FillChar(DocInfo, SizeOf(DocInfo), 0);
  with DocInfo do
  begin
    cbSize := SizeOf(DocInfo);
    lpszDocName := PChar(Title);
    lpszOutput := PChar(OutFileName); // diese neue Zeile wäre erforderlich!
  end;
...
  if StartDoc(DC, DocInfo) <= 0 then...
TPrinter.BeginDoc() ist leider nicht virtuell, kann also nicht mit eigenem Code überschrieben werden. Es gibt seit Jahren einen QP-Eintrag zu diesem Thema, aber da passiert nix:RSP-13430. Mein Vorschlag wäre entweder ein Property "OutFileName" einzubauen, oder ein OnBeginDoc-Event, in welchem man den DocInfo-Record nochmal anpassen kann.

Ein anderer Weg ist hier beschrieben:
Code:
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;
Aber QuickReport versteckt die Verwendung von TPrinter in seiner eigenen Klasse TQRPrinter, also müsste man das auch aufbohren.
Achim
  Mit Zitat antworten Zitat