Autor wpisu: Diabl0, dodany: 20.03.2012 17:22, tagi: javascript, php
Użytkownicy pracujący w serwisach intranetowych wielokrotnie stoją przed koniecznością wydrukowania jakiegoś dokumentu czy formularza celem zachowania papierowej dokumentacji czy wydania papierowej wersji klientowi. Dotychczas realizowałem to tworząc i otwierając w nowym oknie dokument PDF gdzie użytkownik musiał ręcznie wybrać opcję Drukuj. Teoretycznie to działa, aczkolwiek jest troszkę upierdliwe. Jednakże ostatnio przypadkowo trafiłem na informację że PDF może zawierać swój kod JS więc postanowiłem troszkę poeksperymentować.
Sytuacja z życia wzięta – pielęgniarka pobiera próbki do badań laboratoryjnych. Na stronie ma listę zleconych testów oraz informacje jakie i ile próbek pobrać. Na każdą próbkę powinna wydrukować naklejkę z unikalnym kodem kreskowym. Problemem jest to drukowanie: naklejki są małe, kod długi i mało czytelny bez czytnika – przy drukowaniu „masowym” po pobraniu wszystkich próbek łatwo o pomyłkę. Drukowanie każdego kodu w miarę dodawania jest znowu bardzo niewygodne – kliknięcie „dodaj próbkę”, czekanie aż otworzy się okienko z plikiem PDF, kliknięcie drukuj, potwierdzenie ustawień drukowania (wybrać drukarkę do etykiet) i druk, zamknięcie okienka z plikiem PDF. Na szczęście jest na to sposób.
Tym sposobem jest właśnie Acrobat JavaScript.
Dla zainteresowanych dokumentacja znajduje się tutaj: http://partners.adobe.com/public/developer/en/acrobat/sdk/pdf/javascript/AcroJS.pdf
Co prawda AJS nie daje nam pełnych możliwości w zakresie drukowania dokumentu, ale już to co jest może nam znacznie ułatwić życie. Dzięki temu udało mi się zredukować cały proces do kliknięcia „dodaj próbówkę” i kliknięcia OK w komunikacie że PDF chce coś wydrukować.
Zaczynamy od naszego dokumentu PDF. Jako kreatora używam znakomitej biblioteki TCPDF, w której można znaleźć metodę IncludeJS(). Mój kod JS wygląda następująco:
// Ustawieniadrukowania var pp = this.getPrintParams(); // Wybieramy drukarkę (Nazwa drukarki widoczna w systemie) pp.printerName = "DYMO LabelWriter 450 Turbo"; // Ustawiamy automatyczny wybór rozmiaru papieru pp.flags |= pp.constants.flagValues.setPageSize; // Dodatkowe skalowanie aby dopasować dokument do papieru pp.pageHandling = pp.constants.handling.fit; // Drukujemy tylko treść bez żadnych dodatków pp.printContent = pp.constants.printContents.doc; // tryb "cichego" drukowania - pomijamy okno z preferencjami drukowania pp.interactive = pp.constants.interactionLevel.silent; // Wymuszenie drukowania this.print(pp);
Taki JS należy „zapisać” w dokumencie PDF. W TCPDF jak wspomniałem odpowiada za to metoda IncludeJS
$pdf = $this->_prepareStickerPDF( $stickerData ); if ( $this->getRequest()->getParam('print', 'false') != 'false' ) { // KOD Adobe PDF JS do wymuszenia drukowania i ustawienia podstawowych parametrów $js = ' var pp = this.getPrintParams(); pp.printerName = "DYMO LabelWriter 450 Turbo"; pp.flags |= pp.constants.flagValues.setPageSize; pp.pageHandling = pp.constants.handling.fit; pp.printContent = pp.constants.printContents.doc; '; if ( $this->getRequest()->getParam('print', 'false') == 'silent' ) { $js .= 'pp.interactive = pp.constants.interactionLevel.silent;'; } $js .= ' this.print(pp); '; $pdf->IncludeJS($js); } $pdf->Output('Sticker.pdf', 'I');
Ok. Mamy spreparowany dokument PDF który automatycznie przy otworzeniu chce się drukować na ustawionej drukarce. Teraz trzeba coś zrobić aby pozbyć się popupów z PDF’em. Z pomocą przyjdzie nam możliwość osadzania obiektów PDF w HTML’u. Możemy to zrobić przez znaczniki HTML lub z poziomu JS (więcej info: http://blogs.adobe.com/pdfdevjunkie/web_designers_guide). Z poziomu JS wykorzystuję do tego PDFObject. W pliku HTML mam placeholder o zerowych rozmiarach i do niego wczytuję dokumenty PDF.