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.