ดาวน์โหลด div ในหน้า HTML เป็น pdf โดยใช้ javascript


92

ฉันมี div เนื้อหาที่มี id เป็น "content" ในเนื้อหา div ฉันมีกราฟและตารางบางส่วน ฉันต้องการดาวน์โหลด div นั้นเป็น pdf เมื่อผู้ใช้คลิกที่ปุ่มดาวน์โหลด มีวิธีทำโดยใช้ javascript หรือ jQuery หรือไม่?


1
code.google.com/p/jspdfเป็นห้องสมุดที่ดีที่สุดที่ฉันรู้ซึ่งสามารถทำได้
AlvinArulselvan

ฉันจะใช้ jsPDF เพื่อดาวน์โหลดเนื้อหาใน div เฉพาะได้อย่างไร จากสิ่งที่ฉันเห็นในตัวอย่างในไซต์ของพวกเขามันไม่สามารถทำได้
Midhun Mathew

คำตอบ:


112

คุณสามารถทำได้โดยใช้jsPDF

HTML:

<div id="content">
     <h3>Hello, this is a H3 tag</h3>

    <p>A paragraph</p>
</div>
<div id="editor"></div>
<button id="cmd">generate PDF</button>

JavaScript:

var doc = new jsPDF();
var specialElementHandlers = {
    '#editor': function (element, renderer) {
        return true;
    }
};

$('#cmd').click(function () {
    doc.fromHTML($('#content').html(), 15, 15, {
        'width': 170,
            'elementHandlers': specialElementHandlers
    });
    doc.save('sample-file.pdf');
});

26
ฉันมีปัญหาที่นี่ css ที่ฉันได้เพิ่มไว้ที่นี่ไม่ได้ถูกนำไปใช้ในไฟล์ pdf ฉันก็มีกราฟด้วยเช่นกัน .. ซึ่ง r ไม่ได้มาใน pdf ฉันควรทำอย่างไรเพื่อรับสิ่งเหล่านี้
Midhun Mathew

15
jsPDF ไม่ได้จัดรูปแบบตารางอย่างถูกต้องเช่นกันมันแค่ตีความ td / th เป็น display: block;
Dave

2
การใช้โค้ดด้านบนเราสามารถสร้าง pdf ได้เพียงครั้งเดียว แต่เป็นครั้งที่สองมันไม่ทำงาน เพื่อให้มันใช้งานได้ตรวจสอบคำตอบนี้โดย @ kristof-feys เราจำเป็นต้องประกาศdocตัวแปรภายในฟังก์ชันคลิก
Mahendran Sakkarai

4
นี่เป็นสิ่งที่ดี แต่น่าเสียดายที่ css ไม่ได้รับการแสดงผล: /
Nicholas

1
ฉันประสบกับปัญหาการเข้ารหัส
ema

20

เนื้อหาภายใน<div class='html-content'>....</div>สามารถดาวน์โหลดเป็น pdf ที่มีรูปแบบการใช้jspdf & html2canvas

คุณต้องอ้างถึงไลบรารี js ทั้งสอง

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
<script type="text/javascript" src="https://html2canvas.hertzen.com/dist/html2canvas.js"></script>

จากนั้นเรียกใช้ฟังก์ชันด้านล่าง

//Create PDf from HTML...
function CreatePDFfromHTML() {
    var HTML_Width = $(".html-content").width();
    var HTML_Height = $(".html-content").height();
    var top_left_margin = 15;
    var PDF_Width = HTML_Width + (top_left_margin * 2);
    var PDF_Height = (PDF_Width * 1.5) + (top_left_margin * 2);
    var canvas_image_width = HTML_Width;
    var canvas_image_height = HTML_Height;

    var totalPDFPages = Math.ceil(HTML_Height / PDF_Height) - 1;

    html2canvas($(".html-content")[0]).then(function (canvas) {
        var imgData = canvas.toDataURL("image/jpeg", 1.0);
        var pdf = new jsPDF('p', 'pt', [PDF_Width, PDF_Height]);
        pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin, canvas_image_width, canvas_image_height);
        for (var i = 1; i <= totalPDFPages; i++) { 
            pdf.addPage(PDF_Width, PDF_Height);
            pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height*i)+(top_left_margin*4),canvas_image_width,canvas_image_height);
        }
        pdf.save("Your_PDF_Name.pdf");
        $(".html-content").hide();
    });
}

Ref: รูปแบบไฟล์ PDF genration จาก HTML ผ้าใบและ jspdf

อาจเป็นสิ่งนี้จะช่วยใครบางคน


4
สิ่งนี้ได้ผลดีสำหรับฉันขอบคุณ มันคงรูปแบบทั้งหมดไว้ แต่ก็มีข้อ จำกัด บางอย่าง (สร้าง PDF เป็นรูปภาพดังนั้นจึงไม่สามารถค้นหาได้ดูเหมือนจะเบลอเล็กน้อย)
jramm

วิธีตั้งค่าตัวแบ่งหน้าหากเนื้อหาครึ่งหนึ่งไม่พอดีกับหนึ่งหน้า?
SHEKHAR SHETE

ทำงานได้ดีมากสำหรับฉัน ปัญหาเดียวคือไอคอน SVG ของฉันไม่แสดงผล!
Felipe N Moura

2

โซลูชันของคุณต้องใช้วิธีการ ajax เพื่อส่ง html ไปยังเซิร์ฟเวอร์ส่วนหลังที่มีสิ่งอำนวยความสะดวก html เป็น pdf แล้วส่งคืนเอาต์พุต pdf ที่สร้างกลับไปยังเบราว์เซอร์

ขั้นแรกตั้งค่ารหัสฝั่งไคลเอ็นต์เราจะตั้งค่ารหัส jquery เป็น

   var options = {
            "url": "/pdf/generate",
            "data": "data=" + $("#content").html(),
            "type": "post",
        }
   $.ajax(options)

จากนั้นดักข้อมูลจากสคริปต์การสร้าง html2pdf ดังต่อไปนี้

   $html = $_POST['data'];
   $pdf = html2pdf($html);

   header("Content-Type: application/pdf"); //check this is the proper header for pdf
   header("Content-Disposition: attachment; filename='some.pdf';");
   echo $pdf;

 


"มี htmltopdf สิ่งอำนวยความสะดวก" หมายความว่าอย่างไร ??
Midhun Mathew

สามารถอ้างอิง url เดียวกันได้หรือไม่หรือฉันควรเปลี่ยน?
Midhun Mathew

คุณจะต้องมี URL ที่แตกต่างกันเล็กน้อยเพื่อให้คุณสามารถแยกความแตกต่างระหว่างเนื้อหาทั้งสองได้
DevZer0

url นั้นควรเป็นอย่างไร? ยกตัวอย่างได้ไหม ??
Midhun Mathew

2
คุณจะรู้สึกแย่หากมีการเชื่อมโยง CSS เนื่องจากโปรแกรมแบ็คเอนด์ของคุณจะไม่รู้ว่าจะหาสไตล์ได้จากที่ใดเว้นแต่จะสามารถคว้าไฟล์ CSS และใช้สไตล์จากภายในไฟล์ได้
TheRealChx101

1

AFAIK ไม่มีฟังก์ชัน jquery ดั้งเดิมที่ทำสิ่งนี้ ตัวเลือกที่ดีที่สุดคือการประมวลผลการแปลงบนเซิร์ฟเวอร์ วิธีการดำเนินการนี้ขึ้นอยู่กับภาษาที่คุณใช้ (.net, php ฯลฯ ) คุณสามารถส่งเนื้อหาของ div ไปยังฟังก์ชันที่จัดการการแปลงซึ่งจะส่งคืน pdf ให้กับผู้ใช้


-1

ใช่มันเป็นไปได้ที่จะจับ div เป็น PDF ใน JS คุณสามารถสามารถตรวจสอบการแก้ปัญหาให้โดยhttps://grabz.it มี JavaScript API ที่ดีและสะอาดซึ่งจะช่วยให้คุณจับเนื้อหาขององค์ประกอบ HTML เดียวเช่น div หรือ a span

ดังนั้นการใช้โย่นั้นคุณจะต้องและที่สำคัญแอป +และฟรีSDK การใช้งานมีดังต่อไปนี้:

สมมติว่าคุณมี HTML:

<div id="features">
    <h4>Acme Camera</h4>
    <label>Price</label>$399<br />
    <label>Rating</label>4.5 out of 5
</div>
<p>Cras ut velit sed purus porttitor aliquam. Nulla tristique magna ac libero tempor, ac vestibulum felisvulput ate. Nam ut velit eget
risus porttitor tristique at ac diam. Sed nisi risus, rutrum a metus suscipit, euismod tristique nulla. Etiam venenatis rutrum risus at
blandit. In hac habitasse platea dictumst. Suspendisse potenti. Phasellus eget vehicula felis.</p>

ในการจับสิ่งที่อยู่ภายใต้รหัสคุณสมบัติคุณจะต้อง:

//add the sdk
<script type="text/javascript" src="grabzit.min.js"></script>
<script type="text/javascript">
//login with your key and secret. 
GrabzIt("KEY", "SECRET").ConvertURL("http://www.example.com/my-page.html",
{"target": "#features", "format": "pdf"}).Create();
</script>

คุณต้องแทนที่http://www.example.com/my-page.htmlด้วย URL เป้าหมายของคุณและ#featureตามตัวเลือก CSS ของคุณ

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

การกำหนดค่าและการปรับแต่งอื่น ๆ ที่คุณสามารถทำได้กับกลไก div-screenshot โปรดตรวจสอบที่นี่


2
ฉันคิดว่าคุณจะได้เพียง 1,000 แคปเจอร์ฟรีและ 100 "ภาพที่น่าสนใจ" ฟรีกับ grabz.it ดังนั้นจึงไม่ใช่วิธีแก้ปัญหาถาวรเว้นแต่คุณจะเต็มใจจ่าย
BrettC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.