Automatyczne drukowanie różnych pdfów na różnych drukarkach

Wstęp

Jednym z większych problemów podczas pracy z wieloma dokumentami pdf dostępnymi w panelu administracyjnym jest automatyzacja procesu drukowania tych dokumentów. Zwłaszcza, gdy każdy z nich ma inną wielkość i powinien być wydrukowany na innej drukarce (dymo, zebra, itd). W pewnym momencie ręczne odpalanie Acrobata (lub wtyczki w przeglądarce), klikanie na ikonce wydruku, wybranie drukarki z listy i ostateczne kliknięcie na guziku „drukuj” staje się uciążliwe. Stąd pomysł na zautomatyzowanie tego procesu.

Gotowiec

Po kilku godzinach szukania w internecie okazało się, że nie będzie to łatwe zagadnienie. Kilku znajomych programistów podpowiadało czym można by to zrobić, ale np. proponowane node.js z node-printing.js (o ile mnie pamięć nie myli) okazały się małym niewypałem. W takim sensie, że dodatkowa biblioteka nie dawała się skompilować („bo nie i już”), a sam autor napisał, że na razie dostępny jest tryb drukowania RAW i TEXT bez możliwości drukowania plików pdf.

A może by tak wymyślić coś swojego?

W trakcie poszukiwań gotowca natknąłem się na informację o tym, że można wywołać Acrobata z linii poleceń z nazwą pliku i drukarki, dzięki czemu odpali się automatyczne drukowanie. To nasunęło mi myśl, że przy odrobinie chęci można będzie zrobić automat i to taki, który zadziała bez większych cudów. Rozwiązanie będzie się składać z dwóch elementów: części przeglądarkowej przekazującej dane oraz z części lokalnej, która te dane przekaże do Acrobata/Foxita/itp.

Przeglądarkowo

Pod guzik podpinamy wywołanie ajaxowe, które przekazuje do serwera żądanie odesłania treści pliku pdf. Gdy już mamy tę treść możemy przekazać ją do naszej części lokalnej:


$.ajax({
type: "POST",
url: "http://127.0.0.1:port/nazwa",
data: msg,
dataType: "html",
success: function(msg2){

}
});

Port to oczywiście port, na którym działa program wywołujący Acrobata. Natomiast nazwa, to nazwa pliku bat odpalanego celem wydrukowania pliku pdf.

Lokalnie

Potrzebny będzie program, który na zadanym porcie nasłuchuje ruchu i w razie pojawienia się danych odbierze wszystkie informacje i odpowie na przykład w taki oto sposób:


odpowiedz = "HTTP/1.0 200 OK\nAccess-Control-Allow-Origin:*\n" ;
odpowiedz += "Content-Type: text/html\nContent-Length: 2\n" ;
odpowiedz += "Connection: close\n\nOK" ;

Dzięki temu przeglądarka myśli, że otrzymała odpowiedź od serwera www. Ważnym elementem jest Access-Control-Allow-Origin:*, który zapewnia, że przeglądarka nie burzy się odnośnie przekazania danych na inny adres.

Pozostaje już tylko przetworzyć otrzymane dane. Z nagłówków wyciągamy adres docelowy POSTa oraz pole Content-Length. To pierwsze pozwoli określić jaki plik bat powinien być odpalony, to drugie posłuży do kontroli otrzymanych danych. Jeśli będzie jakiś błąd, to niepotrzebnie nie będziemy próbowali drukować uszkodzonego pliku pdf.

Uwagi końcowe

Treść pliku pdf może być przekazana w postaci zakodowanej np. w base64. W takim wypadku konieczne będzie dopisanie dekodera (da się znaleźć gotowiec na stackoverflow). Co więcej pdf jest plikiem binarnym, więc aplikacja powinna zapisywać plik docelowy w trybie ios::binary. Przy odrobinie zacięcia da się zrobić ten automat w ciągu jednego dnia roboczego.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*