Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Χρησιμοποιώ βιβλιοθήκες 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

Δημοσ.

Στην ουσία δεν προλαβαίνει να κάνει spool το αρχείο, για αυτό δεν στο εκτυπώνει. Βάζωντας την καθυστέρηση στην ουσία δίνεις χρόνο στο OO να κάνει το έγγραφο spool στην ουρά του printer.

Δεν ξέρω πως ακριβώς γίνεται αυτό αλλά διάβασε αυτό το άρθρο που έχει τις καταστάσεις της εκτύπωσης και στην ουσία περίμενε να δεις πότε έγινε JOB_SPOOLED (ή failed) πριν κλείσεις το proccess.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...