Mengonversi file HTML ke PDF [ditutup]


128

Saya perlu membuat file PDF secara otomatis dari dokumen HTML (X) yang ada. File input (laporan) menggunakan tata letak berbasis tabel yang agak sederhana, jadi dukungan untuk hal-hal JavaScript / CSS yang sangat bagus mungkin tidak diperlukan.

Karena saya terbiasa bekerja di Jawa, solusi yang dapat dengan mudah digunakan dalam proyek-java lebih disukai. Hanya perlu bekerja pada sistem windows.

Salah satu cara untuk melakukannya adalah layak, tetapi tidak menghasilkan output berkualitas baik (setidaknya di luar kotak) adalah menggunakan CSS2XSLFO , dan Apache FOP untuk membuat file PDF. Masalah yang saya temui adalah bahwa sementara atribut CSS dikonversi dengan baik, tata letak tabel cukup kacau, dengan teks yang mengalir keluar dari sel tabel.

Saya juga melihat Jrex, Java-API untuk menggunakan mesin rendering Gecko.

Apakah mungkin ada cara untuk mengambil halaman yang dirender dari mesin rendering penjelajah internet dan mengirimkannya ke alat PDF-Printer secara otomatis? Saya tidak punya pengalaman dalam pemrograman OLE di windows, jadi saya tidak tahu apa yang mungkin dan apa yang tidak.

Anda punya ide?


3
Saya baru saja membuat sebuah perpustakaan Java docbag yang dapat mengkonversi xhtml ke dokumen pdf. Versi saat ini bukanlah sesuatu yang canggih, tetapi jika template xhtml Anda sederhana, perpustakaan ini mungkin berguna.
Jakub Torbicki

Saya pikir cara untuk pergi adalah dengan menggunakan kemampuan browser untuk melakukan terjemahan. Lihat stackoverflow.com/q/25574082/39998
David Hofmann

Saya terjebak dengan menghasilkan pdf dari html yang berisi huruf Cyrillic. Semuanya baik-baik saja kecuali huruf Cyrillic yang dihilangkan. Adakah yang punya masalah seperti ini?
Kristijan Iliev

@ Krisrisiev: Saya memiliki masalah serupa, dan sejauh yang saya ingat, font yang digunakan sangat penting. Sebagian besar font tidak mendukung karakter UTF8 yang lengkap, tetapi yang berikut harus: 'font-family: Arial Unicode MS;' (CSS). Juga pastikan untuk menggunakan pengkodean yang benar (saya akan menyarankan untuk selalu menggunakan UTF-8)
panschk

Jawaban:


73

The Flying Saucer XHTML proyek penyaji memiliki dukungan untuk keluaran XHTML ke PDF. Lihat contoh di sini .


20
Masalah sebenarnya dengan sauser terbang adalah ia menggunakan itext untuk membuat PDF, yang merupakan lib berlisensi AGPL v3
David Hofmann

11
Versi itext yang digunakan oleh Flying Saucer adalah 2.0.8 yang tersedia di bawah LGPL. Hanya versi nomor 5 atau di atas yang memiliki lisensi lebih ketat. stackoverflow.com/questions/2692000/…
Gary

8
Saya akan mengatakan masalah sebenarnya dengan Piring Terbang adalah bahwa ia membutuhkan dokumen XML yang baik dan valid. Sangat mudah untuk tanpa disadari merusak rendering PDF dengan memasukkan sesuatu seperti ampersand dalam HTML Anda, atau beberapa kode javascript yang membuat HTML yang Anda render tidak XHTML yang ketat. Meskipun ini dapat dikurangi dengan tes otomatis atau beberapa proses yang melibatkan validasi XML.
SteveT

3
@LateralFractal Sejauh yang saya tahu, Flying Saucer 9.0.8 (versi terbaru, saya pikir) menggunakan iText 2.1.7, yang merupakan versi iText terakhir dengan lisensi permisif --- LGPL. mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf/…
Jonathan Crosmer

2
@ JonathanCrosmer Ya. Ada dua paket FlyingSaucer untuk PDF, satu untuk iText v2 dan satu untuk iText v5. Dengan asumsi keduanya memiliki fungsi yang sama; risiko AGPL dapat dipihak.
LateralFractal

49

Apakah Anda mencoba WKHTMLTOPDF ?

Ini adalah utilitas shell sederhana, implementasi open source dari WebKit. Keduanya gratis.

Kami telah menetapkan tutorial kecil di sini

EDIT (2017):

Jika itu untuk membangun sesuatu hari ini, saya tidak akan pergi ke rute itu lagi.
Tetapi akan menggunakan http://pdfkit.org/ sebagai gantinya.
Mungkin menghapus semua dependensi nodejs-nya, untuk berjalan di browser.


16
Untuk konversi html-halaman-ke-pdf langsung, ini lebih baik daripada apa pun yang saya lihat, gratis atau komersial.
MGOwen

Apakah ini berfungsi pada non Mac OS?
Eran Medan

1
@Ran, kami menggunakannya di linux. Saya pikir ada versi windows juga
Mic

1
@Mic Ya, ada versi Windows juga.
Viccari

diuji pada windows XP (versi 0.9.9) dan bekerja dengan sangat baik. Juga, tidak memerlukan hak admin pada mesin untuk menginstal.
Christopher Mahan

44

Lihat itext ; itu adalah Java PDF toolkit murni yang memiliki dukungan untuk membaca data dari HTML. Saya menggunakannya baru-baru ini dalam sebuah proyek ketika saya perlu menarik konten dari CMS kami dan mengekspor sebagai file PDF, dan itu semua cukup mudah. Dukungan untuk CSS dan tag gaya sangat terbatas, tetapi membuat tabel tanpa masalah (saya tidak pernah berhasil mengatur lebar kolom).

Membuat PDF dari HTML berlangsung seperti ini:

Document doc = new Document(PageSize.A4);
PdfWriter.getInstance(doc, out);
doc.open();
HTMLWorker hw = new HTMLWorker(doc);
hw.parse(new StringReader(html));
doc.close();

9
Ini AGPL, tampaknya bahkan lebih buruk daripada GPL, Anda harus open source bahkan jika Anda hanya melayani PDF dan iText adalah sisi server.
Eran Medan

10
@ Eran, Cukup gunakan versi non-AGPL terakhir (com.lowagie: itext: 2.1.7 di Maven).
Sekarang,

1
HTMLWorker tidak digunakan lagi dalam versi IText yang lebih baru demi XMLWorker; namun dukungan CSS buruk di kedua kasus (lihat demo.itextsupport.com/xmlworker/itextdoc/… ) dan tidak memadai untuk kebutuhan saya. Sebaliknya piring terbang itu sempurna.
Pino

Anda dapat menggunakan versi LGPL yang dapat ditemukan di github.com/albfernandez/itext2
Vladimir Rozhkov


3

Apakah mungkin ada cara untuk mengambil halaman yang dirender dari mesin rendering penjelajah internet dan mengirimkannya ke alat PDF-Printer secara otomatis?

Ini adalah cara ActivePDF bekerja, yang bagus berarti Anda tahu apa yang akan Anda dapatkan, dan itu sebenarnya memiliki dukungan gaya yang wajar.

Ini juga salah satu dari beberapa paket yang saya temukan (ketika mencari beberapa tahun yang lalu) yang sebenarnya mendukung berbagai perintah CSS page-break.


Sayangnya, perangkat lunak ActivePDF sangat membuat frustrasi - karena harus meluncurkan browser IE di latar belakang untuk konversi itu bisa sangat lambat, dan itu tidak terlalu stabil juga.

Ada versi baru saat ini dalam Beta yang seharusnya jauh lebih baik, tetapi saya belum benar-benar memiliki kesempatan untuk mencobanya, jadi tidak tahu berapa banyak peningkatan itu.


Terima kasih atas jawabannya. Saya tidak berpikir ActivePDF benar-benar cocok karena harganya, tetapi ada baiknya mengetahui sesuatu seperti itu ada.
panschk

API HTML ke PDF GrabzIt : grabz.it/html-to-pdf-image-api.aspx Bekerja dengan cara yang sama seperti renders HTML di browser dan kemudian membuat PDF ini memastikan bahwa ada konversi PDF yang jauh lebih akurat.
user1474090

2

Anda dapat menggunakan firefox tanpa kepala dengan ekstensi. Sangat menjengkelkan untuk menjalankannya tetapi menghasilkan hasil yang baik.

Lihatlah jawaban ini untuk info lebih lanjut.


Tidak terdengar seperti solusi yang sangat scalable jika seseorang perlu mengkonversi halaman dengan cepat ke pdf secara paralel. Jika beberapa permintaan datang melalui yang menghasilkan konversi menggunakan FF server Anda akan kehilangan beberapa GIG memori hanya untuk melayani beberapa halaman yang dikonversi. Ini akan membuka server Anda ke DOS.
mP.

Lebih baik tetapi serupa: github.com/ariya/phantomjs/wiki/Screen-Capture (menurut we-love-php.blogspot.com/2012/12/… pdf memiliki teks asli, bukan raster)
nafg

0

Jika Anda melihat bilah samping dari pertanyaan Anda, Anda akan melihat banyak pertanyaan terkait ...

Dalam konteks Anda, metode yang lebih sederhana mungkin dengan menginstal driver cetak PDF seperti PDFCreator dan cukup cetak halaman untuk output ini.


Bagaimana ini solusi Java? Ini adalah driver cetak windows.
Gray

OP secara eksplisit menyebut Windows. Dan saya kira ada driver serupa untuk sistem lain. OP hanya menyebut Jawa sebagai solusi yang memungkinkan ...
PhiLho

0

Amyuni WebkitPDF dapat digunakan dengan JNI untuk solusi khusus Windows. Ini adalah perpustakaan konversi HTML ke PDF / XAML, gratis untuk penggunaan komersial dan non-komersial.

Jika file output tidak diperlukan segera, untuk skalabilitas yang lebih baik mungkin lebih baik untuk memiliki antrian dan beberapa proses latar belakang mengambil item dari sana, mengonversinya dan menyimpannya kemudian pada database atau sistem file.

disclaimer biasa berlaku

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.