สร้างไฟล์ PDF ด้วย JavaScript


268

ฉันพยายามแปลงข้อมูล XML เป็นไฟล์ PDF จากหน้าเว็บและฉันหวังว่าฉันจะทำได้ทั้งหมดภายใน JavaScript ฉันต้องสามารถวาดข้อความรูปภาพและรูปร่างที่เรียบง่าย ฉันชอบที่จะสามารถทำสิ่งนี้ได้อย่างสมบูรณ์ในเบราว์เซอร์

คำตอบ:


446

ฉันเพิ่งเขียนไลบรารีชื่อjsPDFซึ่งสร้าง PDF โดยใช้ Javascript เพียงอย่างเดียว มันยังเด็กมากและฉันจะเพิ่มคุณสมบัติและแก้ไขข้อบกพร่องในไม่ช้า มีแนวคิดเล็กน้อยสำหรับการแก้ไขปัญหาในเบราว์เซอร์ที่ไม่รองรับ Data URIs มันได้รับใบอนุญาตภายใต้ใบอนุญาต MIT เสรี

ฉันเจอคำถามนี้ก่อนที่จะเริ่มเขียนและคิดว่าฉันจะกลับมาและแจ้งให้คุณทราบ :)

สร้าง PDF ใน Javascript

ตัวอย่างสร้างไฟล์ PDF "Hello World"

// Default export is a4 paper, portrait, using milimeters for units
var doc = new jsPDF()

doc.text('Hello world!', 10, 10)
doc.save('a4.pdf')
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.debug.js"></script>


10
ฉันสร้างแรงบันดาลใจให้ jsPDF บางส่วนหรือไม่? ฉันเรียนรู้เกี่ยวกับ jsPDF ในวันที่คุณประกาศ ดูดีมาก ฉันไปกับกุ้งเพราะมันเป็นห้องสมุดสร้าง PDF ที่ดีที่สุดสำหรับความต้องการของฉัน ฉันยังคงรักที่จะทำงานทั้งหมดของฉันในเบราว์เซอร์เนื่องจากฉันไม่ดีฉันจะได้รับ Ruby ในระบบที่ฉันกำลังปรับใช้ ฉันกำลังดู jsPDF อย่างใกล้ชิด ฉันชอบที่จะช่วยเหลือ แต่เวลาของฉันมี จำกัด ที่อาจมีการเปลี่ยนแปลงในอนาคต
amoeba

7
คุณสร้างแรงบันดาลใจให้บ้าง :) ฉันมองไปรอบ ๆ อินเทอร์เน็ตเพื่อดูว่ามันมีอยู่แล้วและเห็นว่าบางคนจะเห็นว่ามีประโยชน์ แจ้งให้เราทราบหากคุณต้องการความช่วยเหลือ ฉัน @MrRio บนทวิตเตอร์
James Hall

23
มันยังมีชีวิตอยู่มาก 0.9.0rc2 เปิดตัวในวันนี้
James Hall

87
@JamesHall ฉันขอขอบคุณสำหรับงานทั้งหมดที่ต้องเขียนนี้และสำหรับ MIT อนุญาตให้โลกนี้เป็นสถานที่ที่ดีขึ้นเมื่อคุณสามารถทำการค้าเพื่อผลประโยชน์ของคุณเอง
Charles Burns

16
ผู้ลงคะแนนเสียงสามารถเสนอแนวคิดหรือวิธีการแก้ปัญหาที่ดีกว่าให้พวกเราได้หรือไม่? นี่คือความพยายามที่ยอดเยี่ยม
Onur Yıldırım

138

อีกห้องสมุดจาวาสคริปต์มูลค่าการกล่าวขวัญpdfmake

การสนับสนุนเบราว์เซอร์ดูเหมือนจะไม่แรงเท่า jsPDF และดูเหมือนจะไม่มีตัวเลือกสำหรับรูปร่าง แต่ตัวเลือกสำหรับการจัดรูปแบบข้อความนั้นสูงกว่าตัวเลือกที่มีอยู่ใน jsPDF ในปัจจุบัน


7
คำตอบนี้ควร upvoted มากขึ้น pdfmake มีประสิทธิภาพมากกว่า jspdf มาก อย่างไรก็ตามเป็นเพียงหมายเหตุด้านข้างมันเป็น wrapper รอบ ๆ PDFKit ไลบรารี่
vittore

2
อีกด้านหนึ่ง, jspdf ไม่มีการสนับสนุน utf-8 และ pdfmake มีการสนับสนุน utf-8 สำหรับฟอนต์เริ่มต้นเท่านั้น
Leo

"pdfmake.min.js - 0.1.22 - 9 ชั่วโมงที่ผ่านมา" มันยังไม่ตายอัพเดทวันนี้
zenbeni

จากการเปรียบเทียบทั้งสองสนามเด็กเล่นกับฉันดูเหมือนว่า jsPDF นั้นมีเป้าหมายมากกว่าที่การสร้าง PDF แบบ "กราฟิก" ในขณะที่ pdfmake นั้นถูกกำหนดเป้าหมายมากขึ้นในการสร้างเอกสาร "ธรรมดา" ที่มีรูปแบบที่ดีดูเหมือนว่าจะมีตัวเลือกมากมาย
cslotty

IE นี้เป็นมิตรหรือไม่
Wildhammer

59

ฉันบำรุงรักษาPDFKitซึ่งเป็นพลังของ pdfmake (ได้กล่าวถึงแล้วที่นี่) มันทำงานได้ทั้งในโหนดและเบราว์เซอร์และสนับสนุนสิ่งต่าง ๆ ที่ห้องสมุดอื่นไม่ทำ:

  • การฝังฟอนต์ที่ถูกฝังไว้ด้วยการสนับสนุนยูนิโค้ด
  • มีสิ่งที่เลย์เอาต์ข้อความขั้นสูงมากมาย (คอลัมน์, การแบ่งหน้า, การแบ่งบรรทัดยูนิโค้ดเต็ม, การจัดรูปแบบข้อความพื้นฐาน ฯลฯ )
  • ทำงานกับสิ่งที่เป็นตัวอักษรมากขึ้นสำหรับการพิมพ์ขั้นสูง (การเชื่อมโยง OpenType / AAT, การทดแทนบริบท ฯลฯ ) เร็ว ๆ นี้: ดูสาขา fontkit หากคุณสนใจ
  • เนื้อหากราฟิกเพิ่มเติม: การไล่ระดับสี ฯลฯ
  • สร้างด้วยเครื่องมือที่ทันสมัยเช่นเบราว์เซอร์และสตรีม ใช้งานได้ทั้งในเบราว์เซอร์และโหนด

ลองดูhttp://pdfkit.org/เพื่อดูบทแนะนำแบบสมบูรณ์เพื่อดูว่า PDFKit ทำอะไรได้บ้าง และสำหรับตัวอย่างของสิ่งที่ชนิดของเอกสารที่สามารถผลิตการตรวจสอบเอกสารเป็น PDF ที่สร้างจากบาง Markdown ไฟล์โดยใช้ PDFKit ตัวเอง: http://pdfkit.org/docs/guide.pdf

นอกจากนี้คุณยังสามารถลองมันออกมาโต้ตอบในเบราว์เซอร์ที่นี่: http://pdfkit.org/demo/browser.html


นี่ไม่ใช่ไลบรารีฝั่งเซิร์ฟเวอร์หรือ ฉันคิดว่าการสนทนาอยู่ในห้องสมุดลูกค้าฝั่ง js
Ash Catchem

10
PDFKit ทำงานได้ทั้ง Node และเบราว์เซอร์ตามที่ระบุไว้ในคำตอบ ดูลิงค์ไปยังตัวอย่างเบราว์เซอร์
devongovett

สิ่งนี้บีบอัดรูปภาพหรือไม่ ฉันกำลังทำงานกับเว็บแอปที่ทำงานคล้ายกับกล้องถ่ายเอกสารและฉันกำลังมองหาการสร้าง PDF ผ่านทางจาวาสคริปต์เพื่อใช้ประโยชน์จากรูปแบบการบีบอัดและหลายหน้า
เทรเวอร์

@devongovett คุณสามารถดูคำถามของฉันเกี่ยวกับห้องสมุดของคุณได้หรือไม่
ninbit

8

อีกโครงการที่น่าสนใจคือtexlive.js

อนุญาตให้คุณคอมไพล์ (La) TeX เป็น PDF ในเบราว์เซอร์


ตัวอย่าง Hello world แสดงผลได้ดี แต่ใช้เวลาประมาณ 30 วินาทีเพื่อทำให้สมบูรณ์
Sam Sippe

2

คุณสามารถใช้บริการฟรีนี้ได้โดยเพิ่มลิงค์ที่สร้าง pdf จาก url ใด ๆ (เช่นhttp://www.phys.org ):

http://freehtmltopdf.com/?convert=http%3A%2F%2Fwww.phys.org&size=US_Letter&orientation=portrait&framesize=800&language=en


1
อัปเดต: เมื่อฉันไปตรวจสอบบริการfreehtmltopdf.comนี้มันบอกว่าไม่สามารถใช้งานได้อีกต่อไป ฟังดูเหมือนมันช่างน่าอัศจรรย์จริงๆ!
Mark Duiker

ตรวจสอบแล้ว - ใช้งานได้ และมันยอดเยี่ยมมากฉันใช้บริการที่ฉันจ่ายสำหรับแต่ละ pdf และต้องใช้รหัสนี่เป็นวิธีแก้ปัญหา
Sergey Sob

-29

แม้ว่าคุณจะสามารถสร้าง PDF ในหน่วยความจำใน JavaScript ได้ แต่คุณก็ยังคงมีปัญหาในการถ่ายโอนข้อมูลนั้นไปยังผู้ใช้ มันยากสำหรับ JavaScript ที่จะเพียงแค่ผลักไฟล์ที่ผู้ใช้

ในการรับไฟล์ให้กับผู้ใช้คุณต้องการให้เซิร์ฟเวอร์ส่งเพื่อรับเบราว์เซอร์เพื่อเปิดกล่องโต้ตอบบันทึก

ด้วยที่กล่าวว่ามันไม่ยากเกินไปที่จะสร้าง PDF แค่อ่านสเป็ค


1
มันไม่ยากเลยตัวอย่างเช่นดูเหมือนว่าจะทำงานกับ Data-URIs en.wikipedia.org/wiki/Data_URI_scheme (ฉันเคยทำมาแล้ว แต่ฉันจำไม่ได้ว่าใช้ Data-URIs)
Björn

58
วันนี้คุณสามารถสร้างไฟล์ใน JavaScript ได้อย่างง่ายดาย (ฉันมาจากอนาคต)
Derek 朕會功夫

5
เป็นเรื่องง่ายมากในปัจจุบัน .. ตรวจสอบตัวอย่างเช่น: github.com/ChenWenBrian/FileSaver.js
roy riojas

9
@FrankKrueger ถ้าคุณลบคำตอบคุณจะได้รับ 6 คะแนน: P
Kamil Kiełczewski

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