Seite 1 von 2

Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 9:32
von Jan
Moin,

wir kämpfen gerade mit folgendem Problem: Ich erstelle mit Edgars Klasse PDF, die aus einem größeren Hintergrundbild (3-4 MB groß) und individuellem Text bestehen. Die wird auf einem Windows Server 2012 gespeichert, und dann direkt ausgedruckt. Clients sind alle Windows 10.

Nun kommt es seit einiger Zeit vor, das nur der Zusatztext gedruckt wird. Nicht die Grafik. Oftmals klappt der Ausdruck komplett, allzuoft aber eben nur der Text. Wenn man sich dann die PDF auf dem Server ansieht, ist die aber vollständig. Ein manueller Druck aus dem Adobe Reader ist vollständig, aber zu dem Zeitpunkt ist natürlich auch schon wesentlich mehr Zeit vergangen.

Mein Verdacht ist, das es ein Caching-Problem gibt. Das die PDF zum Zeitpunkt des Druckes noch nicht komplett auf die Festplatte geschrieben ist.

Edgar hat die Druckroutine mit seiner aktuellen Klasse umgeschrieben. Aber auch die Verwendung der alten Version gibt den gleichen Fehler. Das können wir also ausschließen.

Gibt es eine Möglichkeit sicherzustellen, das eine Datei komplett auf dem Server weggeschrieben ist (sozusagen ein File-Commit)? Oder vor dem Drucken festzustellen, ob die nun komplett geschrieben worden ist, und eben so lange zu warten?

Jan

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 9:35
von Bertram Hansen
Jan,

nur so aus dem Bauch heraus.
Kannst du nicht vor dem Drucken versuchen die PDF exklusiv zu öffnen.

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 9:47
von Martin Altmann
Jan,
ich nehme mal an, dass Du auch ein ::EndDoc(.f.) gefolgt von einem ::Destroy() für Dein PDF-Objekt machst, bevor Du es anzeigen lässt - oder?

Viele Grüße,
Martin

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 10:07
von Jan
Hallo Martin,

nein. Weil nach dem :create() direkt das :print() folgt. Bzw. ich habe da mal eine Verzögeurng von 3 Sekunden eingebaut, um dem Server etwas Zeit zum Speichern zu geben. Die Verbesserung war aber nur minimal.

Die Idee ist aber interessant. Ich werde mal schauen, ob ich damit was anfangen kann.

Jan

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 10:10
von Martin Altmann
Bei mir hatte es damals geholfen. Ich schreibe tausende zweiseitige PDFs und versende die im Anschluss per Mail.

Viele Grüße,
Martin

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 10:10
von Jan
Bertram,

vor dem Drucken öffne ich die Datei per FOpen(), FRead(), FClose(), um die Größeneinstellungen des Dokumentes zu erhalten (das kann DIN A 4 oder DIN A 6 sein).

Jan

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 10:12
von Jan
Martin,

das versenden der Mail im Anschluß klappt auch. Aber auch dann ist ja schon ein wenig mehr Zeit vergangen.

Und im Gegensatz zu Deinen PDF (ich setze das jetzt mal einfach voraus) sind meine umfangreicher. Durch das Hintergrundfoto. Und nur das fehlt in den direkten Ausdrucken. Der normale Text ist da, inkl. mehrere Dutzend "gemalter" Linien im Barcode.

Jan

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 10:28
von Martin Altmann
Nicht unbedingt!
Ich nutze eine PDF-Vorlage (wie Du), in die ich Text einmische!
Die PDF-Vorlage kann Text enthalten (wenn sie ordentlich aus der Druckerei kommt) - sie kann aber auch zwei ganzseitige Grafiken enthalten (wenn das Papier manuell gescannt und als PDF gespeichert wurde).

Viele Grüße,
Martin

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 10:44
von Jan
Martin,

ich habe mich vertan. Doch, das PDF-Objekt wird nach dem Erzeugen der PDF destroyed und genillt, danach erst wird ein neues Druck-Objekt erstellt, mit dem die gespeicherte PDF dann gedruckt wird.

Jan

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 11:16
von Martin Altmann
Jan,
worauf ich hinaus wollte: Mach ::EndDoc( .f. ) und öffne nach dem ::Destroy() die Datei zum Anzeigen manuell.

Viele Grüße,
Martin

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 11:30
von Jan
:?:

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 11:34
von Martin Altmann
Wenn Du dein fertiges PDF anzeigst, dann machst Du ja wahrscheinlich ein :EndDoc( .t. ) - oder? Damit wird das sofort angezeigt.
In dem Fall ist es besser, das PDF zu erzeugen, alle Objekte wegzuschmeißen und danach ein Objekt zu erzeugen, das zur Anzeige der Datei genutzt wird (also die Datei von der Platte lädt).

Viele Grüße,
Martin

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 11:55
von Jan
Martin,

ich hatte mich doch oben korrigiert und geschrieben, das ich das PDF-Erzeugungsobjekt destroye und nille, und dann erst das PDF-Druckobjekt erstelle. Genau das, was Du ganz oben vorgeschlagen hattest.

Von daher verstehe ich Deinen erneuten Vorschlag nicht. Auch nach Deiner Erklärung nicht.

Jan

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 12:57
von Martin Altmann
Ach so!
Ich dachte, Du hast das Problem bei der Anzeige des frisch erstellten Dokumentes. Dann warte doch einfach 5 Minuten bis zum Ausdrucken - aber ähnliches machst Du ja schon.

Viele Grüße,
Martin

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 13:04
von Jan
Martin,

naja, 5 Minuten warten kommt nicht so gut, wenn der Kunde daneben steht und wartet. Ansonsten hätte ich die Wartezeit ja auch selber schon angehoben.

Ich denke das geht nur über irgendwelche Servereinstellungen oder anderes Sicherstellen, das die Datei iwrklich sofort komplett weggeschrieben wird.

Jan

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 16:38
von Koverhage
Jan,
wie wäre es mit local speichern. drucken und auf server kopieren und local löschen ?

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 16:52
von Jan
Hallo Klaus,

nette Idee. Die mich erstmal positiv angesprochen hat. Aber die einen kompletten Umbau der Logik bedeuten würde.

Das gesamte Programm ist so gebaut, das Kundenbelege beim Ausdruck immer als PDF gespeichert werden. Das betrifft Angebote, Auftragsbestätigungen, Rechnungen, die hier relevanten Gutscheine, und so manches mehr. Das heißt, es gibt diverse Funktionen, die die entsprechenden PDF generieren und speichern. Die Druckfunktion liegt komplett woanders im Code und wird dann nur bei Bedarf aufgerufen. Entweder nach der Erzeugung der PDF, oder später bei einem Nachdruck, oder bei einem Mailversand des Dokumentes. Drucken und mailen gehen immer auf die gespeicherte PDF, niemals in eine wirkliche Druckfunktion.

Wenn ich also erst lokal speichere, und erst später auf den Server schiebe, dann muß ich das irgendwie abstimmen mit einem eventuell nachfolgenden Druckauftrag. Das wird komliziert. Vor Allem, weil meine Vorgänger in dem Projekt nun ja, sagen wir mal, etwas unordentlich gearbeitet haben was Funktionsaufrufe, Variablen, usw. betrifft. Ich muß da mit einer Menge Altlasten klar kommen.

Ich werde mir das aber mal anschauen, vielleicht kann ich das mit irgend einer Paramterübergabe (mein Kunde hast Parameterübergaben, weil er die nicht versteht) doch irgendwie halbwegs schmerzfrei testen.

Jan

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 16:57
von Werner_Bayern

Code: Alles auswählen

      if file(MAILVERZEICHNIS + cPDF_Datei)
         sleep(30)
         for i := 1 to 20
            if .not. (nDatei := fopen(MAILVERZEICHNIS + cPDF_Datei, FO_READ+FO_DENYREAD)) == -1 // Datei konnte erfolgreich geöffnet werden
               fclose(nDatei)
               exit
            endif
            sleep(30)
         next i
         sleep(30)
      endif
      if .not. file(MAILVERZEICHNIS + cPDF_Datei) .or. i == 21
         hinweis("PDF-Druck", "Bitte kurz warten, bis der PDF-Druck abgeschlossen ist...")
      endif

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 17:05
von Jan
Hallo Werner,

ein FOpen() etc. mache ich schon (siehe weiter oben). Aber die mehrfachen Sleep(30) sind einfach nicht machbar. So lange wartet kein Mitarbeiter im kundenstreß auf den Ausdruck, geschweige denn ein wartender Kunde in der Schlange.

Ich kann aber mal schauen, ob ein kurzes Warten nach dem FClose() helfen könnte. Vorher habe ich ja schon eine Verzögerung eingebaut.

Jan

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 17:51
von Werner_Bayern
Jan hat geschrieben:Aber die mehrfachen Sleep(30) sind einfach nicht machbar. So lange wartet kein Mitarbeiter im kundenstreß auf den Ausdruck, geschweige denn ein wartender Kunde in der Schlange.
Würd ich auch nie programmieren! :)
Wir sprechen hier von erstmal 30 ms, nur wenn dann noch nicht die Datei da oder komplett geschrieben ist, wird max. 20x a 30 ms gewartet. Du kannst Dir die Schleife ja anpassen, mach halt bloß 5 Durchgänge. Wir sprechen bei 20 Durchläufen von 630 ms, das sind 6,3 Sekunden - wenn es ein Geschwindigkeitsproblem gibt! Nur dann.

Also, ist das Netzwerk ok und der Fileserver "schnell" genug, hält der Code nichts auf, ansonsten wartet er max. 6,6 Sekunden, bis eine Meldung ausgegeben wird. Wenn Du i anpasst, dann halt entsprechend schneller.

Ich denke, besser kannst Du das Problem softwaremäßig in Deiner Applikation nicht bedienen - bis mich jemand vom Gegenteil überzeugt. 8)

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 18:11
von AUGE_OHR
Jan hat geschrieben:... die aus einem größeren Hintergrundbild (3-4 MB groß) und individuellem Text bestehen.
Frage : was für ein Drucker und wie viel Speicher (RAM) hat der Drucker ?

ich hatte früher (v1.5x) mal ein ähnliche Problem mit Word Dateien die ich per Runshell() gedruckt hatte.
es fehlten teilweise die Grafiken aber der Text war meistens komplett. Die Doc war immer komplett.

da es viele DOC Dateien waren kamen wir auf die Idee den Drucker (Kyrocera) aufzurüsten mit mehr RAM und danach gab es keine Problem mehr.

Re: Dateien sicher schreiben

Verfasst: Di, 29. Nov 2016 20:23
von brandelh
wie wäre es mit PDF auf dem servr schreiben und schließen,
danach auf lokale platte kopieren und von dort drucken ?

Re: Dateien sicher schreiben

Verfasst: Sa, 28. Jan 2017 13:36
von mikehoffmann
Google mal nach der API-Funktion "FlushFileBuffers". Da findeste auch einen Hinweis auf CreateFile mit FILE_FLAG_NO_BUFFERUNG flag.
Damit kannste sicherstellen, dass Deine Daten schnellstmöglich da ankommen, wo sie hinsollen.
Wenn's dann noch nicht klappt, hast Du ein anderes Problem.
Viele Grüße
Michael

Re: Dateien sicher schreiben

Verfasst: Sa, 28. Jan 2017 19:08
von ramses
Hallo Jan
ich hatte vor Jahren die selben Probleme, besonders wenn grössere BitMaps enhalten waren, ich hatte dann deshalb auf L&L gewechselt und seitdem auch mit 28MPix Bilder keine Probleme mehr. Edgar's Klasse ist ja eigentlich nur ein Wrapper auf Quickpdf mit den dazugehörigen Sorgen.

Vielleicht würde dir ja derselbe Schrift (zu L&L) auch weiterhelfen. ..... Auf jeden Fall ist die Gestaltung eines DOC's viel viel einfacher und schneller und Tel. Support ist super und in Deutsch .....

Cu Carlo

Re: Dateien sicher schreiben

Verfasst: Sa, 28. Jan 2017 20:17
von AUGE_OHR
mikehoffmann hat geschrieben:Google mal nach der API-Funktion "FlushFileBuffers". Da findeste auch einen Hinweis auf CreateFile mit FILE_FLAG_NO_BUFFERUNG flag.
gute Idee !
du solltest noch ein Beispiel bringen wie man das macht den API ist nicht jedermanns Sache.