AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Quickreport und Windows-Pdf-Printer
Thema durchsuchen
Ansicht
Themen-Optionen

Quickreport und Windows-Pdf-Printer

Ein Thema von FrankJ28 · begonnen am 1. Dez 2020 · letzter Beitrag vom 8. Dez 2021
Antwort Antwort
Seite 1 von 2  1 2      
FrankJ28

Registriert seit: 7. Apr 2008
211 Beiträge
 
Delphi 11 Alexandria
 
#1

Quickreport und Windows-Pdf-Printer

  Alt 1. Dez 2020, 10:33
Hallo in die Runde,
hat jemand eine Idee, wie ich einem Quickreport bei der Ausgabe über den Windows PDF-Printer den Dateinamen mitgeben kann?
Vielen Dank
Frank
"Sage was du tust, und tue was du sagst"
Johannes Rau
  Mit Zitat antworten Zitat
Benutzerbild von tshubaka
tshubaka

Registriert seit: 11. Sep 2009
Ort: Neckertal
35 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Quickreport und Windows-Pdf-Printer

  Alt 1. Dez 2020, 12:37
Hallo
ich mache das so.
Delphi-Quellcode:
  DateiName := EPANr.Text +'_'+ EdArtikelnummer.Text +'_'+ FMesswerkzeug.ESerieNr.Text +'.pdf';
  DateiName := CheckCharsInString(['\','/',':','?','"','<','>','|','*'], '_', DateiName);
  SavePDF.FileName := DateiName;
  if SavePDF.Execute then
  begin
    expFilt := TQRPDFDocumentFilter.create(SavePDF.FileName);
Gruss
Peter
  Mit Zitat antworten Zitat
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
FrankJ28

Registriert seit: 7. Apr 2008
211 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Quickreport und Windows-Pdf-Printer

  Alt 1. Dez 2020, 18:03
Hallo und vielen Dank an euch.
Da der QR in QRPRNTR bei Druckerwechsel jeweils ein eigenes GetPrinter, SetPrinter durchführt löse ich das durch Setzen des gewünschten PDF-Names in der aufrufenden Routine. Dort wechsle ich ja auch automatisch auf den PDF-Printer.

Code:
Printer.PrinterIndex := Printer.Printers.IndexOf('Microsoft Print to PDF'); // MS PDF-Drucker
Printer.Title:='xyz.pdf'; // der gewünschte Dateiname
In der Unit QRPRNTR habe ich dann die Prozedur ResetDriver aufgeschlaut und schaue, ob ein Pdf erzeugt werden soll. Wenn ja, dann setze ich den Port eben mit diesen Dateinamen.

Code:
procedure ResetDriver(aPrinter : TPrinter);
var
  Device, Name, Port: array[0..MAX_PATH] of Char;
  DevMode: THandle;
begin
  aPrinter.GetPrinter( Device, Name, Port , DevMode );
  if Pos('.pdf',aPrinter.Title)>0
     then aPrinter.SetPrinter( Device, Name, PWideChar(aPrinter.Title) , 0 )
     else aPrinter.SetPrinter( Device, Name, Port , 0 );   // 12/02/16
end;
Danke und ciao

Frank
"Sage was du tust, und tue was du sagst"
Johannes Rau
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
801 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Quickreport und Windows-Pdf-Printer

  Alt 7. Dez 2021, 11:22
Danke, das nutze ich auch so um PDFs mit Quickreport zu erstellen. Das Problem ist jetzt nur: Woher weiß ich, wann der PDF-Drucker fertig ist? Ich möchte die PDF-Datei per Schalterklick erstellen und dann auf ein Netzlaufwerk kopieren. Dazu muss sie vollständig erstellt sein.
  Mit Zitat antworten Zitat
FrankJ28

Registriert seit: 7. Apr 2008
211 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Quickreport und Windows-Pdf-Printer

  Alt 7. Dez 2021, 12:41
Hi,
in der Tat habe ich das Problem "wann fertig" auch noch nicht gelöst. Was spricht in deinem Fall gegen den Dateinamen inklusive Netzwerkpfad?
Ciao
Frank
"Sage was du tust, und tue was du sagst"
Johannes Rau
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
801 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Quickreport und Windows-Pdf-Printer

  Alt 7. Dez 2021, 12:54
in der Tat habe ich das Problem "wann fertig" auch noch nicht gelöst. Was spricht in deinem Fall gegen den Dateinamen inklusive Netzwerkpfad?
Im Netzwerkpfad dürfen nur vollständige Dateien liegen, weil noch mehr damit gemacht wird. Der Ordner wird überwacht. Ist dort eine neue Datei, wird sie automatisch ins DMS importiert. Das soll und kann nur mit fertigen Dateien passieren.
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
480 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Quickreport und Windows-Pdf-Printer

  Alt 7. Dez 2021, 14:09
Könnte man nicht testen, ob sich die Datei exklusiv (fmOpenRead or fmShareExclusive) öffnen lässt?
Wenn die noch offen zum Schreiben ist, sollte das dann einen Fehler erzeugen.
ein kleines Beispiel: (Datei muss aber vorhanden sein)
Delphi-Quellcode:
function FileNotOpen(AFileName: string): Boolean;
begin
  try
    TFileStream.Create(AFileName, fmOpenRead or fmShareExclusive).Free;
    Result := True;
  except
    Result := False;
  end;
end;
Bernd
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
801 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Quickreport und Windows-Pdf-Printer

  Alt 7. Dez 2021, 18:18
Könnte man nicht testen, ob sich die Datei exklusiv (fmOpenRead or fmShareExclusive) öffnen lässt?
Danke, das könnte ein guter Ansatz sein. Ich teste das mal.
  Mit Zitat antworten Zitat
FrankJ28

Registriert seit: 7. Apr 2008
211 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Quickreport und Windows-Pdf-Printer

  Alt 8. Dez 2021, 10:21
in der Tat habe ich das Problem "wann fertig" auch noch nicht gelöst. Was spricht in deinem Fall gegen den Dateinamen inklusive Netzwerkpfad?
Im Netzwerkpfad dürfen nur vollständige Dateien liegen, weil noch mehr damit gemacht wird. Der Ordner wird überwacht. Ist dort eine neue Datei, wird sie automatisch ins DMS importiert. Das soll und kann nur mit fertigen Dateien passieren.
Hi,
dann hast Du doch das gleiche Problem, wenn Du die Datei auf das Netzwerklaufwerk kopierts. Die ist ja nun auch nicht "schwupps da".
Ciao
Frank
"Sage was du tust, und tue was du sagst"
Johannes Rau
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz