การแปลงไฟล์ HTML เป็น PDF [ปิด]


128

ฉันต้องการสร้างไฟล์ PDF โดยอัตโนมัติจากเอกสาร HTML ที่มีอยู่ (X) ไฟล์อินพุต (รายงาน) ใช้เลย์เอาต์แบบตารางที่ค่อนข้างเรียบง่ายดังนั้นจึงไม่จำเป็นต้องมีการรองรับ JavaScript / CSS ที่แปลกใหม่

เนื่องจากฉันคุ้นเคยกับการทำงานใน Java จึงควรใช้โซลูชันที่สามารถใช้ใน java-project ได้อย่างง่ายดาย แม้ว่าจะต้องทำงานบนระบบ windows เท่านั้น

วิธีหนึ่งในการทำที่เป็นไปได้ แต่ไม่ได้ให้ผลลัพธ์ที่มีคุณภาพดี (อย่างน้อยก็ออกจากกล่อง) คือการใช้CSS2XSLFOและ Apache FOP เพื่อสร้างไฟล์ PDF ปัญหาที่ฉันพบคือแม้ว่าแอตทริบิวต์ CSS จะถูกแปลงอย่างสวยงาม แต่เค้าโครงตารางก็ค่อนข้างยุ่งเหยิงโดยมีข้อความไหลออกจากเซลล์ตาราง

ฉันยังได้ดู Jrex ซึ่งเป็น Java-API สำหรับการใช้เอ็นจิ้นการเรนเดอร์ Gecko

อาจมีวิธีดึงหน้าที่แสดงผลจากเอ็นจิ้นการเรนเดอร์ internet explorer แล้วส่งไปยังเครื่องมือ PDF-Printer โดยอัตโนมัติหรือไม่? ฉันไม่มีประสบการณ์ในการเขียนโปรแกรม OLE ใน windows ดังนั้นฉันจึงไม่รู้ว่าอะไรเป็นไปได้และอะไรไม่ได้

คุณมีความคิด?


3
ฉันเพิ่งสร้างdocbagไลบรารี Java ที่สามารถแปลงเอกสาร xhtml เป็น pdf ได้ เวอร์ชันปัจจุบันไม่ใช่อะไรขั้นสูง แต่ถ้าเทมเพลต xhtml ของคุณเรียบง่ายไลบรารีนี้อาจมีประโยชน์
Jakub Torbicki

ฉันคิดว่าวิธีที่จะไปคือการใช้ความสามารถของเบราว์เซอร์เพื่อทำการแปล ดูstackoverflow.com/q/25574082/39998
David Hofmann

ฉันติดอยู่กับการสร้าง pdf จาก html ที่มีตัวอักษรซิริลลิก ทุกอย่างเรียบร้อยดียกเว้นตัวอักษรซีริลลิกที่ละไว้ ใครที่มีปัญหาแบบนี้?
Kristijan Iliev

@krisiliev: ฉันมีปัญหาที่คล้ายกันและเท่าที่ฉันจำได้ฟอนต์ที่ใช้มีความสำคัญมาก แบบอักษรส่วนใหญ่ไม่รองรับอักขระ UTF8 ที่สมบูรณ์ แต่สิ่งต่อไปนี้ควร: 'font-family: Arial Unicode MS;' (CSS) ตรวจสอบให้แน่ใจว่าใช้การเข้ารหัสที่ถูกต้อง (ฉันขอแนะนำให้ใช้ UTF-8 เสมอ)
panschk

2
ลิงก์นี้ช่วยให้ฉัน hmkcode.com/itext-html-to-pdf-using-java
Mateen

คำตอบ:


73

จานบินโครงการ renderer XHTML มีการสนับสนุนการแสดงผล XHTML เป็น PDF มีลักษณะที่ตัวอย่างของการที่นี่


20
ปัญหาที่แท้จริงของการบิน sauser คือมันใช้ itext ในการแสดง PDF ซึ่งเป็น lib ที่ได้รับอนุญาต AGPL v3
David Hofmann

11
เวอร์ชันของ itext ที่ใช้โดย Flying Saucer คือ 2.0.8 ซึ่งมีอยู่ใน LGPL เฉพาะเวอร์ชันหมายเลข 5 ขึ้นไปเท่านั้นที่อยู่ในสิทธิ์การใช้งานที่เข้มงวดยิ่งขึ้น stackoverflow.com/questions/2692000/…
Gary

8
ฉันจะบอกว่าปัญหาที่แท้จริงของ Flying Saucer คือต้องใช้เอกสาร XML ที่มีรูปแบบและถูกต้อง เป็นเรื่องง่ายที่จะทำลายการแสดงผล PDF โดยไม่เจตนาโดยรวมบางอย่างเช่นเครื่องหมายและใน HTML ของคุณหรือโค้ดจาวาสคริปต์ที่ทำให้ HTML ที่แสดงผลของคุณไม่เข้มงวด XHTML แม้ว่าจะสามารถบรรเทาได้ด้วยการทดสอบอัตโนมัติหรือกระบวนการบางอย่างที่เกี่ยวข้องกับการตรวจสอบ XML
SteveT

3
@LateralFractal เท่าที่ฉันบอกได้ Flying Saucer 9.0.8 (ฉันคิดว่าเวอร์ชันล่าสุด) ใช้ iText 2.1.7 ซึ่งเป็น iText เวอร์ชันสุดท้ายที่มีใบอนุญาตที่อนุญาต - LGPL mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf/…
Jonathan Crosmer

2
@JonathanCrosmer เย้ มีแพ็คเกจ FlyingSaucer สองแพ็คเกจสำหรับ PDF หนึ่งแพ็คเกจสำหรับ iText v2 และอีกหนึ่งแพ็คเกจสำหรับ iText v5 สมมติว่าทั้งสองมีฟังก์ชันการทำงานที่เท่าเทียมกัน ความเสี่ยง AGPL สามารถก้าวไปข้างหน้าได้
LateralFractal

49

คุณลองWKHTMLTOPDFหรือไม่?

มันเป็นยูทิลิตี้เชลล์ธรรมดาซึ่งเป็นการนำโอเพ่นซอร์สของ WebKit มาใช้ ทั้งสองแบบฟรี

เราได้กำหนดบทแนะนำเล็ก ๆ ไว้ที่นี่

แก้ไข (2017):

ถ้าจะสร้างบางสิ่งในวันนี้ฉันจะไม่ไปเส้นทางนั้นอีกต่อไป
แต่จะใช้http://pdfkit.org/แทน
อาจเป็นการลอกการอ้างอิง nodejs ทั้งหมดเพื่อเรียกใช้ในเบราว์เซอร์


16
สำหรับการแปลง html-page-to-pdf แบบตรงสิ่งนี้ดีกว่าสิ่งอื่นใดที่ฉันเคยเห็นฟรีหรือเชิงพาณิชย์
MGOwen

มันทำงานบน Mac OS ที่ไม่ใช่?
Eran Medan

1
@ เอรันเราใช้บนลินุกซ์ ฉันคิดว่ามีเวอร์ชั่น windows ด้วย
Mic

1
@Mic ใช่มีเวอร์ชั่น Windows ด้วย
Viccari

ทดสอบบน windows XP (เวอร์ชัน 0.9.9) และทำงานได้ดีมาก นอกจากนี้ไม่ต้องการสิทธิ์ผู้ดูแลระบบในเครื่องเพื่อติดตั้ง
Christopher Mahan

44

ตรวจสอบiText ; เป็นชุดเครื่องมือ Java PDF บริสุทธิ์ซึ่งรองรับการอ่านข้อมูลจาก HTML ฉันเพิ่งใช้มันในโปรเจ็กต์เมื่อฉันต้องการดึงเนื้อหาจาก CMS ของเราและส่งออกเป็นไฟล์ PDF และมันก็ค่อนข้างตรงไปตรงมา การรองรับ CSS และแท็กสไตล์ค่อนข้าง จำกัด แต่มันแสดงผลตารางได้โดยไม่มีปัญหาใด ๆ (ฉันไม่เคยจัดการเพื่อตั้งค่าความกว้างของคอลัมน์เลย)

การสร้าง PDF จาก HTML จะมีลักษณะดังนี้:

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
เป็น AGPL ดูเหมือนแย่กว่า GPL คุณต้องเป็นโอเพ่นซอร์สแม้ว่าคุณจะให้บริการ PDF และ iText เป็นฝั่งเซิร์ฟเวอร์ก็ตาม
Eran Medan

10
@Eran เพียงใช้เวอร์ชันสุดท้ายที่ไม่ใช่ AGPL (com.lowagie: itext: 2.1.7 ใน Maven)
Nowaker

1
HTMLWorker เลิกใช้งานในเวอร์ชันใหม่ของ IText เพื่อสนับสนุน XMLWorker อย่างไรก็ตามการสนับสนุน CSS ไม่ดีในทั้งสองกรณี (ดูdemo.itextsupport.com/xmlworker/itextdoc/… ) และไม่เพียงพอสำหรับความต้องการของฉัน ในทางตรงกันข้าม Flying Saucer นั้นสมบูรณ์แบบ
Pino

คุณสามารถใช้เวอร์ชัน LGPL ได้ที่github.com/albfernandez/itext2
Vladimir Rozhkov

4

หากคุณมีเงินทุนไม่มีอะไรที่จะเอาชนะPrince XML ได้ตามที่วิดีโอนี้แสดง


1
หากคุณกำลังมองหาทางเลือกที่ถูกกว่าสำหรับ Prince ลอง DocRaptor.com มันใช้ Prince เป็นเครื่องยนต์
Julie

และถ้าคุณต้องการราคาถูกกว่า แต่มีตัวเลือกมากขึ้นลองhtm2pdf.co.ukซึ่งใช้ webkit และผู้ใช้ WYSIWIG จริง
user1914292

3

อาจมีวิธีดึงหน้าที่แสดงผลจากเอ็นจิ้นการเรนเดอร์ internet explorer แล้วส่งไปยังเครื่องมือ PDF-Printer โดยอัตโนมัติหรือไม่?

นี่คือวิธีการทำงานของActivePDFซึ่งเป็นวิธีที่ดีหมายความว่าคุณรู้ว่าคุณจะได้อะไรและมีการสนับสนุนรูปแบบที่สมเหตุสมผล

นอกจากนี้ยังเป็นหนึ่งในไม่กี่แพ็คเกจที่ฉันพบ (เมื่อมองย้อนกลับไปไม่กี่ปี) ที่รองรับคำสั่ง CSS แบบแบ่งหน้าต่างๆ


น่าเสียดายที่ซอฟต์แวร์ ActivePDF นั้นน่าหงุดหงิดมากเนื่องจากต้องเปิดเบราว์เซอร์ IE ในพื้นหลังสำหรับการแปลงอาจค่อนข้างช้าและก็ไม่เสถียรโดยเฉพาะ

ขณะนี้มีเวอร์ชันใหม่อยู่ในเบต้าซึ่งควรจะดีกว่านี้มาก แต่ฉันไม่ได้มีโอกาสทดลองใช้จริงจึงไม่รู้ว่าจะมีการปรับปรุงมากน้อยเพียงใด


ขอบคุณสำหรับคำตอบที่เป็นประโยชน์ ฉันไม่คิดว่า ActivePDF เหมาะสมจริงๆเพราะราคา แต่มันก็ดีที่ได้รู้ว่ามีอยู่บ้าง
panschk

GrabzIt ของ HTML เป็น PDF API: grabz.it/html-to-pdf-image-api.aspxทำงานในลักษณะเดียวกับที่แสดง HTML ในเบราว์เซอร์จากนั้นสร้าง PDF เพื่อให้แน่ใจว่ามีการแปลง PDF ที่ถูกต้องมากขึ้น
user1474090

2

คุณสามารถใช้ Firefox ที่ไม่มีหัวกับส่วนขยาย มันค่อนข้างน่ารำคาญในการวิ่ง แต่มันให้ผลลัพธ์ที่ดี

ตรวจสอบคำตอบนี้สำหรับข้อมูลเพิ่มเติม


ฟังดูไม่เหมือนโซลูชันที่ปรับขนาดได้มากหากต้องการแปลงหน้าเว็บเป็น pdf แบบขนาน หากมีคำขอสองสามรายการผ่านมาซึ่งทำให้เกิดการแปลงโดยใช้ FF เซิร์ฟเวอร์ของคุณจะสูญเสียหน่วยความจำ GIG ไปเพียงไม่กี่หน้าเพื่อให้บริการหน้าที่แปลงไม่กี่หน้า สิ่งนี้จะเปิดเซิร์ฟเวอร์ของคุณไปยัง DOS
mP.

ดีกว่า แต่คล้ายกัน: github.com/ariya/phantomjs/wiki/Screen-Capture (อ้างอิงจากwe-love-php.blogspot.com/2012/12/… pdf มีข้อความจริงไม่แรสเตอร์)
nafg

0

หากคุณดูที่แถบด้านข้างของคำถามคุณจะเห็นคำถามที่เกี่ยวข้องมากมาย ...

ในบริบทของคุณวิธีที่ง่ายกว่าคือการติดตั้งไดรเวอร์การพิมพ์ PDF เช่นPDFCreatorและพิมพ์หน้าไปยังผลลัพธ์นี้


วิธีนี้เป็นโซลูชัน Java? นี่คือไดรเวอร์การพิมพ์ของ Windows
สีเทา

OP กล่าวถึง Windows อย่างชัดเจน และฉันคิดว่ามีไดรเวอร์ที่คล้ายกันสำหรับระบบอื่น ๆ OP กล่าวเฉพาะ Java เป็นวิธีแก้ปัญหาที่เป็นไปได้ ...
PhiLho

0

Amyuni WebkitPDFสามารถใช้กับ JNI สำหรับโซลูชัน Windows เท่านั้น นี่คือไลบรารีการแปลง HTML เป็น PDF / XAML ฟรีสำหรับการใช้งานเชิงพาณิชย์และไม่ใช่เชิงพาณิชย์

หากไม่จำเป็นต้องใช้ไฟล์เอาต์พุตในทันทีเพื่อความสามารถในการปรับขนาดที่ดีขึ้นอาจเป็นการดีกว่าที่จะมีคิวและกระบวนการพื้นหลังสองสามรายการจากที่นั่นแปลงและจัดเก็บไว้ในฐานข้อมูลหรือระบบไฟล์

ใช้ข้อจำกัดความรับผิดชอบตามปกติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.