Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi PDF-Dateien drucken (viele) (https://www.delphipraxis.net/211883-pdf-dateien-drucken-viele.html)

rokli 16. Nov 2022 12:07

PDF-Dateien drucken (viele)
 
Moin,
wir müssen zwei mal am Tag, Morgens und Mittags, PDF-Dateien drucken, die von unserem ERP System erstellt werden.
Die PDF-Dateien liegen als einzelne Dateien in einer Netzwerkfreigabe auf einem Windows Server. In der Regel hat jedes Dokument eine DinA4 Seite Inhalt. Manchmal 2 Seiten. Der Inhalt ist Text und 2 Barcodes.
Es handelt sich um jeweils ca. 500 Seiten - die in einer definierten Reihenfolge ausgegeben werden müssen. Die Reihenfolge definiert ein SQL Statement, dass die gewünschte Sortierung erstellt und dann im Datensatz Informationen für den Speicherort und den Dateinamen bereitstellt.
Gedruckt wird das ganze auf einem Kyocera TASKalfa 4002i.
Gedruckt wird mit Foxit Reader, da der Adobe Acrobat Reader garnicht zum laufen zu bringen war.

Dazu haben wir einen Druckjob geschrieben, der in einer Schleife die Datenbank durchläuft und für jede Datei diese Prozedur aufruft:

Delphi-Quellcode:
procedure TfrmMain.p_PrintAndUpdate(cFileName, cDruckWeg : String);
// Neues Dateiprinten
const
   DprPath = '';
   OutPutPath = '';
var
   Parameters   : String;
   Dcc32Path   : String; // 'C:\Program Files (x86)\Foxit Software\Foxit Reader\Foxit Reader.exe';
begin
   Dcc32Path   := FoxitReader;
   Parameters   := '/p ' + cFileName;

   ShellExecAndWait(Dcc32Path , OutPutPath , Parameters ,'open', 1);
end;
Der SchellExecAndWait wird verwendet, weil sonst die Dokumente immer wieder durcheinander gedruckt wurden.

Seid ein paar Tagen haben wir das Problem, dass zwischendurch einseitige PDF-Dokumente zerstückelt werden, nur zur Hälfte gedruckt werden oder auch leere Blätter ausgegeben werden.

Habt Ihr ähnliche Anforderungen, so viel Dokumente auf einmal auszudrucken?
Wie habt Ihr das gelöst?
Wäre das zusammen-mergen von z. B. jeweils 100 PDF-Dokumenten zu einem einzigen neuen PDF-Dokument eine Option? Dann gäbe es nur noch 5 Druckerwarteschlagen-Einträge.

Danke für Tipps.

Phoenix 16. Nov 2022 12:34

AW: PDF-Dateien drucken (viele)
 
Zitat:

Zitat von rokli (Beitrag 1514846)
Wäre das zusammen-mergen von z. B. jeweils 100 PDF-Dokumenten zu einem einzigen neuen PDF-Dokument eine Option? Dann gäbe es nur noch 5 Druckerwarteschlagen-Einträge.

Ja, das wäre jetzt ganz spontan meine erste Idee gewesen.

Da kann dann auch grundsätzlich weniger schief gehen.
Du hast die Files, kannst die mit entsprechenden Tools zu einem großen PDF zusammen packen, und das dann drucken.

Ich würde allerdings ein wenig experimentieren. PDFs zu handhaben ist immer etwas tricky, und kann je nach verwendetem Tooling gerne mal extrem auf den Arbeitsspeicher gehen.
Ggf. ist es schneller oder praktikabler, 50x 10 zu machen als 5x 100 (oder irgendwas in der Mitte, wie gesagt, am besten etwas experimentieren).

Sinspin 16. Nov 2022 13:20

AW: PDF-Dateien drucken (viele)
 
Wenn die PDF Dateien eh von eurem ERP erstellt werden, gibt es dann nicht eine Möglichkeit zweimal zu drucken? Zum Beispiel in ein leichter druckbares Format und in PDF?
Wir verwenden List & Label. Da gibt es ein Export/Vorschauformat als Datei was man sehr einfach später drucken kann.
Schön ist dort auch das alle Drucke in einer Datei stecken können und man trotzdem noch jeden einzelnen Druck auswählen kann.

Jasocul 16. Nov 2022 13:35

AW: PDF-Dateien drucken (viele)
 
Bei meinem letzten Arbeitgeber hatten wir ein ähnlich gelagertes Problem. Mein dortiger Vorgänger hatte es auch über Adobe gelöst. Allerdings wurde dann die API mal geändert, was zu Problemen führte. Ohne API gab es dann Sortierungsprobleme (wie auch bei euch). Foxit haben wir ebenfalls versucht und sind am Ende bei einer Komponente für Delphi gelandet (WPViewPDF-Plus). Damit hatten wir dann volle Kontrolle über den gesamten Druckvorgang und konnten die Dokumente sogar vorher noch für unsere Bedürfnisse anpassen. Es gibt sicher auch andere Komponenten, mit denen man das hinbekommt.
Fazit:
Man kann sich nicht auf Drittanbieter verlassen, die ihre API oder Aufrufparameter ändern könnten. Mit der Komponente war dann sogar mehr möglich, als ursprünglich geplant.
Auch wenn es nicht ganz billig ist, rechnet es sich, wenn man die eingesparte Zeit, für die ganzen Versuche dagegen rechnet.

itblumi 16. Nov 2022 14:22

AW: PDF-Dateien drucken (viele)
 
Hallo rokli,

falls du dich entscheiden solltest die PDF-Dateien zu kombinieren kannst du das relativ einfach mit meinem Ghostscript-Wrapper machen oder Ghostscript direct über die Konsole aufrufen.

Example:
Code:
var
  AConverter: TGS_PdfConverter;
  AFiles: array of string;
begin
  // vorher noch das array mit deinen Dateien füllen
  AConverter := TGS_PdfConverter.Create('pfad zur dll');
  AConverter.ToPdf(AFiles, 'meinekombinierte.pdf', false);
  FreeAndNil(AConverter);
end;
Der code ist ungetestet sollte aber für dich ausreichen.

Die Bibliothek findest du auf Github https://github.com/SKI-Systems/Ghostscript-API-Wrapper

himitsu 16. Nov 2022 14:43

AW: PDF-Dateien drucken (viele)
 
Ihr könntet auch die PDF selber zeichnen/drucken.
Also, wenn ihr die PDFs irgendwie auf ein Canvas oder in eine Datei (Bitmap/PNG/TIFF/......) bekommt, mit PDF-Komponenten oder Programmen (Console mit Parameter, ActiveX, sonstige API)
dann könnt ihr das in der gewünschten Reihenfolge in einen oder mehrere Durckaufträge (TPrinter) gezielter rein- und ausgeben.

DevExpress, SynPDF oder andere PDF-Komponenten
oder direkt aus Reportingtools (ala Fast-Report)





Oder auch mal ganz anders gefragt:

Warum müsst ihr überhaupt so viel und so "fehleranfällig" organisiert drucken?
  • muß es unbedingt erst in die PDFs oder bekommt man die Drucke nicht auch von wo anders
  • kann man die Drucke nicht anders organisieren?
    • also nicht ALLE so schnell hintereinander auf einen Haufen
    • in Ruhe, über längere Zeit (da hast auch Zeit für Pausen, zwischen den Drucken, damit die nicht falsch rauskommen können)
      und nicht nur auf EINEN Haufen
  • ...
  • Und VORALLEM muß es wirklich gedruckt werden?
    https://www.delphipraxis.net/211367-...abels-esl.html
    https://www.tronitag.com/de/digitale...er-produktion/
    Bei Google suchenZKONG
    https://www.tronitag.com/de/esl-label/zv-zb-serie/
    Es gibt nicht nur kleine, sondern auch größere bis große "Displays", bis hin zu übertrieben groß.

    A5 oder A6 wäre wohl bezahlbar, gegenüber der gesparten Arbeit,
    mehr Sicherheit, weil Automatisch alles dort wo es hin soll,
    und den geretteten Bäumen. :angle2:

BerndS 16. Nov 2022 14:43

AW: PDF-Dateien drucken (viele)
 
Ein weiters Tool, das man selber mitgeben kann/muss wäre SumatraPDF
Das ist kostenlos und wurde hier mal von Holger Klemt (IBExperts) empfohlen.

rokli 17. Nov 2022 06:07

AW: PDF-Dateien drucken (viele)
 
Moin,

als erstes mal herzlichen Dank an alle, die sich Gedanken gemacht haben!

Dann zu den Fragen, ob das wirklich gedruckt werden muss: Es handelt sich um Kundenbelege, mit denen als erstes Waren im Lager kommissioniert werden und die dann den Waren als Begleitpapiere beigelegt werden.

Das Mergen von PDF Dokumenten erscheint mir hier im Moment auch die beste Lösung zu werden.

Ich teste mal noch ein bisschen und stelle meine Lösung dann hier ein.

Danke.

Bernhard Geyer 17. Nov 2022 06:45

AW: PDF-Dateien drucken (viele)
 
Auch wenn der initiale Overhead relativ hoch ist:
https://pdfbox.apache.org/2.0/commandline.html
Kann Mergen und Drucken (über Kommandozeile)

MyRealName 17. Nov 2022 09:28

AW: PDF-Dateien drucken (viele)
 
Ich nutze DevExpress und den TdxComponentPrinter, wenn es vom SPeicher her überschaubar ist, tausende PDFs gehen da in einem 32-bit Programm nicht.
Wenn es unbekannt viele sind, dann lasse ich mir die Seiten als Bilder geben und male sie selbst auf den Printer.Canvas. Ich brauche die allerdings auch als einen grossen Druckjob.

rokli 17. Nov 2022 09:43

AW: PDF-Dateien drucken (viele)
 
Hi ItBlumi,

habe mir Deine Lösung angesehen und heruntergeladen. Dein beigefügte Testprogramm läuft auch.
Dann habe ich, als ersten Test, das folgende Programm geschrieben:

Delphi-Quellcode:
procedure TfrmMain.Button2Click(Sender: TObject);
var
   AConverter   : TGS_Pdfconverter;
   aFiles       : Array[0..9] of String;
   sQuellPfad   : String;
   sZielPfad   : String;
begin
   sQuellPfad   := 'C:\Temp\pdffen\quell\';
   sZielPfad   := 'C:\Temp\pdffen\';

   aFiles[1]   := sQuellPfad + '0174163013.pdf';
   aFiles[2]   := sQuellPfad + '0174163020.pdf';
   aFiles[3]   := sQuellPfad + '0174164010.pdf';
   aFiles[4]   := sQuellPfad + '0174164027.pdf';
   aFiles[5]   := sQuellPfad + '0174164034.pdf';
   aFiles[6]   := sQuellPfad + '0174164041.pdf';
   aFiles[7]   := sQuellPfad + '0174164065.pdf';
   aFiles[8]   := sQuellPfad + '0174164072.pdf';
   aFiles[9]   := sQuellPfad + '0174164089.pdf';

   AConverter := TGS_PdfConverter.Create(sZielPfad);
   Aconverter.ToPdf(aFiles, sZielPfad + 'new.pdf', false);
   FreeAndNil(AConverter);

   ShowMessage('fertig');
end;
Es läuft komplett, ohne Fehlermeldungen durch, tut aber leider nicht was es soll.
Ich habe versucht in der GS_Converter nachzusehen, was da gemacht wird, verstehe aber nicht alles und komme daher nicht wirklich weiter.

Würdest Du da einmal draufschauen?

Danke.

himitsu 17. Nov 2022 09:44

AW: PDF-Dateien drucken (viele)
 
Statt PDF als PostScript speichern?
"Gute" Drucker verstehen das direkt.

Delphi-Quellcode:
COPY abc.ps \\servername\printername
aber sollte wohl auch im Delphi über CopyFile oder TStream funktionieren, ohne ein Zusatzprogramm dazwischen.
Vielleicht sogar
Delphi-Quellcode:
COPY abc.ps LPT1
oder eben \\localhost\printername

itblumi 17. Nov 2022 12:35

AW: PDF-Dateien drucken (viele)
 
Hi rokli,

schau mal in den folgenden Eigenschaften was er dir dort ausgibt, wenn keine Datei erstellt wird dann dürfte ein Fehler aufgetreten sein.
Delphi-Quellcode:
AConverter.Debug := True;
// string liste mit dem was er macht
AConverter.StdOut

// errors als strings sollte eigentlich leer sein
AConverter.LastErrors
// error code -> dieser sollte 0 sein falls alles funktioniert hat
AConverter.LastErrorCode

itblumi 17. Nov 2022 12:46

AW: PDF-Dateien drucken (viele)
 
AConverter.ToPdf gibt dir auch eine Boolean Ausdruck zurück dieser sollte den Fehlercode (LastErrorCode) vor dem beenden der Prozedur prüfen.

Habe Dir das Ganze etwas anschaulicher zusammen gestellt.

Delphi-Quellcode:
procedure TfrmMain.Button2Click(Sender: TObject);
var
   AConverter  : TGS_Pdfconverter;
   aFiles      : Array[0..9] of String;
   sQuellPfad  : String;
   sZielPfad  : String;
begin
   sQuellPfad  := 'C:\Temp\pdffen\quell\';
   sZielPfad  := 'C:\Temp\pdffen\';

   aFiles[1]  := sQuellPfad + '0174163013.pdf';
   aFiles[2]  := sQuellPfad + '0174163020.pdf';
   aFiles[3]  := sQuellPfad + '0174164010.pdf';
   aFiles[4]  := sQuellPfad + '0174164027.pdf';
   aFiles[5]  := sQuellPfad + '0174164034.pdf';
   aFiles[6]  := sQuellPfad + '0174164041.pdf';
   aFiles[7]  := sQuellPfad + '0174164065.pdf';
   aFiles[8]  := sQuellPfad + '0174164072.pdf';
   aFiles[9]  := sQuellPfad + '0174164089.pdf';

   AConverter := TGS_PdfConverter.Create(sZielPfad);
   AConverter.Params.NoSaver := True;
   AConverter.Debug := True; // debug Ausgabe der Bibliothek aktivieren


   if (AConverter.ToPdf(aFiles, sZielPfad + 'new.pdf', false)) then
     ShowMessage('fertig')
   else begin
     ShowMessage('Fehler: ' + AConverter.LastErrors);
     AConverter.StdOut.SaveToFile(sZielPfad + 'output.log'); // Die Prozess Ausgabe speichern
   end;

   FreeAndNil(AConverter);
Edit: Es kann auch sein das Ghostscript versucht zu ermitteln ob er Schreibrechte in dem Verzeichnis besitzt, dass kann mit unter schief gehen. Dies kannst du mit NOSAVER unterdrücken. Ich habe das noch zusätzlich hinzugefügt im obigen Code.

itblumi 17. Nov 2022 13:27

AW: PDF-Dateien drucken (viele)
 
Zitat:

Zitat von himitsu (Beitrag 1514905)
Statt PDF als PostScript speichern?
"Gute" Drucker verstehen das direkt.

Delphi-Quellcode:
COPY abc.ps \\servername\printername
aber sollte wohl auch im Delphi über CopyFile oder TStream funktionieren, ohne ein Zusatzprogramm dazwischen.
Vielleicht sogar
Delphi-Quellcode:
COPY abc.ps LPT1
oder eben \\localhost\printername

Ghostscript kann auch direkt drucken nach dem er die Dateien zusammen gestellt hat, leider ist das noch nicht mit dem derzeitigen Converter möglich. Ich bin gerade dabei eine dementsprechende Version dafür auch bereit zu stellen. Da mich das Thema interessiert hat und dies ja auch ein häufiger Anwendungsfall sein kann. Das OutputFile ist dann der Drucker mit dem Prefix (%printer%).

Frickler 17. Nov 2022 15:00

AW: PDF-Dateien drucken (viele)
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1514889)
Auch wenn der initiale Overhead relativ hoch ist:
https://pdfbox.apache.org/2.0/commandline.html
Kann Mergen und Drucken (über Kommandozeile)

Mergen über Kommandozeile geht auch mit pdftk:
Code:
pdftk datei1.pdf datei2.pdf ... dateix.pdf cat output gesamt.pdf
(und vieles vieles mehr...)

itblumi 18. Nov 2022 08:21

AW: PDF-Dateien drucken (viele)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe Dir nochmal ein kleines Test Projekt zusammen gestellt und dies mit der Version die im Github ist getestet.
Am Anfang hatte ich das gleiche Problem mit einer älteren Version.
Habe Dir hier nochmal eine Liste mit möglichen Fehlerquellen und Lösungsmöglichkeiten zusammen gestellt.
Diese ist auch in dem kleinen Testprojekt vorhanden.
  1. Überprüfen ob die richtige Api Version benutzt wird es sollte die 1010 sein und ist in der unit SkiSys.GS_Api zu finden.
    Falls die Version unterschiedlich sein sollte, dann bitte nochmal die richtige Version aus dem Github aus checken.
  2. Den Suchpfad überprüfen ob er da nicht eine ältere Version verwendet wird.
  3. Ich habe dann die dcu's vorsichtshalber von Hand gelöscht. In früheren Versionen von Delphi kam es manchmal vor das er die dcu's nicht neu erstellt hat.

Viele Grüße
Jan

josef-b 18. Nov 2022 09:12

AW: PDF-Dateien drucken (viele)
 
Wir haben so eine ähnliche Situation.

Bekommen viele PDF-Belege per email-Anhang die wir dann im Stapel ausdrucken.

Wir können da auch sumatra empfehlen, was wir auch auf Empfehlung von Holger Klemt schon länger einsetzen.

das ganze findet man auf sumatrapdfreader.org.

Da gibt es auch eine Doku zu der Commandline.

Bei uns sieht es dann ungefähr so aus:

Delphi-Quellcode:
procedure TF1.belege_drucken;
var
adrucker: string
sumatra_pfad : string;
commandline : string;
adateiname: string;
begin
adrucker := (dein Drucker);
adateinmae := (deine PDF-Datei);

sumatra_pfad := 'C:\Sumatra\SumatraPdf.exe';
commandline := '-print-to ' + '"' + adrucker + '" "' +
                      adateiname + '"';
ShellExecute(0,'open',pchar(sumatra_pfad),pchar(commandline),nil,SW_ShowNormal);

Bernhard Geyer 18. Nov 2022 09:12

AW: PDF-Dateien drucken (viele)
 
Zitat:

Zitat von Frickler (Beitrag 1514930)
Mergen über Kommandozeile geht auch mit pdftk:
Code:
pdftk datei1.pdf datei2.pdf ... dateix.pdf cat output gesamt.pdf
(und vieles vieles mehr...)

Yepp. Wird hier mehrere Lösungen geben.
Wir setzen pdfbox ein und sind hier sehr zufrieden (verglichen mit der Delphi-Native Komponente die wir vor Jahren hatten).
Deshalb kann ich nur davon sprechen, das diese eine Lösungsmöglichkeit wäre.

josef-b 18. Nov 2022 09:43

AW: PDF-Dateien drucken (viele)
 
Die Frage war bei uns dann eine andere..

Müssen wir die Dateien eigentlich alle drucken?

Wir speichern PDF-Belege mittlerweile alle in der firebird-Datenbank als Blob..

Man hat dann u.a. auch nicht mehr so viele Dateien, sondern insgesamt nur noch eine.

Kommt halt auf die Bedürfnisse des Anwenders an ;-)

himitsu 18. Nov 2022 09:59

AW: PDF-Dateien drucken (viele)
 
Zitat:

Zitat von josef-b (Beitrag 1514964)
Wir speichern PDF-Belege mittlerweile alle in der firebird-Datenbank als Blob..

Das wird hier aber nicht helfen.
OK, man könnte die Datenbank auf viele USB-Sticks, SD-Cards oder große RFDI-Chips kopieren.
Oder in übergroße QR-Codes und die dann ausdrucken. :lol:

Zitat:

Zitat von rokli (Beitrag 1514888)
Dann zu den Fragen, ob das wirklich gedruckt werden muss: Es handelt sich um Kundenbelege, mit denen als erstes Waren im Lager kommissioniert werden und die dann den Waren als Begleitpapiere beigelegt werden.

:zwinker:

Die Begleitpapiere müssen also so oder so.
Eventuell könne man sowas auch direkt auf die Verpackung drucken. (innen und außen)
https://www.bluhmsysteme.com/oberfla...schriften.html
Bei Google suchenmobile Handdrucker
Bei Google suchenPrinCube Bei Google suchenMBrush

Und wenn Unterlagen für Kommissionierung und Begleitung nicht die Selben sind, jene als digitale Medien, ala ESL/RFID/...
Einige der ESL-Tags, welche wir demnächst einführen, haben RFID direkt integiert, welches ber Funk umgeschrieben werden kann.
Aktuell nutzen wir Barcodes auf dem ePaper, aber RFID hätte zum elektronischen Lesen einige Vorteile. (kein optischer Platzbedarf und einfacher/schneller/sicherer lesbar)




Zitat:

Zitat von josef-b (Beitrag 1514964)
Kommt halt auf die Bedürfnisse des Anwenders an ;-)

Bei uns genau andersrum. Es war mal Alles in der DB und ist nun in einzelnen Dateien.
BLOB als Datei, aber natürlich der restliche Verwaltungs-Datensatz in der DB.

Und teilweise so, dass bestimmte Dateien auf WORM-Laufwerke können.

Wegen besserem Backup und Datensicherheit und z.B. WORM (Write Once Read Many) wegen Datenschutz- und steuerrechtlichen Verordnungen.
Gut, noch besser wäre es, wenn man auch einige Zusatzinfos noch bei den Dateien mit ablegt ... falls mal die Software/DB kaputt ist und es dort kein Funktionierendes Backup gibt, dann Zuordnungsinfos zu/bei/an/in der jeweiligen Datei.




ALLES in einer DB, dann vieleicht besser noch eine Partitionierung der DB vornehmen.
z.B. jährliche BLOBs je in einer DB-Datei, welche nach dem JAHR nicht/kaum noch verändert wird.
Ein Backup der Festplatte wird sich freuen, wenn sich nicht ständig überall immer wieder alles im Dateisystem ändert.

josef-b 18. Nov 2022 10:25

AW: PDF-Dateien drucken (viele)
 
Ja dann würde ich es wohl mit sumatra machen.

rokli 18. Nov 2022 12:04

AW: PDF-Dateien drucken (viele)
 
Herzlichen Dank für das große Interesse!

@Jan
1.
Habe Deine Vorgaben eingebaut und bekomme die Fehlermeldung

[Content]
Fehler: The File: does not exist

Daraufhin hab ich mal eine bestehende PDF Datei ins Zielverzeichnis kopiert und NEW.PDF genannt.

2.
Das Log lässt sich leider nicht kompilieren.
Da meldet der Kompiler: [dcc32 Fehler] FMain.pas(413): E2362 Auf protected-Symbol TGS_Api.StdOut kann nicht zugegriffen werden

3.
Dein Test-Programm habe ich erfolgreich nutzen können. Als nächstes werde ich die Logiken mal in mein Testprogramm übernehmen.

Bis dann.

itblumi 18. Nov 2022 12:21

AW: PDF-Dateien drucken (viele)
 
zu 2. Entschuldige bitte das hatte ich nur im Forum geschrieben und nicht kompiliert, es muss natürlich StdOutLog heißen.

Ich habe auch noch eine neue Version fertig gemacht in der du mit

Delphi-Quellcode:
if (AConverter.Print('Dateien mit ; getrennt einfügen', 'Windows Drucker Name', False)) then ...
oder
Delphi-Quellcode:
if (AConverter.Print(aFiles, 'Windows Drucker Name', False)) then ...
die zusammen gefügte Datei direkt Drucken kannst. Falls der Drucker nicht gefunden werden kann, dann zeigt Ghostscript den Windows Druck Dialog an in dem man einen Drucker auswählen kann. Falls er ihn findet schickt er sofort den Druckauftrag zum Drucker.

rokli 18. Nov 2022 12:38

AW: PDF-Dateien drucken (viele)
 
Hi Jan,

aus deinem Test-Coding:
1. Bitte passe vorher den Suchpfad in den Projekt optionen an damit er die Lib findet ... ich habe die *.libs immer dem Projekt hinzugefügt.

in welchen Parameter kann ich das denn eintragen?

itblumi 18. Nov 2022 12:48

AW: PDF-Dateien drucken (viele)
 
So ist es bei mir im XE6, ich hoffe das es sich nicht geändert hat.

Projekt -> Optionen -> Delphi-Compiler

Dann das Ziel: Alle Konfigurationen - Alle Plattformen

Da dürfte dann eine Zeile mit dem "Suchpfad" stehen und dort den Pfad zur Lib eingeben.
Du kannst natürlich auch die Dateien direkt einbinden, dass sollte keinen Unterschied machen.

rokli 18. Nov 2022 14:18

AW: PDF-Dateien drucken (viele)
 
Hallo alle zusammen!

Die Software von Jan läuft sehr gut.

Mein Fehler in der ersten Version wahr wohl tastächlich, dass ich die Dateinamen in einerm Array zur Verfügung gestellt habe. Es hätte aber wohl eine Semikolon separierte CSV Datei sein sollen, die dann als Input Liste dem
Delphi-Quellcode:
AConverter.ToPdf
zur Verfügung gestellt werden muss.

Zum Nachvollziehen die beiden wesentlichen Proceduren:

Delphi-Quellcode:
procedure TfrmGsTst.Button1Click(Sender: TObject);
var
  AConverter: TGS_PdfConverter;
  AFiles: string;
begin

   M_Output.Clear;

   sQuelle      := 'C:\Temp\pdffen\quell\';
   sZiel         := 'C:\Temp\pdffen\';
   sDll         := 'C:\Temp\pdffen\';

  AConverter := TGS_PdfConverter.Create(sDll);
  FLogFile := TStringList.Create;
  try
    try
      AConverter.OnStdOut := Log; // komplette Debug Ausgabe
      AConverter.OnStdError := Log;
      {$IFDEF DEBUG}
      AConverter.Debug := True; // Das kannst du später entfernen
      {$ENDIF}
      AFiles :=   sQuelle + '0174163013.pdf;' +
                  sQuelle + '0174163020.pdf;' +
                  sQuelle + '0174164010.pdf;' +
                  sQuelle + '0174164027.pdf;' +
                  sQuelle + '0174164034.pdf;' +
                  sQuelle + '0174164041.pdf;' +
                  sQuelle + '0174164065.pdf;' +
                  sQuelle + '0174164072.pdf;' +
                  sQuelle + '0174164089.pdf;' +
                  sQuelle + '0174164096.pdf;' +
                  sQuelle + '0174164119.pdf;' +
                  sQuelle + '0174165024.pdf;' +
                  sQuelle + '0174165031.pdf;' +
                  sQuelle + '0174165048.pdf;' +
                  sQuelle + '0174165055.pdf;' +
                  sQuelle + '0174165062.pdf;' +
                  sQuelle + '0174166014.pdf;' +
                  sQuelle + '0174167011.pdf;' +
                  sQuelle + '0174167028.pdf;' +
                  sQuelle + '0174167035.pdf;' +
                  sQuelle + '0174167042.pdf;' +
                  sQuelle + '0174167059.pdf;' +
                  sQuelle + '0174167066.pdf;' +
                  sQuelle + '0174167073.pdf;' +
                  sQuelle + '0174167080.pdf;' +
                  sQuelle + '0174167097.pdf;' +
                  sQuelle + '0174167103.pdf;' +
                  sQuelle + '0174167110.pdf;' +
                  sQuelle + '0174167127.pdf;' +
                  sQuelle + '0174167134.pdf;' +
                  sQuelle + '0174167141.pdf;' +
                  sQuelle + '0174167158.pdf;' +
                  sQuelle + '0174168018.pdf;' +
                  sQuelle + '0174168025.pdf;' +
                  sQuelle + '0174168032.pdf;' +
                  sQuelle + '0174169015.pdf;' +
                  sQuelle + '0174170011.pdf';

      if (not AConverter.ToPdf(AFiles.Split([';']), sZiel + 'New01.pdf', False)) then
      begin
        ShowMessage('Fehler: ' + AConverter.LastErrors);
        FLogFile.SaveToFile(sZiel + 'output.log');
      end else
        ShowMessage('Convertierung abgeschlossen!');

    except
      on E: Exception do
        ShowMessage('Fehler: ' + E.Message);
    end;
  finally
    FreeAndNil(AConverter);
    FreeAndNil(FLogFile);
  end;
end;

procedure TfrmGsTst.Log(const AStr: string);
begin
  (* hier bekommst du die gefilterten informationen + debug information *)

  // als output in einem Memo
  M_Output.Lines.Text := M_Output.Lines.Text + AStr;
  // als output in eine Datei
  FLogFile.Text := FLogFile.Text + AStr;
  // scroll down
  M_Output.SelStart := Length(M_Output.Lines.Text);
  M_Output.SelLength := 0;
end;
Meinen besondereren Dank and Jan, der sich viel Mühe mit mir gegeben hat.

Allen ein schönes Wochenende

Beste Grüße

himitsu 18. Nov 2022 14:32

AW: PDF-Dateien drucken (viele)
 
Statt der vielen sQuelle hätte ich ein Zeichen (z.B. *) und dann Replace gemacht,
aber wozu erst zusammen und dann split, wenn man es auch gleich fertig haben kann. :wink:

Delphi-Quellcode:
  AFiles: TArray<string>;
begin

      AFiles := [sQuelle + '0174163013.pdf',
                 sQuelle + '0174163020.pdf',
                 sQuelle + '0174164010.pdf',
                 sQuelle + '0174164027.pdf',
                 sQuelle + '0174164034.pdf',
                 ...
                ];
oder falls später stückchenweise, via Schleife und so.
Delphi-Quellcode:
      AFiles := AFiles + [sQuelle + '0174163013.pdf'];
      ...
      AFiles := AFiles + [sQuelle + '0174163020.pdf', sQuelle + '0174164010.pdf'];
      ...

Delphi-Quellcode:
M_Output.Lines.Add(AStr); // geht auch mit Zeilenumbrüchen drin (und auch unnötig erst ALLEN Text rauszuholen und wieder neu reinzuzun)
// und SelStart ist auch nicht nötig, weil macht Add schon

itblumi 18. Nov 2022 14:41

AW: PDF-Dateien drucken (viele)
 
Zitat:

Zitat von himitsu (Beitrag 1515011)
Delphi-Quellcode:
M_Output.Lines.Add(AStr); // geht auch mit Zeilenumbrüchen drin (und auch unnötig erst ALLEN Text rauszuholen und wieder neu reinzuzun)
// und SelStart ist auch nicht nötig, weil macht Add schon

Das ist richtig, aber leider liefert Ghostscript auch manchmal nur ein Stück von einer Zeile und dann ist die Ausgabe mehrfach unterteilt.
Deswegen ist das Ganze über die Text property gelöst.

Edit: Das einzige was ich noch dagegen machen könnte um dies benutzerfreundlich zu gestalten, wäre einen internen Text Puffer zu verwenden und nur ganze Zeilen auszugeben. Das werde ich mir gleich mal auf meine ToDo Liste schreiben.

rokli 28. Nov 2022 06:17

AW: PDF-Dateien drucken (viele)
 
Hallo Zusammen!

Die Lösung von itblumi läuft sehr gut!

Was nicht funktionierte, war die Angabe eines UNC-Pfades für den Quell-Ort der zusammen zu fassenden PDF-Dokumente. Aber über ein gemapptes Laufwerk kein Problem.

Insgesamt ist das eine gute, auch sehr perfomante Lösung für unser Druckproblem.

Beste Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 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