masterakos Δημοσ. 12 Αυγούστου 2012 Δημοσ. 12 Αυγούστου 2012 Χρησιμοποιώ βιβλιοθήκες unoidl.com.sun.star.* του open office για να κάνω επεξεργασία και εκτύπωση αρχείου Calc(*.ods) μέσω C#. Για να γίνει γενικά διαχείριση ενός αρχείου open office χρειάζονται τα εξής αντικείμενα τα οποία δεν έχω καταλάβει τι ακριβώς είναι : * XComponentContext oStrap = uno.util.Bootstrap.bootstrap(); * XMultiServiceFactory oServMan = (XMultiServiceFactory)oStrap.getServiceManager(); * XComponentLoader desktop=(XComponentLoader)oServMan.createInstance("com.sun.star.frame.Desktop"); Κατά την δημιουργία του desktop απ'την συνάρτηση "createInstance()" ανοίγει το αρχικό παράθυρο του openoffice για να επιλέξεις εργασία. Φτάνω λοιπόν στο σημείο της εκτύπωσης και εκτελώ την (έτοιμη) συνάρτηση ((XPrintable)document).print(new PropertyValue[] {}); Η εκτύπωση ξεκινά αλλά θα ήθελα έπειτα να κλείσει αυτόματα η εκτέλεση του open office ως αυτόνομο πρόγραμμα. Έτσι εκτελώ το παρακάτω: Process proc = Process.GetProcessesByName("soffice.bin")[0]; proc.Kill(); Το θέμα τώρα είναι πως εάν γίνει "killed" δεν γίνεται η εκτύπωση. Κάτι σαν να μην προλαβαίνει να το πω λίγο "παιδικά" όπως το καταλαβαίνω. Έτσι του έδωσα μια καθυστέρηση Thread.Sleep(1000); και η εκτύπωση "προλαβαίνει" να δοθεί. Όλο αυτό με το sleep() δεν μου κάθεται καλά βέβαια γιατί δεν ξέρω τι θα γίνει σε άλλα PC και γενικά μοιάζει πολύ πρόχειρο. Έχει κανείς καμιά ιδέα γιατί συμβαίνει αυτό αφού η .print() βρίσκεται στο ίδιο Thread και λογικά θα τελειώσει το block της προτού γίνει killed το openoffice. ((XPrintable)document).print(new PropertyValue[] {}); // Για να γίνει εκτύπωση Thread.Sleep(1000); // Χωρίς αυτό σαν να μην εκτελέστηκε η .print() γιατί από κάτω κάνει kill to office Process proc = Process.GetProcessesByName("soffice.bin")[0]; proc.Kill(); // Για να κλείσει το OpenOffice
MitsakosGR Δημοσ. 12 Αυγούστου 2012 Δημοσ. 12 Αυγούστου 2012 Στην ουσία δεν προλαβαίνει να κάνει spool το αρχείο, για αυτό δεν στο εκτυπώνει. Βάζωντας την καθυστέρηση στην ουσία δίνεις χρόνο στο OO να κάνει το έγγραφο spool στην ουρά του printer. Δεν ξέρω πως ακριβώς γίνεται αυτό αλλά διάβασε αυτό το άρθρο που έχει τις καταστάσεις της εκτύπωσης και στην ουσία περίμενε να δεις πότε έγινε JOB_SPOOLED (ή failed) πριν κλείσεις το proccess. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα