[C#] XPSDocument disposen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 20:24
Voor een applicatie ben ik bezig om wat aan te passen.
Er worden in een applicatie meerdere documenten (1 pagina) geselecteerd, deze worden dan via een RPT naar een stream weggeschreven en deze worden dan geprint.
Nadeel is dat er voor elk document 1 job wordt aangemaakt, dit moest aangepast worden zodat het niet 40 jobs voor 40 documenten gaat worden, maar 1 job met 40 documenten.

Om tot deze oplossing te komen heb ik besloten XPSDocuments te gaan gebruiken, voordeel is dat ik dan de ingebouwde XPS Printer kan gebruiken, deze te mergen en daarna in 1 naar de printer te knallen.

Dit werkt enigzins, echter loop ik wel tegen wat issues aan.
Na het aanmaken van de documenten en het mergen dien ik deze te verwijderen aangezien ik de hele folder door itereer, dit lukt niet omdat het document in gebruik is door de applicatie voor het mergen (ondanks dat dit al is afgerond).
Als ik na het toevoegen van het document de functie doc.Close(); aanroep dan meld die daarna bij het mergen dat het document niet bestaat.

Ik heb ondertussen al vanalles geprobeerd, maar ik kom er echter voor geen meter uit.
Wellicht dat wat tweakers hier me in de goede richting kunnen wijzen?

De applicatie is gemaakt in VS2010 onder .net 3.5

De XPSDocumentHandler:

C#:
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
48
49
50
51
52
53
54
55
56
57
58
59
    public class XPSHandler
    {
        //function to merge XPS files
        //see also: http://stackoverflow.com/a/11435396/1799709
        //or http://stackoverflow.com/questions/10672456/merging-xps-documents-make-last-one-duplicate
        public void MergeXpsDocument()
        {
            string newFile = "";
            List<XpsDocument> sourceDocuments = new List<XpsDocument>();

            string[] files = Directory.GetFiles("C:\\temp", "*.xps", SearchOption.TopDirectoryOnly);

            foreach (string file in files)
            {
                string filename = file.Substring(file.LastIndexOf("\\") + 1);
                if (filename.Substring(0, 1) == "1")
                {
                    newFile = "C:\\temp\\Prints1.xps";

                    XpsDocument doc = new XpsDocument(file, FileAccess.Read);
                    
                    sourceDocuments.Add(doc);

                    //hier doc.close(); toevoegen geeft de foutmelding dat het bestand niet gevonden kan worden omdat deze verwijderd is
                }
                else
                {
                    newFile = "C:\\temp\\Prints0.xps";

                    XpsDocument doc = new XpsDocument(file, FileAccess.Read);
                    sourceDocuments.Add(doc);

                    //hier doc.close(); toevoegen geeft de foutmelding dat het bestand niet gevonden kan worden omdat deze verwijderd is
                }

            }

            XpsDocument xpsDocument = new XpsDocument(newFile, System.IO.FileAccess.ReadWrite);
            XpsDocumentWriter xpsDocumentWriter = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
            FixedDocumentSequence fixedDocumentSequence = new FixedDocumentSequence();

            foreach (XpsDocument doc in sourceDocuments)
            {
                FixedDocumentSequence sourceSequence = doc.GetFixedDocumentSequence();
                foreach (DocumentReference dr in sourceSequence.References)
                {
                    DocumentReference newDocumentReference = new DocumentReference();
                    newDocumentReference.Source = dr.Source;
                    (newDocumentReference as IUriContext).BaseUri = (dr as IUriContext).BaseUri;
                    FixedDocument fd = newDocumentReference.GetDocument(true);
                    newDocumentReference.SetDocument(fd);
                    fixedDocumentSequence.References.Add(newDocumentReference);
                }
            }
            xpsDocumentWriter.Write(fixedDocumentSequence);
            xpsDocument.Close();

        }
    }


En de aanroep + verwijderen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
XPSHandler xpsHandler = new XPSHandler();
            xpsHandler.MergeXpsDocument();

            try
            {
                LocalPrintServer localPrintServer = new LocalPrintServer();
                PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();

                PrintSystemJobInfo xpsPrintJob = defaultPrintQueue.AddJob("Print", "C:\\temp\\Prints1.xps", false);
            }
            catch (PrintJobException e)
            {
                throw e;
            }
            finally
            {
                //clear all xps files
                string[] allfiles = Directory.GetFiles("C:\\temp", "*.xps", SearchOption.TopDirectoryOnly);
                foreach (string file in allfiles)
                {
                    File.Delete(file); //Gaat onderuit dat het bestand al in gebruik is
                }
            }

Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Het veiligste is om nadat je
code:
1
2
xpsDocumentWriter.Write(fixedDocumentSequence);
xpsDocument.Close();

doet nog een keer door je sourceDocuments heen te loopen om al je bron xps bestanden te closen.

Het zou evt ook in de 2e foreach kunnen na de merge, maar weet niet genoeg van de xpsdocument af om te zien of dat bij de save van je doc een issue geeft.

[ Voor 5% gewijzigd door YakuzA op 03-12-2015 15:39 ]

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 20:24
YakuzA schreef op donderdag 03 december 2015 @ 15:38:
Het veiligste is om nadat je
code:
1
2
xpsDocumentWriter.Write(fixedDocumentSequence);
xpsDocument.Close();

doet nog een keer door je sourceDocuments heen te loopen om al je bron xps bestanden te closen.

Het zou evt ook in de 2e foreach kunnen na de merge, maar weet niet genoeg van de xpsdocument af om te zien of dat bij de save van je doc een issue geeft.
Yes dat lost t inderdaad op, en ik maar moeilijk in dispose methods aan t zoeken 8)7

toegevoegde code:
C#:
1
2
3
4
foreach (XpsDocument doc in sourceDocuments)
            {
                doc.Close();
            }