![]() |
in Delphi PDF-Dateien komprimieren
Hallo,
seit Kurzem besteht in unserem Haus die Anforderung xls-Dateien in PDF-Dateien umzuwandeln und bereits erstellte PDF-Dateien nochmals zu komprimieren. Dafür hätten wir gerne das Tool PDF Creator Version 0.9.5 verwenden, welches uns bereits zur Verfügung steht. Die Ausgangsdateien werden aus einer eigens mit Delphi 6 programmierten Anwendung automatisch erzeugt. Die Excel-Dateien erstellen wir mit Hilfe von ActiveX-Komponenten, die PDF-Dateien werden mit Hilfe von WPDF erzeugt. Direkt im Anschluss sollen diese Dateien, ebenfalls automatisch und ohne manuelles Eingreifen, umgewandelt oder komprimiert werden. Unser erster Versuch bestand darin, die PDFCreator.exe über Kom-mandozeile und den in der PDF Creator Hilfe beschriebenen COM-Parametern aufzurufen und über die Einstellungen des automatischen Speicherns (dazu Registry überschreiben) die gewünschten Files zu erstellen.
Delphi-Quellcode:
Im zweiten Versuch installierten wir die Typbibliothek des PDFCreators und verwendeten die Klasse TclsPDFCreator:
WinExec(PChar('C:\Programme\PDFCreator\PDFCreator.exe /NoStart /PF"'Filename'"'),SW_MINIMIZE);
Delphi-Quellcode:
Die zweite Version des Aufrufs funktioniert leider nicht für PDF-Dateien, obwohl ich diese direkt im PDF Creator und auch mit dem Aufruf über Kommandozeile drucken und komprimieren kann. Es liefert bereits die Funktion PDFCreator.cIsPrintable(temppath+Dir+'\'+Fn+'.'+En dung)=FALSE zurück. Hat hier irgendjemand eine Idee, wo der Fehler liegen könnte? Xls-Dateien können hingegen einwandfrei in PDF-Dateien umgewandelt werden.
PDFCreator:=TclsPDFCreator.Create(nil);
if not PDFCreator.cStart('''',False) then begin Fehlertext:='PDFCreator konnte nicht geöffnet werden.'; end else begin // *** Anzahl der Druckjobs prüfen printJobCount:=PDFCreator.cCountOfPrintJobs; // *** Einstellungen des PDFCreators schreiben PDFCreator_Einstellungen_neu(PDFCreator, DefaultPrinter, Fehlertext, RGC_KA_PATH, Fn_neu,anzeigen); // *** Nachfragen, ob Dokument "druckfertig" ist if not PDFCreator.cIsPrintable(temppath+Dir+'\'+Fn+'.'+Endung) then begin Fehlertext:='Die Datei kann mit PDFCreator nicht gedruckt werden.'; end else begin // *** Datei drucken PDFCreator.cPrintFile(temppath+Dir+'\'+Fn+'.'+Endung); PDFCreator.cPrinterStop:=False; // warten bis komprimierte Datei erzeugt wurde // nach 2 min trotzdem Abbrechen z:=0; while not FileExists(temppath+Dir+'\'+Fn_neu+'.pdf') do begin Sleep(100); z:=z+100; if (z>=120000) then // aus while-Schleife springen wenn RGSoft beendet wird begin break; end; end; // *** PDFCreator erst schließen, wenn Druckjob wirklich fertig ist z:=PDFCreator.cCountOfPrintJobs; while (z>printJobCount) do begin Sleep(100); Application.ProcessMessages; z:=PDFCreator.cCountOfPrintJobs; end; Sleep(1000); end; end; procedure PDFCreator_Einstellungen_neu(APDFCreator:TclsPDFCreator; var DefaultPrinter:WideString; var AFehlertext:String; ADir,AFileName:String; Aanzeigen:Boolean); var Opt_neu:clsPDFCreatorOptions; begin try // Einstellungen des PDFCreators überschreiben Opt_neu:=APDFCreator.cOptions; // damit man das PDF gleich mit ursprünglichem Standarddrucker drucken kann DefaultPrinter:=APDFCreator.cDefaultPrinter; Opt_neu.PrintAfterSavingPrinter:=DefaultPrinter; Opt_neu.NoConfirmMessageSwitchingDefaultprinter:=1; Opt_neu.UseAutosave:=1; Opt_neu.UseAutosaveDirectory:=1; Opt_neu.AutosaveDirectory:=temppath+ADir+'\'; Opt_neu.AutosaveFormat:=0; Opt_neu.AutosaveFilename:=AFileName; Opt_neu.AutosaveStartStandardProgram:=1; APDFCreator.cOptions:=Opt_neu; APDFCreator.cClearCache; APDFCreator.cDefaultPrinter:='PDFCreator'; except on e:exception do begin AFehlertext:='Beim Komprimieren ist ein Fehler aufgetreten.'+CRLF+e.Message; end; end; end; Zusätzlich scheiterten momentan beide Möglichkeiten an ein und demselben Phänomen: Sobald man die Ausgangsdatei an den PDF Creator übergibt öffnet dieser kurz deren Standardprogramm, sei es EXCEL XP oder den ADOBE READER. Da wir zum Teil auch mehrere Dateien gleichzeitig (Massendruck bis zu 200 Dateien) im Hintergrund erstellen und dem Anwender dabei ein Weiterarbeiten gestattet werden muss, ist es nicht zumutbar, wenn 200 Mal der ADOBE READER öffnet und wieder schließt. Gibt es eine Möglichkeit diesen Vorgang zu unterbinden? Generell wären wir auch einer ganz anderen Lösung nicht abgeneigt. Vielleicht hat jemand Erfahrungen mit einem weiteren Tool, das in Delphi eingebunden werden kann und bei der Komprimierung von PDF-Dateien in Qualität und Dateigröße ähnlich gute Ergebnisse erzielt wie der PDF Creator. Für Tipps und Hinweise wäre ich sehr dankbar. Gruß hoffkmann [edit=Phoenix]Delphi-Tags eingefügt. Das nächste mal bitte selber machen. Mfg, Phoenix[/edit] |
Re: in Delphi PDF-Dateien komprimieren
Zitat:
btw. von PDFCreator gibts sein 2-3 Tagen eine 0.9.6 |
Re: in Delphi PDF-Dateien komprimieren
Jupp. .schon geändert ;-)
|
Re: in Delphi PDF-Dateien komprimieren
Hallo!
Habe neue Version installiert und getestet. Hat mich leider nicht weitergebracht. Trotzdem Danke für den Tipp. Gruß hoffkmann |
Re: in Delphi PDF-Dateien komprimieren
Zitat:
|
Re: in Delphi PDF-Dateien komprimieren
Nicht ganz. Wenn ich die Einstellung AutosaveStartStandardProgram (entspricht der Checkbox bei den Einstellungen des automatischen Speicherns: Nach dem automatischen Speichern das Dokument mit dem Standardprogramm öffnen.) auf 0 setzte wird zwar die Datei selbst nicht angezeigt, aber trotzdem die leere Anwendung des Adobe Readers geöffnet. Die Anwendung öffnet sich bereits wenn ich die Datei an den PDFCreator übergebe, bevor sie überhaupt gedruckt wird. Um das abzustellen habe ich leider keine brauchbare Einstellung gefunden.
|
Re: in Delphi PDF-Dateien komprimieren
also bei mir kommt da nix :) (grad frisch installiert [normal, nicht als Server]) ...
hab eig. nur AutosaveStartStandardProgram aus und UseAutosave angemacht mir ist aber aufgefallen das es noch die einstellung RunProgramBeforeSaving gibt. ansonsten würd ichs mal auf einem anderen system mit einer frischen installation testen :) |
Re: in Delphi PDF-Dateien komprimieren
Ich hab das ganze jetzt bei einem Kollegen ausprobiert - dort ist es genauso. Mein Befehl für die Kommandozeile:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 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