Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Do 05.09.13 08:37 
Hey Leute,

ich sitz seit 3 Tagen an einem Problem bei dem mir langsam aber sicher die Ideen ausgehen. Ich habe mehrere WPF-Visuals die ich in einer XPS speichern möchte. Das erste Blatt soll eine Art Übersicht auf A3-hoch werden, dann sollen die Daten in einem DataGrid auf A4-quer gespeichert werden. Da findet man ja genug Ansätze bei Google. Ich hab mich dann für das FixedDocument entschieden. Dort erstelle ich mehrere Visuals, wrappe die in einer FixedPage mit der richtigen Größe und Ausrichtung, füge sie dem FixedDocument hinzu und speicher letztendlich das FixedDocument mit Hilfe des XpsDocumentWriters.
Alles schön und gut, sieht auch super aus. Das Problem ist jetzt, das mein Programm bei sehr vielen Seiten über 3GB RAM verbraucht, weil ja alle Visuals des FixedDocuments doppelt und dreifach im Speicher gehalten werden müssen. Also hab ich nach einer Möglichkeit gesucht die Elemente direkt nach dem Erstellen zu schreiben und danach gleich wieder freizugeben. Dieses Problem soll man mit dem SerializerWriterCollator lösen können. Das funktioniert auch relativ gut. Nur leider sind jetzt alle Seiten in der XPS gleich groß, obwohl ich bei jedem Schreibvorgang einen extra PrintTicket angegeben habe, welches die Seitengröße beinhaltet. So sieht das Ganze aus:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
var printTicket = new PrintTicket()
{
    OutputQuality = OutputQuality.High,
    PageMediaSize = new PageMediaSize(graphPrintContainer.ActualWidth, graphPrintContainer.ActualHeight),
    PageMediaType = PageMediaType.Archival,
    DeviceFontSubstitution = DeviceFontSubstitution.On,
    TrueTypeFontMode = TrueTypeFontMode.Automatic,
    PageOrientation = (graphPrintContainer.PageOrientation == PageOrientation.Landscape ?
        System.Printing.PageOrientation.Landscape :
        System.Printing.PageOrientation.Portrait),
};

XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xps);
SerializerWriterCollator collator = writer.CreateVisualsCollator(printTicket, printTicket);
collator.BeginBatchWrite();
try{
    /* [...] (graphContainer erstellen ) */
    do
    {
        var pagePos = PageGenerator.GetPagePos(pageCount, pageIndex);
        graphContainer.GraphVisual.Translation = new Point(pagePos.X * pageSize.Width, pagePos.Y * pageSize.Height);

        graphPrintContainer.UpdateLayout();
        graphContainer.UpdatePrintAnnotationBehavior();
        graphPrintContainer.UpdateLayout();

        collator.Write(graphPrintContainer, printTicket);
        pageIndex++;
    } while (pageIndex < maxPages);

    /* [...] (nodeOverviewPrintContainer) */
    printTicket.PageMediaSize = new PageMediaSize(nodeOverviewPrintContainer.ActualWidth, nodeOverviewPrintContainer.ActualHeight);
    printTicket.PageOrientation = (nodeOverviewPrintContainer.PageOrientation == PageOrientation.Landscape ?
        System.Printing.PageOrientation.Landscape :
        System.Printing.PageOrientation.Portrait);
    for(int i = 0; i < nodeOverviewPages.Length; i++)
    {
       nodeOverviewDataGrid.SetPage(nodeOverviewPages[i]);
       nodeOverviewDataGrid.UpdateLayout();
        
       collator.Write(nodeOverviewPrintContainer, printTicket);
    }
}
finally
{
    collator.EndBatchWrite();
}

Hat jmd ne Ahnung warum das nicht so funktioniert wie es soll? Bzw. kennt jmd ne Alternative die das realisiert was ich möchte?

MfG & Thx Bergmann89

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Fr 06.09.13 16:05 
Hey,

für alle die vlt ein ähnliches Problem haben: Ich hab jetzt die generierte XPS geladen und die Werte so angepasst, das jede Seite die richtige Größe hat. Die Lösung ist zwar nicht ganz so toll, aber es funktioniert erstmal.

MfG Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^