Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi in Delphi PDF-Dateien komprimieren (https://www.delphipraxis.net/121096-delphi-pdf-dateien-komprimieren.html)

hoffkmann 22. Sep 2008 11:41


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:
WinExec(PChar('C:\Programme\PDFCreator\PDFCreator.exe /NoStart /PF"'Filename'"'),SW_MINIMIZE);
Im zweiten Versuch installierten wir die Typbibliothek des PDFCreators und verwendeten die Klasse TclsPDFCreator:

Delphi-Quellcode:
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;
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.

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]

Kalfany 22. Sep 2008 12:40

Re: in Delphi PDF-Dateien komprimieren
 
Zitat:

[edit=Phoenix]Delphi-Tags eingefügt. Das nächste mal bitte selber machen. Mfg, Phoenix[/edit]
hilft aber nix wenn der BBCode aus ist :mrgreen:

btw. von PDFCreator gibts sein 2-3 Tagen eine 0.9.6

Phoenix 22. Sep 2008 13:59

Re: in Delphi PDF-Dateien komprimieren
 
Jupp. .schon geändert ;-)

hoffkmann 25. Sep 2008 08:09

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

Kalfany 25. Sep 2008 08:23

Re: in Delphi PDF-Dateien komprimieren
 
Zitat:

Zitat von hoffkmann
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?

meinst du damit das wenn der pdf creator fertig ist er die datei öffnet? das sollte man eig. abstellen können.

hoffkmann 25. Sep 2008 08:38

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.

Kalfany 25. Sep 2008 08:48

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 :)

hoffkmann 25. Sep 2008 10:30

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:

C:\Programme\PDFCreator\PDFCreator.exe /NoStart /PF"Filename.pdf"
Vorher habe ich automatisches Speichern eingestellt, inklusive eines Dateinamens sowie einer Pfadangabe, und in der Registry alle Einstellungen die das Öffnen des Standardprogramms beeinflussen könnten gesetzt. Vielleicht mal den Aufruf über Kommandozeile testen. Wenn der Adobe Reader zuvor geschlossen war, wird er beim Drucken geöffnet.


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