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:
En de aanroep + verwijderen:
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 } } |