Seite 1 von 1

[gelöst]PDF-Creator

Verfasst: 27. November 2012 09:15
von elf
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

Re: PDF-Creator

Verfasst: 27. November 2012 09:34
von Freestyler
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

Verfasst: 27. November 2012 14:11
von elf
danke, das hab' ich auch schon propbiert, mit BULLZIP ists das gleiche Problem wie mit PDFCreator.

Re: PDF-Creator

Verfasst: 27. November 2012 15:28
von Kowa
Das "Erstellen abwarten" hatten wir hier heute.
Den Spooler kann man außerdem noch auf "Created" abfragen.
PDFSpool.jpg

Re: PDF-Creator

Verfasst: 28. November 2012 09:51
von elf
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

Verfasst: 28. November 2012 11:42
von Kowa
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

Re: PDF-Creator

Verfasst: 29. November 2012 09:20
von elf
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

Verfasst: 31. August 2017 11:39
von Kowa
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

Re: [gelöst]PDF-Creator

Verfasst: 4. September 2017 14:31
von mikka
Danke Kowa :)

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

VG mikka

Re: [gelöst]PDF-Creator

Verfasst: 4. September 2017 14:44
von Kowa
mikka hat geschrieben:Welche Klassen sind:
- PDFCreatorQueue
-PDFCreator

PDFCreatorQueue -> Queue
PDFCreator -> PDFCreatorObj

Re: [gelöst]PDF-Creator

Verfasst: 9. August 2020 20:34
von GeorgRost
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

Verfasst: 9. August 2020 22:43
von GeorgRost
Sorry, sollte an Kai gehen....:-(

Re: [gelöst]PDF-Creator

Verfasst: 10. August 2020 09:17
von Kowa
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

Verfasst: 12. August 2020 20:56
von GeorgRost
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.