Chuyển đổi tập tin HTML sang PDF [đã đóng]


128

Tôi cần tự động tạo tệp PDF từ tài liệu HTML (X) hiện tại. Các tệp đầu vào (báo cáo) sử dụng bố cục dựa trên bảng khá đơn giản, do đó có thể không cần hỗ trợ cho các công cụ JavaScript / CSS thực sự ưa thích.

Như tôi đã từng làm việc trong Java, một giải pháp có thể dễ dàng được sử dụng trong dự án java là thích hợp hơn. Nó chỉ cần làm việc trên các hệ thống cửa sổ, mặc dù.

Một cách để làm điều đó là khả thi, nhưng không tạo ra chất lượng đầu ra tốt (ít nhất là ngoài hộp) là sử dụng CSS2XSLFO và Apache FOP để tạo các tệp PDF. Vấn đề tôi gặp phải là trong khi các thuộc tính CSS được chuyển đổi độc đáo, bố cục bảng khá lộn xộn, với văn bản chảy ra khỏi ô của bảng.

Tôi cũng đã xem nhanh Jrex, một API Java để sử dụng công cụ kết xuất Gecko.

Có lẽ có một cách để lấy trang được kết xuất từ ​​công cụ kết xuất trình duyệt internet explorer và tự động gửi nó đến một công cụ Máy in PDF? Tôi không có kinh nghiệm về lập trình OLE trong windows, vì vậy tôi không biết cái gì có thể và cái gì không.

Bạn có một ý tưởng?


3
Gần đây tôi đã tạo một docbag thư viện Java có thể chuyển đổi xhtml sang tài liệu pdf. Phiên bản hiện tại không có gì cao cấp, nhưng nếu các mẫu xhtml của bạn đơn giản thì thư viện này có thể trở nên tiện dụng.
Jakub Torbicki

Tôi nghĩ rằng cách để đi là sử dụng các khả năng của trình duyệt để thực hiện dịch. Xem stackoverflow.com/q/25574082/39998
David Hofmann

Tôi bị mắc kẹt với việc tạo pdf từ một html chứa các chữ cái Cyrillic. Mọi thứ đều ổn trừ những chữ cái Cyrillic bị bỏ qua. Bất cứ ai có vấn đề này?
Kristijan Iliev

@krisiliev: Tôi có vấn đề tương tự, và theo như tôi có thể nhớ, phông chữ được sử dụng là rất quan trọng. Hầu hết các phông chữ không hỗ trợ các ký tự UTF8 hoàn chỉnh, nhưng những điều sau đây nên: 'font-family: Arial Unicode MS;' (CSS). Ngoài ra, hãy đảm bảo sử dụng mã hóa chính xác (tôi sẽ khuyên bạn luôn sử dụng UTF-8)
panschk

2
liên kết này đã giúp tôi hmkcode.com/itext-html-to-pdf-USE-java
Mateen

Câu trả lời:


73

Các Flying Saucer dự án renderer XHTML có hỗ trợ cho outputting XHTML sang PDF. Hãy xem một ví dụ ở đây .


20
Vấn đề thực sự với xúc xích bay là nó sử dụng itext để kết xuất PDF, đây là một lib được cấp phép AGPL v3
David Hofmann

11
Phiên bản itext được sử dụng bởi Flying Saucer là 2.0.8, có sẵn trong LGPL. Chỉ các phiên bản số 5 trở lên là trên giấy phép hạn chế hơn. stackoverflow.com/questions/2692000/ trộm
Gary

8
Tôi muốn nói rằng vấn đề thực sự với Flying Saucer là nó đòi hỏi phải có một tài liệu XML hợp lệ và hợp lệ. Thật dễ dàng để vô tình phá vỡ kết xuất PDF bằng cách bao gồm một cái gì đó như dấu và trong HTML của bạn hoặc một số mã javascript làm cho HTML kết xuất của bạn không nghiêm ngặt XHTML. Mặc dù điều này có thể được giảm thiểu bằng các thử nghiệm tự động hoặc một số quy trình liên quan đến xác thực XML.
SteveT

3
@LomainFractal Theo như tôi có thể nói, Flying Saucer 9.0.8 (phiên bản mới nhất, tôi nghĩ) sử dụng iText 2.1.7, đây là phiên bản iText cuối cùng có giấy phép cho phép --- LGPL. mvnreposective.com/artifact/org.xhtmlrenderer/fending-saucer-pdf/ mẹo
Jonathan Crosmer

2
@JonathanCrosmer Vâng. Có hai gói FlyingSaucer cho PDF, một cho iText v2 và một cho iText v5. Giả sử cả hai có chức năng như nhau; rủi ro AGPL có thể được bước bên.
LateralFractal

49

Bạn đã thử WKHTMLTOPDF ?

Đây là một tiện ích shell đơn giản, một triển khai WebKit mã nguồn mở. Cả hai đều miễn phí.

Chúng tôi đã thiết lập một hướng dẫn nhỏ ở đây

EDIT (2017):

Nếu hôm nay là để xây dựng một cái gì đó, tôi sẽ không đi con đường đó nữa.
Nhưng sẽ sử dụng http://pdfkit.org/ thay thế.
Có lẽ tước bỏ tất cả các phụ thuộc nodejs của nó, để chạy trong trình duyệt.


16
Đối với chuyển đổi html-page-to-pdf thẳng, điều này tốt hơn bất kỳ thứ gì tôi đã thấy, miễn phí hoặc thương mại.
MGOwen

Nó có hoạt động trên hệ điều hành Mac không?
Eran Medan

1
@Eran, chúng tôi sử dụng nó trên linux. Tôi nghĩ cũng có phiên bản windows
Mic

1
@Mic Vâng, cũng có phiên bản Windows.
Viccari

đã thử nghiệm trên windows XP (phiên bản 0.9.9) và hoạt động rất tốt. Ngoài ra, không yêu cầu quyền quản trị trên máy để cài đặt.
Christopher Mahan

44

Kiểm tra iText ; nó là một bộ công cụ Java PDF thuần túy có hỗ trợ đọc dữ liệu từ HTML. Tôi đã sử dụng nó gần đây trong một dự án khi tôi cần lấy nội dung từ CMS của chúng tôi và xuất dưới dạng tệp PDF và tất cả đều khá đơn giản. Sự hỗ trợ cho các thẻ CSS và kiểu khá hạn chế, nhưng nó làm cho các bảng không gặp vấn đề gì (tôi chưa bao giờ quản lý để đặt chiều rộng cột).

Tạo một tệp PDF từ HTML sẽ giống như thế này:

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
Đó là AGPL, dường như còn tồi tệ hơn GPL, bạn cần phải là nguồn mở ngay cả khi bạn chỉ phục vụ PDF và iText là phía máy chủ.
Eran Medan

10
@Eran, Chỉ cần sử dụng phiên bản không AGPL cuối cùng (com.lowagie: itext: 2.1.7 trong Maven).
Nowaker

1
HTMLWorker không được dùng trong các phiên bản IText mới hơn để ủng hộ XMLWorker; tuy nhiên hỗ trợ CSS kém trong cả hai trường hợp (xem demo.itextsupport.com/xmlworker/itextdoc/ mẹo ) và không phù hợp với nhu cầu của tôi. Trái lại Flying Saucer là hoàn hảo.
Pino

Bạn có thể sử dụng phiên bản LGPL có thể được tìm thấy tại github.com/albfernandez/itext2
Vladimir Rozhkov


3

Có lẽ có một cách để lấy trang được kết xuất từ ​​công cụ kết xuất trình duyệt internet explorer và tự động gửi nó đến một công cụ Máy in PDF?

Đây là cách ActivePDF hoạt động, điều này có nghĩa là bạn biết những gì bạn sẽ nhận được và nó thực sự có hỗ trợ kiểu dáng hợp lý.

Nó cũng là một trong số ít các gói tôi tìm thấy (khi nhìn lại vài năm trước) thực sự hỗ trợ các lệnh CSS ngắt trang khác nhau.


Thật không may, phần mềm ActivePDF rất bực bội - vì nó phải khởi chạy trình duyệt IE trong nền để chuyển đổi nên nó có thể khá chậm và cũng không đặc biệt ổn định.

Có một phiên bản mới hiện đang ở bản Beta được cho là tốt hơn nhiều, nhưng tôi thực sự chưa có cơ hội dùng thử, vì vậy không biết nó cải thiện bao nhiêu.


Cảm ơn câu trả lời hữu ích. Tôi không nghĩ ActivePDF thực sự phù hợp vì giá cả, nhưng thật tốt khi biết một cái gì đó như thế tồn tại.
panschk

API HTML sang PDF của GrabzIt : Grabz.it/html-to-pdf-image-api.aspx Hoạt động giống như cách hiển thị HTML trong trình duyệt và sau đó tạo tệp PDF này đảm bảo rằng có chuyển đổi PDF chính xác hơn nhiều.
dùng1474090

2

Bạn có thể sử dụng một firefox không đầu với một phần mở rộng. Nó khá khó chịu khi chạy nhưng nó mang lại kết quả tốt.

Kiểm tra câu trả lời này để biết thêm.


Nghe có vẻ không phải là một giải pháp rất có thể mở rộng nếu người ta cần chuyển đổi các trang đang hoạt động sang pdf song song. Nếu một vài yêu cầu xuất hiện dẫn đến việc chuyển đổi bằng FF, máy chủ của bạn sẽ bị mất một vài bộ nhớ chỉ để phục vụ một vài trang được chuyển đổi. Điều này sẽ mở máy chủ của bạn đến một DOS.
mP.

Tốt hơn nhưng tương tự: github.com/ariya/phantomjs/wiki/Screen-Capture (theo we-love-php.blogspot.com/2012/12/... pdf đã văn bản thực tế, không rasterized)
nafg

0

Nếu bạn nhìn vào thanh bên của câu hỏi, bạn sẽ thấy nhiều câu hỏi liên quan ...

Trong ngữ cảnh của bạn, phương pháp đơn giản hơn có thể là cài đặt trình điều khiển in PDF như PDFCreator và chỉ cần in trang tới đầu ra này.


Làm thế nào đây là một giải pháp Java? Đây là một trình điều khiển in windows.
Xám

OP đề cập rõ ràng đến Windows. Và tôi cho rằng có các trình điều khiển tương tự cho các hệ thống khác. OP chỉ đề cập đến Java như một giải pháp khả thi ...
PhiLho

0

Amyuni WebkitPDF có thể được sử dụng với JNI cho một giải pháp chỉ dành cho Windows. Đây là thư viện chuyển đổi HTML sang PDF / XAML, miễn phí cho sử dụng thương mại và phi thương mại.

Nếu các tệp đầu ra không cần thiết ngay lập tức, để có khả năng mở rộng tốt hơn, có thể tốt hơn là có một hàng đợi và một vài quy trình nền lấy các mục từ đó, chuyển đổi chúng và lưu trữ sau đó trên cơ sở dữ liệu hoặc hệ thống tệp.

từ chối trách nhiệm thông thường

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.