• Unsere Reports werden vorwiegend aus Bilder (meist Png), die in diversen Plugins dynamisch erzeugt werden, erzeugt und dann als RTF gespeichert, um dann in einem zweiten Schritt diese dann lokalisieren zu können.

    Es kann aber vorkommen, dass ein Report aus ungewöhnlich vielen Bildern (z.B. >400) besteht und es dadurch zu Problemen mit dem Speicher kommt - der Prozess braucht dann mehr als 2GB an Arbeitsspeicher.

    Gibt es eventuell eine Möglichkeit diese Bilder nicht direkt im Speicher zu halten sondern nur einen "Link" einzufügen und die Bilder einfach auf der HD zu speichern? Eine Verkleinerung der Bilder selber ist leider keine Option.

    lg
    Michael Rabatscher

  • Ich habe mir gedacht ich könnte eventuell eine abgeleitete Klasse von TGraphic kreieren, die ein Graphikobjekt im Konstruktor bekommt und diese Graphik einfach nur auf die Festplatte speichert. Bei jeder Draw-Operation wird die Graphik geladen, gezeichnet und wieder zerstört (der Einfachheit halber wird ein WPRichText Objekt nur mit CreateDynamik erzeugt d.h. das Bild wird eigentlich nie gezeichnet). Was hält ihr von der Idee (bzw. gibts irgendwelche Pitfalls die ich bachten sollte)?

    Jetzt wird aber nicht nur einfach ein RTF Dokument erzeugt sonder zu einem späteren Zeitpunkt auch ein PDF daraus erzeugt (mit wpdf).

    Nun zur Frage: Ist WPDF so speichereffizient, dass es nicht das gesamte erzeugt Dokument im Speicher hält und dann erst schreibt? Meine Hoffnung ist ja, dass bei jedem Aufruf von EndDoc der Stream geschrieben wird und alles davor "vergessen" wird.

    lg
    Michael Rabatscher

    • Offizieller Beitrag

    Hallo,

    Am besten lösen Sie diese Problem mit einer Anpassung der unit wpobj_image. In einem abgeleiteten TWPOImage objekt kann in der Tat so gearbeitet werden wie sie es vorhaben. Die TGraphi klasse abzuleiten würde nichts bringen.

    Bei der Ausgabe in eine PDF Datei werden die Bilder sofort geschrieben und belasten dann den Speicher nicht mehr. Bei einem memory stream ist das natürlich anders.

    Bei EndDoc werden die PDF strukturen geschrieben, die Bilder sind aber schon vorher weg.

    Beste Grüsse,
    Juian Ziersch

  • Danke für die Info - ich habs mit einer Kombination von beidem geschafft - ein abgeleitetes TGraphic objekt (das ein Tmp file schreibt) und eine spezielle, von TWPOImage abgeleitete Klasse, die das Zeichnen (+ ein paar zusätzliche Prozeduren) ausführt.

    Zitat

    Bei der Ausgabe in eine PDF Datei werden die Bilder sofort geschrieben und belasten dann den Speicher nicht mehr. Bei einem memory stream ist das natürlich anders.

    Bei EndDoc werden die PDF strukturen geschrieben, die Bilder sind aber schon vorher weg.

    Wohin? Ich habe bemerkt, dass das Ausgabefile erst bei EndDoc geschrieben wird. Werden die Daten noch zusätzlich in ein temporäres File geschrieben oder komprimiert im Speicher gehalten?

    lg
    Mike

  • Und sonst wird alles im speicher behalten?

    Ich benutze zur Zeit nämlich einen temporären Filestream (öffnet ein File und löscht dieses wenn das Objekt zerstört wird) und weise diesen dem PDF Druckerobjekt zu.

    lg
    Michael Rabatscher