Pracuję nad rozbiciem monolitycznej aplikacji railsowej na mniejsze i niezależne elementy (gem-y).
Efektem tych prac jest na początek dość uniwersalny gem do łatwego generowania plików pdf z szablonów slim i dostarczonych danych w hash-u.
wkhtmltopdf jest dosyć niestabilny i często trzeba dostarczać własną binarkę (czasem lepiej działa 0.9, czasem 0.11, w dodatku często musi być skompilowana ze spatchowanym qt). Dlatego https://gist.github.com/swistak/8423518#file-pdf_generator-rb-L57 - wybiera automatcznie lokalną wersję jak jest.
Debugowanie jest naprawdę pita jeżeli nie zapisujesz gdzieś w międzyczasie tego htmla.
Warto logować (także np. jako komentarz w generowanym htmlu), jaka dokładnie komenda wkhtml (z wszystkimi parametrami), została wykorzystana do wygenerowania pdfa. Pozwala to łatwo zreprodukować błędy.
Od dawien dawna zabierałem się za coś podobnego, miło że ktoś inny znalazł na to czas. Warto zobaczyć jak to robi pdfkit (także korzysta z wkhtmltopdf)
W giscie masz też mój (wypracowany metodą prób & błędów) szablon css służący jako baza do projektów korzystających z wkhtmltopdf
Z tiþów które mogę jeszcze podać to - uwaga na floaty - strasznie się gryzą z page-break-inside: avoid i generalnie wszystkimi komendami page-break
Wielkie dzięki za feedback i gist-a. CSS przyda mi się do gem-u produkującego faktury
Do slim2pdf wprowadzę logowanie oraz możliwość własnej definicji komendy wywołującej wkhtmltopdf. To powinno załatwić sprawę z różnymi konfiguracjami serwerów, xvfb itp. Zrobię też lepszą obsługę błędów i wyjątków w momencie wywoływania wkhtmltopdf.
Wygenerowany HTML można zapisać metodą save_to_html(html_path). Do debugowania takie rozwiązanie powinno wystarczyć.
Właśnie wydałem nową wersję gem-a slim2pdf (0.0.2).
Zgodnie z sugestiami @swistak84 dodałem możliwość ustawienia własnej komendy wkhtmltopdf oraz wskazania loggera.
Jeśli użyjecie slim2pdf w Railsach logowanie ustawi się automatycznie.
Do generowania prostych PDF-ów czasem wystarczy dołączyć stosowny arkusz styli (print) i użyć opcji “Drukuj do pliku” w Chrome. Zastosowałem to rozwiązanie do drukowania faktur i świetnie się sprawdza.
Jeśli PDF-y generuje system, takie rozwiązanie nie przejdzie. Na przykład przy seryjnym generowaniu umów/faktur ze skryptu w Ruby albo wysyłaniu wygenerowanych dokumentów mailem z automatu.