Drukowanie z PowerShella a wirtualne drukarki
Pewnego razu chciałem napisać w PowerShellu prosty skrypt drukujący na dwóch stronach, chodziło o to żeby wykonać podział strony. Chciałem w tym celu wykorzystać
właściwość HasMorePages klasy PrintDocument, której używam do drukowania. Jednak przy wywołaniu metody Print() dostawałem błąd "Nieprawidłowe dojście".
Trzeba więc było najpierw zgadnąć jak to jest w angielskim Windowsie. Okazało się, że jest to "The Handle is Invalid". Aha, czyli nieprawidłowy uchwyt,
tłumacząc z microsoftowego na polski. Wskazywałoby to na to, że może obiekt na którym wołana jest metoda Print() jest nullem. Ale nie. Dalej okazało się,
że problem występuje tylko z microsoftową wirtualną drukarką Microsoft XPS Document Write i taki sam wyjątek leci też z Notatnika. Ponieważ nie udało mi się
rozwiazać problemu z tą drukarką, spróbowałem z inną, też wirtualną, microsoftową: Microsoft Office Live Meeting 2007 Document Writer. To w ogóle kolejny
przykład microsoftowej miłości do długich nazw. Z tą drukarką nie było już kłopotów, skrypt wykonał się poprawnie. Ale pojawił się inny problem. Ta drukarka
drukuje do plików MDI i nie bardzo jest czym je otworzyć. Microsoft
poleca w tym celu zainstalować SharePoint Designer 2007. Jednak to cudo, nawet po wyłączeniu
wszystkich zbędnych składników, zajmuje na dysku pół gigabajta. Trochę dużo jak na otwarcie pliczku graficznego. Tym bardziej, że jak się okazuje, ten cały
MDI to w istocie TIFF. Zamiast więc instalować półgigowy program, wystarczy zmienić rozszerzenie i otworzyć plik w dowolnej przeglądarce graficznej, choćby
tej systemowej.
Przy okazji wyszło, że HasMorePages działa trochę inaczej niż myślałem. Nie wstawia tak po prostu podziału strony, tylko mówi, że będzie
drukowana jeszcze jedna strona, czyli, że handler dla zdarzenia PrintPage ma być wywołany jeszcze raz. W tym handlerze musi być więc kod rozróżniający
która strona akurat jest drukowana i w zależności od tego ustawiać zarówno treść jak i właściwość HasMorePages.