การแปลงไฟล์ 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.