Konwertowanie plików HTML do formatu PDF [zamknięte]

128

Muszę automatycznie wygenerować plik PDF z istniejącego (X) dokumentu HTML. Pliki wejściowe (raporty) mają raczej prosty, oparty na tabelach układ, więc obsługa naprawdę wyszukanych elementów JavaScript / CSS prawdopodobnie nie jest potrzebna.

Ponieważ jestem przyzwyczajony do pracy w Javie, preferowane jest rozwiązanie, które można łatwo wykorzystać w projekcie Java. Musi jednak działać tylko w systemach Windows.

Jednym ze sposobów na zrobienie tego, który jest wykonalny, ale nie zapewnia dobrej jakości wyników (przynajmniej po wyjęciu z pudełka), jest użycie CSS2XSLFO i Apache FOP do tworzenia plików PDF. Problem, który napotkałem, polegał na tym, że podczas gdy atrybuty CSS są ładnie konwertowane, układ tabeli jest dość pomieszany, a tekst wypływa z komórki tabeli.

Rzuciłem też okiem na Jrex, API Java do korzystania z silnika renderującego Gecko.

Czy istnieje sposób na pobranie wyrenderowanej strony z silnika renderującego Internet Explorer i automatyczne wysłanie jej do narzędzia PDF-Printer? Nie mam doświadczenia w programowaniu OLE w Windows, więc nie mam pojęcia, co jest możliwe, a co nie.

Masz pomysł?

panschk
źródło
3
Niedawno utworzyłem torbę docbag z biblioteką Java, która może konwertować pliki xhtml na dokumenty pdf. Obecna wersja nie jest zaawansowana, ale jeśli twoje szablony xhtml są proste, ta biblioteka może się przydać.
Jakub Torbicki
Myślę, że najlepszym rozwiązaniem jest wykorzystanie możliwości przeglądarki do wykonania tłumaczenia. Zobacz stackoverflow.com/q/25574082/39998
David Hofmann
Utknąłem z generowaniem pdf z html, który zawiera litery cyrylicy. Wszystko jest w porządku oprócz liter cyrylicy, które zostały pominięte. Ktoś, kto ma taki problem?
Kristijan Iliev,
@krisiliev: Miałem podobne problemy i o ile pamiętam, użyta czcionka była bardzo ważna. Większość czcionek nie obsługuje pełnych znaków UTF8, ale następujące powinny: 'font-family: Arial Unicode MS;' (CSS). Upewnij się również, że używasz prawidłowego kodowania (radziłbym zawsze używać UTF-8)
panschk
2
ten link pomógł mi hmkcode.com/itext-html-to-pdf-using-java
Mateen

Odpowiedzi:

73

Projekt renderera XHTML Flying Saucer obsługuje generowanie XHTML do PDF. Spójrz na przykład tutaj .

znak
źródło
20
Prawdziwy problem z latającego Sauser jest to, że używa iText do renderowania PDF, który jest licencjonowany lib AGPL v3
David Hofmann
11
Wersja itext używana przez Flying Saucer to 2.0.8, która była dostępna na licencji LGPL. Tylko wersja o numerze 5 lub nowszym jest objęta bardziej restrykcyjną licencją. stackoverflow.com/questions/2692000/…
Gary,
8
Powiedziałbym, że prawdziwy problem z Latającym Spodkiem polega na tym, że wymaga on dobrze sformułowanego i ważnego dokumentu XML. Łatwo jest nieświadomie przerwać renderowanie PDF, dodając coś takiego jak ampersand do kodu HTML lub jakiś kod javascript, który sprawia, że ​​renderowany HTML nie jest ścisłym XHTML. Chociaż można to złagodzić za pomocą testów automatycznych lub jakiegoś procesu, który obejmuje walidację XML.
SteveT
3
@LateralFractal O ile wiem, Flying Saucer 9.0.8 (myślę, że najnowsza wersja) używa iText 2.1.7, który jest ostatnią wersją iText z zezwoleniem --- LGPL. mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf/…
Jonathan Crosmer
2
@JonathanCrosmer Yeah. Istnieją dwa pakiety FlyingSaucer dla PDF, jeden dla iText v2 i jeden dla iText v5. Zakładając, że oba mają taką samą funkcjonalność; ryzyko AGPL można pominąć.
LateralFractal
49

Czy próbowałeś WKHTMLTOPDF ?

Jest to proste narzędzie powłoki, implementacja WebKit typu open source. Oba są bezpłatne.

Ustawiliśmy tutaj mały samouczek

EDYCJA (2017):

Gdyby dziś miał coś zbudować, nie szedłbym już tą drogą.
Ale zamiast tego użyłby http://pdfkit.org/ .
Prawdopodobnie pozbawiając go wszystkich zależności nodejs, aby działał w przeglądarce.

Mic
źródło
16
W przypadku prostej konwersji strony HTML do formatu PDF jest to lepsze niż cokolwiek innego, co widziałem, bezpłatne lub komercyjne.
MGOwen
Czy to działa na systemie innym niż Mac OS?
Eran Medan
1
@Eran, używamy go w systemie Linux. Myślę, że jest też wersja dla Windowsa
Mic
1
@Mic Tak, jest też wersja dla systemu Windows.
Viccari,
testowany na Windows XP (wersja 0.9.9) i działa bardzo dobrze. Ponadto instalacja nie wymaga uprawnień administratora na komputerze.
Christopher Mahan
44

Sprawdź iText ; jest to czysty zestaw narzędzi Java PDF, który obsługuje odczytywanie danych z HTML. Użyłem go ostatnio w projekcie, kiedy musiałem pobrać zawartość z naszego CMS i wyeksportować jako pliki PDF, i to wszystko było dość proste. Obsługa tagów CSS i stylów jest dość ograniczona, ale renderuje tabele bez żadnych problemów (chociaż nigdy nie udało mi się ustawić szerokości kolumn).

Tworzenie pliku PDF z HTML wygląda mniej więcej tak:

Document doc = new Document(PageSize.A4);
PdfWriter.getInstance(doc, out);
doc.open();
HTMLWorker hw = new HTMLWorker(doc);
hw.parse(new StringReader(html));
doc.close();
fred-o
źródło
9
To AGPL, wydaje się nawet gorsze niż GPL, musisz być open source, nawet jeśli obsługujesz tylko PDF, a iText jest po stronie serwera.
Eran Medan
10
@Eran, po prostu użyj ostatniej wersji innej niż AGPL (com.lowagie: itext: 2.1.7 w Maven).
Nowaker
1
HTMLWorker jest przestarzały w nowszych wersjach IText na korzyść XMLWorker; jednak obsługa CSS jest słaba w obu przypadkach (patrz demo.itextsupport.com/xmlworker/itextdoc/… ) i nie była odpowiednia dla moich potrzeb. Wręcz przeciwnie, Latający Spodek był doskonały.
Pino,
Możesz użyć wersji LGPL, którą można znaleźć na github.com/albfernandez/itext2
Vladimir Rozhkov
4

Jeśli masz fundusze, nic nie przebije Prince XML, jak pokazuje ten film

Ólafur Waage
źródło
1
Jeśli szukasz tańszej alternatywy dla Prince'a, wypróbuj DocRaptor.com. Używa Prince'a jako silnika.
Julie
A jeśli chcesz taniej, ale z większą ilością opcji, wypróbuj htm2pdf.co.uk - korzysta z webkita i użytkowników prawdziwego WYSIWIG
user1914292
3

Czy istnieje sposób na pobranie wyrenderowanej strony z silnika renderującego Internet Explorer i automatyczne wysłanie jej do narzędzia PDF-Printer?

Tak działa ActivePDF , co jest dobre, oznacza, że ​​wiesz, co otrzymasz, i faktycznie ma rozsądną obsługę stylizacji.

Jest to również jeden z niewielu pakietów, które znalazłem (patrząc kilka lat wstecz), który faktycznie obsługuje różne polecenia CSS podziału strony.


Niestety oprogramowanie ActivePDF jest bardzo frustrujące - ponieważ musi uruchamiać przeglądarkę IE w tle w celu konwersji, może działać dość wolno, a także nie jest szczególnie stabilne.

Obecnie w Becie jest nowa wersja, która ma być znacznie lepsza, ale tak naprawdę nie miałem okazji jej wypróbować, więc nie wiem, ile to ulepszeń.

Peter Boughton
źródło
Dzięki za pomocną odpowiedź. Nie sądzę, żeby ActivePDF był naprawdę odpowiedni ze względu na cenę, ale dobrze jest wiedzieć, że coś takiego istnieje.
panschk
GrabzIt's HTML to PDF API: grabz.it/html-to-pdf-image-api.aspx Działa w ten sam sposób, w jaki renderuje HTML w przeglądarce, a następnie tworzy plik PDF, co zapewnia znacznie dokładniejszą konwersję PDF.
user1474090
2

Możesz użyć bezgłowego firefoxa z rozszerzeniem. Bieganie jest dość denerwujące, ale daje dobre wyniki.

Sprawdź tę odpowiedź, aby uzyskać więcej informacji.

rojoca
źródło
Nie brzmi jak bardzo skalowalne rozwiązanie, jeśli trzeba równolegle konwertować strony do formatu PDF. Jeśli przyjdzie kilka żądań skutkujących konwersją przy użyciu FF, serwer straci kilka GIG pamięci tylko po to, aby obsłużyć kilka przekonwertowanych stron. To otworzyłoby twój serwer na DOS.
mP.
Lepiej, ale podobnie: github.com/ariya/phantomjs/wiki/Screen-Capture (zgodnie z we-love-php.blogspot.com/2012/12/ ... plik PDF zawiera prawdziwy tekst, nie rasteryzowany)
nafg
0

Jeśli spojrzysz na boczny pasek swojego pytania, zobaczysz wiele powiązanych pytań ...

W twoim kontekście prostszą metodą może być zainstalowanie sterownika druku PDF, takiego jak PDFCreator, i wydrukowanie strony na tym wyjściu.

PhiLho
źródło
Jak to jest rozwiązanie Java? To jest sterownik druku dla systemu Windows.
Gray
OP wyraźnie wspomniał o systemie Windows. Przypuszczam, że istnieją podobne sterowniki dla innych systemów. OP wspomniał tylko o Javie jako możliwym rozwiązaniu ...
PhiLho
0

Amyuni WebkitPDF może być używany z JNI jako rozwiązanie tylko dla systemu Windows. To jest biblioteka konwersji HTML na PDF / XAML, bezpłatna do użytku komercyjnego i niekomercyjnego.

Jeśli pliki wyjściowe nie są potrzebne od razu, dla lepszej skalowalności może być lepiej mieć kolejkę i kilka procesów w tle, które pobierają stamtąd elementy, konwertują je i przechowują w bazie danych lub systemie plików.

zastosowanie ma zwykłe wyłączenie odpowiedzialności

yms
źródło