AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Drucken mit gleichzeitigem generieren eines PDFs
Thema durchsuchen
Ansicht
Themen-Optionen

Drucken mit gleichzeitigem generieren eines PDFs

Ein Thema von oakley · begonnen am 25. Feb 2020 · letzter Beitrag vom 8. Mär 2022
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.240 Beiträge
 
Delphi 12 Athens
 
#1

AW: Drucken mit gleichzeitigem generieren eines PDFs

  Alt 21. Feb 2022, 13:37
Ich bin jetzt so weit, dass ich den StdOut vom Redmon in eine .ps Datei schreiben lasse und dann per Ghostscript umwandeln lasse.
Also schafft Redmon das in einem Rutsch, oder musst Du da noch manuell Hand anlegen ?

Wie gesagt, bei mir kommt leider immer nur .ps raus, ist aber bei MFileMon vielleicht ein etwas anderes Redmon.
Ich habe es mit dem orginalen Redmon aber nicht getestet.

Ein Gedanke war dass man damit lebt dass einfach nur .ps ausgegeben wird,
und dann im Hintergrund ein Programm oder Service laufen hat, welches auf den Ausgabepfad lauscht.

Sobald eine neue .ps Datei angekommen ist könnte das Programm
- die Konvertierung von .ps zu PDF automatisch anstossen ( per Batch-Datei )
- die orginale .ps löschen
- und womöglich das Ergebnis an einen echten Drucker schicken, wenn gewünscht
- die generierte .PDF vielleicht noch irgendwohin verteilen

Oder war es dass, was Du unten beschreibst ?

Geändert von Rollo62 (21. Feb 2022 um 13:39 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#2

AW: Drucken mit gleichzeitigem generieren eines PDFs

  Alt 21. Feb 2022, 17:33
Hmm..

1.)
Redmon kann die Druckdaten direkt als Stdout/-in an das aufgerufenen Programm weiter geben.

2.)
Wenn mit der API (.DLL) von Ghostscript gearbeitet wird, kann dieser Stream direkt dorthin weiter gereicht werden, ohne zwischenspeichern als .ps.
Bei Verwendung der GSxx.exe muss dieser Stream meinet Wissens zwischengespeichert werden (hier die .ps) da die Exe eine Datei als Input benötigt..

3.)
Das Erzeugte PDF kann dann zum Einen direkt wieder mit GS an den eigentlichen Drucker geschickt werden und zum Anderen mit PDFTK um dein Hintergrundbild ergänzt werden.



mfilemon dürfte eine umbenannte Kopie von Redmon sein, denn nicht nur die Dialoge, sondern auch die Anleitung kommt mir von Redmon oder FreePDF bekannt vor.
Ob dies gepflegt wird, mag ich bezweifeln, da die Anleitung auch nur bis Win8 geht...
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.240 Beiträge
 
Delphi 12 Athens
 
#3

AW: Drucken mit gleichzeitigem generieren eines PDFs

  Alt 22. Feb 2022, 19:19
Ja, MFileMon scheint ein Ableger von Redmon zu sein, er ist aber aktuell gepflegt.
Während Redmon ziemlich alt ist.

Ich hatte deshalb das MFileMon gesucht, weil igendwo stand das Win10 nicht mehr richtig funktioniert.
Eben weil das Übertragen zum Stdout irgendwie geändert sei.

Offensichtlich kommen ja die Daten im MFileMon auch an, als PS, nur scheint dann das GS nicht angestossen zu werden.
Ich habe immer noch die Hoffnung dass dies ein einfaches Parameter-Problem ist.

Falls das alte Redmon aber immer noch aktuell und amtlich ist, dann ist MFileMon natürlich überflüssig.
Ich hatte mit dem Thema lange nichts zu tun, deshalb kenne ich die Historie von Redmon nicht so gut,
aber könnte demnächst auch eine gute PDF-Drucker Ausgabe brauchen.

Wäre schön wenn man da ein einfaches Kochrezept finden würde

Über den gazen Prozess bin ich mir auch nicht sicher, meine Vermutung:
- Ein Drucker sendet was zum GS-PS Printer
- Dieser erzeugt daraus einen PS Stream
- Und ist verbunden mit MFileMon (oder Redmon ) Port
- Also kommt der PS Stream via dem MFileMon Port zum eigentlich GS, welches Konvertieren soll (gemäß pdfwrite Parameter)
- GS Erzeugt dan mit dem MFileMon (Redmon ) Script die PDF Datei
- GS Speichert die GS Datei an dem festgelegtem Ort, und kann fortlaufenden Filnamen berücksichtigen

So verstehe ich das Ganze, bis auf die letzen beiden Punkte funktioniert es ja anscheinend.

Ob Redmon grundsätzlich was anderes macht als MFileMon sehe ich eigentlich nicht.

Geändert von Rollo62 (22. Feb 2022 um 19:24 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#4

AW: Drucken mit gleichzeitigem generieren eines PDFs

  Alt 23. Feb 2022, 12:22
Hmm..

Deine Schritte stimmen nicht ganz!

- Ein Programm schickt den Druckauftrag (per Windows GDI) an einen installierten Drucker (Treiber, z.B. 'Mircosoft Print to PDF')

- Der Treiber Konvertiert die GDI-Daten in Rohdaten, welche der Drucker versteht.
(Handelt es sich hierbei um einen PostScript Drucker, dann sind die Daten danach PostScript)

- Die Roh-Daten werden dann an den Drucker Anschluss (Port, z.B. LPT/USB/IP oder auch Redmon) weitergeleitet und dieser Port-Treiber reicht diese dann an den Physikalischen Drucker weiter.

- Der Ausdruck erfolgt.

Hier kommt nun RedMon ins Spiel!

Wenn Redmon als Druckeranschluss angegeben wird, dann gibt Redmon diese nicht an den Drucker weiter, sondern ,je nach Konfiguration, an ein Script oder Programm.

Dieses Script kann dann mit diesen Roh-Daten machen, was es will, z.B. als .PS abspeichern, oder bei PostScript diese per GhostScript in ein PDF konvertieren, oder die Roh-Daten bearbeiten und an den 'echten' Druckeranschluss weiter leiten.

Wenn Du deine CMD-Zeile mit Ghostscript bei RedMon einträgst, dann werden die Daten direkt an GS geschickt, jedoch solltest Du hierfür eine separate Batch Datei als Ziel nehmen, wie es im Internet mehrfachst beschrieben wird.
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.240 Beiträge
 
Delphi 12 Athens
 
#5

AW: Drucken mit gleichzeitigem generieren eines PDFs

  Alt 23. Feb 2022, 15:20
Deine Schritte stimmen nicht ganz!

- Ein Programm schickt den Druckauftrag (per Windows GDI) an einen installierten Drucker (Treiber, z.B. 'Mircosoft Print to PDF')
Ich hatte aber irgendwo gelesen dass dafür am Besten GhostScript PS Drucker installiert werden sollte,
das habe ich gemacht.
Damit kommen auch astreine .PS und nach Konvertierung PDF's raus.

Kann sein dass es mit "Microsoft Print to PDF" auch geht, aber dann muss man den ja mit Redmon umbiegen,
oder sich einen 2ten "Microsoft Print to PDF" installieren.

Ich denke der Trick ist, egal welcher Drucker, Redmon/MFileMon legen sich als Port an und fangen den Druck ab.
Das scheint soweit ja auch zu funktionieren.
  Mit Zitat antworten Zitat
oakley

Registriert seit: 15. Aug 2005
287 Beiträge
 
#6

AW: Drucken mit gleichzeitigem generieren eines PDFs

  Alt 8. Mär 2022, 22:20
Hallo zusammen,

ich möchte nur kurz sagen, wie ich das Ganze bis jetzt gemacht habe:

Hiermit schreibe ich die PS Datei

Delphi-Quellcode:
  XStream := TMemoryStream.Create;
  StdIn := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
  StdIn.Seek(0,0);
  repeat
    BytesRead := StdIn.Read(Buffer,1024);
    if BytesRead > 0 then
      XStream.WriteBuffer(Buffer,BytesRead);
   until BytesRead <= 0;

  //exportdir = Dir to export files
  FStream := TFileStream.Create(exportdir + 'xy.ps', fmCreate);
  XStream.Position := 0;
  if FStream.CopyFrom(XStream, XStream.Size) > 0 then
  begin
    FStream.Free;
    XStream.Free;
    try
      try
        oGS := TGhostScript.Create;
        oGS.ExecuteWithArgs(GetArgs);
      finally
        FreeAndNil(oGS);
      end;
    except
      on E: TExceptionGS do
      begin
      end;
    end;
Die Funtion ExecuteWithArgs(GetArgs) führt die Konvertierung zum PDF mit Ghostscript aus:

Delphi-Quellcode:
function TForm1.GetArgs(): APAnsiChar;
var
  oArgs: APAnsiChar;
begin
    setlength(oArgs, 0);
    AddArg(oArgs, 'gs');
    AddArg(oArgs, '-r300');
    AddArg(oArgs, '-dNOSAFER');
    AddArg(oArgs, '-dBATCH');
    AddArg(oArgs, '-dNOPAUSE');
    AddArg(oArgs, '-sDEVICE=pdfwrite');
    AddArg(oArgs, '-dPDFSETTINGS=/ebook');
    AddArg(oArgs, '-sFONTPATH=%windir%/fonts');
    AddArg(oArgs, '-dEmbedAllFonts=true');
    AddArg(oArgs, '-dSubsetFonts=true');
    AddArg(oArgs, '-dNumRenderingThreads=8');
    AddArg(oArgs, '-sOutputFile=' + exportdir + filename);
    AddArg(oArgs, '-f');
    AddArg(oArgs, exportdir + 'xy.ps');
    result := oArgs;
end;
Ich rufe oGS.ExecuteWithArgs(GetArgs2) nochmal mit anderen Parametern auf um die Ausgabe zum Drucker um zu leiten.

Delphi-Quellcode:
function TForm1.GetArgs2(): APAnsiChar;
var
  oArgs: APAnsiChar;
begin
    setlength(oArgs, 0);
    AddArg(oArgs, 'gs');
    AddArg(oArgs, '-dBATCH');
    AddArg(oArgs, '-dNOPAUSE');
    AddArg(oArgs, '-dNOSAFER');
    AddArg(oArgs, '-sDEVICE=mswinpr2');
    AddArg(oArgs, '-sOutputFile=%printer%TESTPS');
    AddArg(oArgs, exportdir + 'xy.ps');
    result := oArgs;
end;
Hier wird ein Test-Drucker namens TESTPS angesteuert.
Soweit funktioniert alles.

LG

Mirko
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz