[gelöst]PDF-Creator

27. November 2012 09:15

Hallo Allerseits,

ich möchte den PDFCreator benutzen, um PDFs aus Reports zu erzeugen. ich habe dazu hier im Forum einiges gefunden und das auch soweit gut hingekriegt. Hier mein (test)Code:

Code:
    Pfad := 'C:\Temp\';
    FileName := 'TestPdf.pdf';
    Ok := ERASE(Pfad+FileName);


    IF ISCLEAR(PDFCreator) THEN
      CREATE(PDFCreator);
    IF ISCLEAR(PDFCreatorError) THEN
      CREATE(PDFCreatorError);

    PDFCreatorError := PDFCreator.cError;

    IF NOT PDFCreator.cStart('/NoProcessingAtStartup',TRUE) THEN
      ERROR('Status: Error[' + FORMAT(PDFCreatorError.Number) + ']: ' + PDFCreatorError.Description);

    PDFCreatorOption := PDFCreator.cOptions;
    PDFCreatorOption.UseAutosave := 1;
    PDFCreatorOption.UseAutosaveDirectory := 1;
    PDFCreatorOption.AutosaveDirectory := Pfad;
    PDFCreatorOption.AutosaveFormat := 0; //PDF-Format
    PDFCreatorOption.AutosaveFilename := FileName;
    PDFCreator.cIsConverted := FALSE;
    PDFCreator.cOptions := PDFCreatorOption;

    PDFCreator.cClearCache();
    DefaultPrinter := PDFCreatorL.cDefaultPrinter; //Der System-Standarddrucker wird ziwschengespeichert
    PDFCreatorL.cDefaultPrinter := 'PDFCreator';
    PDFCreator.cPrinterStop := FALSE;

    REPORT.RUNMODAL(REPORT::"Debitor - Liste",TRUE,FALSE);
   
  // Hier Prüfung einbauen!!!!

    Window.OPEN('Bitte warten, PDF wird erstellt #1# #2#...');
    WindowIsOpen := TRUE;

    //Auf Erstellen warten, bis PDF konvertiert ist oder 60 Sekunden um sind
    CounterL := 0;
    REPEAT
      SLEEP(1000);
      CounterL := CounterL + 1;
      Window.UPDATE(1,CounterL);
    UNTIL (PDFCreator.cIsConverted) OR (CounterL=60);

    //Abbruch prüfen
    IF NOT PDFCreator.cIsConverted THEN
      ERROR('Die PDF-Datei konnte nicht erstellt werden!');


    // zurücksetzen
    PDFCreatorOption := PDFCreator.cOptions;
    PDFCreatorOption.UseAutosave := 0;
    PDFCreatorOption.UseAutosaveDirectory := 0;
    PDFCreator.cOptions := PDFCreatorOption;
    PDFCreatorOption.AutosaveDirectory := '';
    PDFCreatorOption.AutosaveFilename := '';
    PDFCreator.cOptions := PDFCreatorOption;

    //Beenden der PDF-Funktion
    PDFCreator.cPrinterStop := TRUE;
    PDFCreator.cClearCache();

    CounterL := 0;
    REPEAT
      SLEEP(200);
      CounterL := CounterL + 1;
      Window.UPDATE(2,CounterL);
    UNTIL (PDFCreator.cClose()) OR (CounterL = 30);

    IF CounterL = 30 THEN
      ERROR('Fehler beim Beenden vom PDFCreator');

    CLEAR(PDFCreator);
    IF WindowIsOpen THEN
      Window.CLOSE;
    WindowIsOpen := FALSE;
    HYPERLINK(Pfad+FileName);


Ich habe allerdings ein Problem: Wenn der Benutzer beim REPORT.RUNMOLDAL... einfach das Fenster zumacht, dann kriege ich das nicht mit. Ich habe keinen Weg gefunden herauszukriegen, ob da überhaupt eine Spool-Datei angelegt wurde bevor der Konvertierungsvorgang gestartet wird. Das Programm geht also in den Loop wo es auf das Ende des Konvertierens wartet, nach 60 Sekunden kommt die entsprechende Fehlermeldung.

An der Stelle im Code wo " // Hier Prüfung einbauen!!!!" steht müsste eine Prüfung stattfinden können.

Hat jemand da entsprechende Erfahrunge bzw. weiss eine Lösung?

Danke
Zuletzt geändert von elf am 29. November 2012 09:20, insgesamt 1-mal geändert.

Re: PDF-Creator

27. November 2012 09:34

Hallo,

Ich habe zwar keine Lösung, aber unsere Entwickler benützen für Kundenprojekte immer BullZip PDF Printer.
Vielleicht ist seine Handhabung in C/AL einfacher.
Schau dir das mal an, vielleicht hilft es.

Re: PDF-Creator

27. November 2012 14:11

danke, das hab' ich auch schon propbiert, mit BULLZIP ists das gleiche Problem wie mit PDFCreator.

Re: PDF-Creator

27. November 2012 15:28

Das "Erstellen abwarten" hatten wir hier heute.
Den Spooler kann man außerdem noch auf "Created" abfragen.
PDFSpool.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: PDF-Creator

28. November 2012 09:51

danke, genau das habe ich gesucht. Aber PDFCreatorSpoolInfo finde ich nicht! Die drei anderen Klassen (PDFCreator , PDFCreatorOption und PDFCreatorError) habe ich. Ich benutze den aktuellsten PDFCreator (Version 1.6). Gibts da noch eine andere Version? Oder ist das eine andere Automation? Auch Googeln bringt mich nicht weiter.
Ich habe das jetzt zwischenzeitlich so gelöst, das ich das Spoolverzeichnis öffne und nachsehe ob das was liegt oder nicht. Die beschriebene Lösung würde mir aber viel besser gefallen.

Re: PDF-Creator

28. November 2012 11:42

Ich habe mir lokal testweise 1.6 installiert, da sind diese Möglichkeiten leider verschwunden :shock: .
Produktiv im Einsatz ist Version 1.2.3, daher stammte das obige Beispiel.
PDFSpool123.jpg

In Version 1.3.2 gibt es noch andere Optionen:
PDFSpool132.jpg

In Version 1.6.0 dann keine.
PDFNoSpool160.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: PDF-Creator

29. November 2012 09:20

danke nochmals. Aber da ich nicht auf eine alte version zurückgehen möchte, habe ich das jetzt so gelöst:

Code:
    IF NOT PDFCreator.cIsConverted THEN BEGIN
      // Wenn noch nicht konvertiert ist, dann muss eine Spool-Datei vorhanden sein
      // wenn keine da ist, dann war entweder nix im Bericht, oder der User hat Abbruch geklickt
      // bzw. den Report nicht gestartet
      CLEAR(Verzeichnis);
      Verzeichnis.SETRANGE(Path,SpoolDirectory);
      Verzeichnis.SETRANGE("Is a file",TRUE);
      IF (Verzeichnis.COUNT=0) AND (NOT PDFCreator.cIsConverted) THEN // keine Spool-datei da und auch immer noch nicht konvertiert
        ERROR('Abbruch');
      CLEAR(Verzeichnis);

      //Auf Erstellen warten, bis PDF konvertiert ist
      Counter := 0;
      WHILE (NOT PDFCreator.cIsConverted) DO BEGIN
        FensterUpdate();// Hier wird nur was angezeigt
        SLEEP(100);
      END;


    END;

PDF-Creator Version 2.x

31. August 2017 11:39

Ab Version 2 ist die COM-Schnittstelle völlig überarbeitet worden. Zum Glück, bei der alten Version kam es gelegentlich zu Überlappungen von Dateinamen und Inhalten wenn viele PDFs auf einmal einstellt wurden und die Erstellung stockte. Das scheint jetzt behoben zu sein.
PDFcreator.png

http://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/
http://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/user-manual/basics/conversion/
http://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/user-manual/basics/convert-single-file/
http://docs.pdfforge.org/pdfcreator/latest/de/pdfcreator/com-interface/user-manual/basics/workflow-comparsion-v1-7-v2/

In NAV kann man das jetzt z.B. so umsetzen, das läuft in der Praxis auch im Batchbetrieb mit hunderten von mehrseitigen PDFs ohne Pause zwischendurch stabil.
Code:
CLEAR(PDFCreatorQueue);
CLEAR(PDFCreator);

SLEEP(1000);

IF ISCLEAR(PDFCreator) THEN
  CREATE(PDFCreator);

IF ISCLEAR(PDFCreatorQueue) THEN BEGIN
  CREATE(PDFCreatorQueue);
   IF NOT PDFCreator.IsInstanceRunning THEN
    PDFCreatorQueue.Initialize();
END;

// Den PDFCreator-Drucker für diesen Report in Tabelle "Printer Selection" eintragen
MyPDFReport.SETTABLEVIEW(MyTable);
MyPDFReport.USEREQUESTFORM(FALSE);
MyPDFReport.RUNMODAL;

REPEAT
  Seconds += 1;
UNTIL (PDFCreatorQueue.WaitForJob(10)) OR (Seconds > 20);

IF Seconds <= 20 THEN BEGIN
  PrintJob := PDFCreatorQueue.NextJob;
  PrintJob.SetProfileByGuid('DefaultGuid');
  PrintJob.SetProfileSetting('OpenViewer','false');
  PrintJob.ConvertTo(MyPDFPathAndFileName);
END;

// ReleaseCom muss immer erfolgen, auch wenn nichts zu drucken war, sonst blockiert der nächste Aufruf weil die PDFCreator-Instanz belegt ist
PDFCreatorQueue.ReleaseCom();



Im Bericht die gewünschte Seitengröße wie z.B. A4 fest vorgeben, es kann sonst zu falschen Seitenumbrüchen in der erzeugten PDF-Datei kommen. Eigentlich sollte die Seitengröße von den Druckereinstellungen übernommen werden, aber Bugs gibt es halt überall :mrgreen: .

Thema verschoben von 4.xx nach NAV 2009
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: [gelöst]PDF-Creator

4. September 2017 14:31

Danke Kowa :)

Genau das habe ich gesucht.
Welche Klassen sind:
- PDFCreatorQueue
-PDFCreator

VG mikka

Re: [gelöst]PDF-Creator

4. September 2017 14:44

mikka hat geschrieben:Welche Klassen sind:
- PDFCreatorQueue
-PDFCreator

PDFCreatorQueue -> Queue
PDFCreator -> PDFCreatorObj

Re: [gelöst]PDF-Creator

9. August 2020 20:34

Hallo Mikka,
ich habe deinen Code benutzt, er funktioniert aber aus irgendeinem Grunde bei uns nicht. Die Codeunit tut zwar, was sie soll, das Dokument wird auch abgespeichert, aber die Codeunit wird nicht mehr verlassen und hängt in einer Endlosschleife, warum auch immer. Was könnte das sein?
Gruß, Georg

Re: [gelöst]PDF-Creator

9. August 2020 22:43

Sorry, sollte an Kai gehen....:-(

Re: [gelöst]PDF-Creator

10. August 2020 09:17

GeorgRost hat geschrieben:Was könnte das sein?

Da gibt es viele Ursachen. Das kann auch vom Codes des gedruckten Report selber kommen. Das hatte ich mal mit einem, der mandantenübergreifend aufgerufen wurde und Daten im anderen Mandanten zusammenstellen musste und intern eine Endlosschleife hatte.
Es ist ja ein Zähler eingebaut, der maximal 20 Sekunden versucht, eine Datei zu erstellen. Nach dem
Code:
IF Seconds <= 20 THEN
kann man in einem zusätzlichen ELSE-Zweig auch ein ERROR-Abbruch einbauen. Dann sollte spätestens Schluss ein.

Re: [gelöst]PDF-Creator

12. August 2020 20:56

Danke Kai,
es ist merkwürdig. Auf einem anderen PC funktioniert das tadellos, obwohl beide PC's absolut die gleiche Datenbank und den gleichen PC-Creator -Release haben.Ich habe auch alle anderen PDF-Printer runtergeschmissen. Trotzdem, das Biest hängt.