क्या जावास्क्रिप्ट या jquery का उपयोग करके HTML पेज को पीडीएफ के रूप में सहेजना संभव है?


83

क्या जावास्क्रिप्ट या jquery का उपयोग करके HTML पेज को पीडीएफ के रूप में सहेजना संभव है?

विस्तार से:

मैंने एक HTML पृष्ठ बनाया है जिसमें एक तालिका है। इसमें एक बटन has PDF के रूप में सेव ’है। यदि उपयोगकर्ता उस बटन पर क्लिक करता है तो उस HTML पेज को पीडीएफ फाइल के रूप में बदलना होगा।

क्या यह जावास्क्रिप्ट या jquery का उपयोग करना संभव है?


3
जब तक मुझे पता है, जावास्क्रिप्ट पीडीएफ दस्तावेज़ नहीं बना सकता है।
खोआ ले

1
बहुत सारे लोग इन दिनों पीडीएफ में प्रिंट कर सकते हैं। ताकि कार्यक्षमता यकीनन आवश्यक न हो।
एरिक

4
पीडीएफ एक पाठ आधारित भाषा है। आपको एक प्रोग्रामिंग भाषा खोजने में मुश्किल होगी जिसे आप इससे उत्पन्न नहीं कर सकते।
क्वेंटिन

1
संभावित उत्तर यहां: stackoverflow.com/questions/12108806/…
कॉलिन

जवाबों:


28

हां , pdf फ़ाइल बनाने के लिए jspdf का उपयोग करें ।

फिर आप इसे डेटा URI में बदल सकते हैं और DOM में डाउनलोड लिंक इंजेक्ट कर सकते हैं

हालाँकि आपको स्वयं को HTML रूपांतरण पीडीएफ में लिखना होगा।

बस अपने पृष्ठ के प्रिंटर के अनुकूल संस्करणों का उपयोग करें और उपयोगकर्ता को यह चुनने दें कि वह पृष्ठ को कैसे प्रिंट करना चाहता है।

संपादित करें: जाहिर तौर पर इसका न्यूनतम समर्थन है

तो इसका जवाब है कि आप अपना खुद का पीडीएफ लेखक लिखें या मौजूदा पीडीएफ लेखक से इसे आपके लिए (सर्वर पर) करवाएं।


jspdf दिलचस्प लग रहा है, लेकिन फ़ायरफ़ॉक्स 5.0 और IE में डेमो काम नहीं करते हैं!
टिम ब्यूटे

jspdf में सुविधाओं के लिए न्यूनतम समर्थन है, यह ग्राफिक्स का समर्थन भी नहीं करता है। लेकिन जब तक स्टाइल सिस्टम और रेंडरिंग सामान नहीं है - यह मूल रूप से छोटे नोटों के लिए उपयोगी है। अन्यथा आपको जेएस में एक संपूर्ण HTML रेंडरर लिखना होगा (या ड्रॉइमेंट के साथ कैनवास को धोखा देना और उपयोग करना होगा, जो कि बस फ़ायरफ़ॉक्स में समर्थित है जो मुझे याद है)। यदि आप मुझसे पूछते हैं तो जावास्क्रिप्ट कोडिंग की इस पंक्ति के लिए वास्तव में नहीं है। शायद एक बाहरी webservice कॉल सबसे आसान तरीका है।
जॉन लेन्नर्ट एसेनडेन

जावास्क्रिप्ट (एक भाषा के रूप में) पूरी तरह से इसके ऊपर है। जावास्क्रिप्ट ब्राउज़र सुरक्षा मॉडल और एपीआई के प्रतिबंध के साथ कम चल रहा है।
क्वेंटिन

4
मुझे यकीन है कि कोई मैच या टूथपिक्स से घर बना सकता है, लेकिन दिन के अंत में - सिलाई, ग्राफिक्स, फ़ॉन्ट एम्बेडिंग, शैलियों और पूरी तरह कार्यात्मक लुकअप तालिकाओं के समर्थन के साथ एक पूरी तरह से उड़ा हुआ पीडीएफ कंपाइलर प्रश्न से बाहर है। Jspdf के लिए स्रोत पर एक नज़र है - यह केवल सबसे सरल टैग और कोई लुकअप शब्दकोशों का समर्थन करता है। एक पूरी तरह से उड़ाया गया पीडीएफ कंपाइलर सी ++ या डेल्फी में भी करना मुश्किल है, एक शुद्ध जेएस कार्यान्वयन आत्मघाती होगा। ऐसी कंपनियां हैं जो केवल अपने पीडीएफ कंपाइलरों को बेचकर काम करती हैं (उदाहरण के लिए gnostice देखें)। यह "वन लाइनर" नहीं है।
जॉन लेन्नर्ट आसेंडेन

@JonLennartAasenden हाँ इसमें न्यूनतम समर्थन है। यदि आप चाहें तो आप अभी भी js में एक पीडीएफ लेखक लिख सकते हैं। हालांकि यह एक आसान काम नहीं है। एक शुद्ध जेएस कार्यान्वयन सी ++ या डेल्फी के रूप में आत्मघाती है। दिखावा मत करो जेएस एक द्वितीय श्रेणी का नागरिक है।
रेयानोस

15

हां जावास्क्रिप्ट के साथ करना बहुत आसान है। आशा है कि यह कोड आपके लिए उपयोगी है।

आपको JSpdf लाइब्रेरी की आवश्यकता होगी ।

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

    <p>a pararaph</p>
</div>
<div id="editor"></div>
<button id="cmd">Generate PDF</button>

<script>
    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');
    });

    // This code is collected but useful, click below to jsfiddle link.
</script>

jsfiddle लिंक यहाँ


1
छवि पीडीएफ में प्रिंट नहीं :( आपके पास एक समाधान है?
मेस्ट्रो व्लादिमीर

2
यह न तो गुणा का समर्थन करता है और न ही सीएसएस शैलियों का ठीक से उपयोग करता है।
डायनेमिक

1
तालिकाओं का समर्थन नहीं करता है :( दृष्टिकोण से प्यार करता था
FutoRicky

3
JSFiddle लिंक 404 पेज की ओर जाता है
ऑस्कर चेम्बर्स

13

यह देर से उत्तर हो सकता है लेकिन यह सबसे अच्छा है: https://github.com/eKoopmans/html2pdf

शुद्ध जावास्क्रिप्ट कार्यान्वयन। आपको आईडी द्वारा केवल एक तत्व को निर्दिष्ट करने और इसे परिवर्तित करने की अनुमति देता है।


1
कोई उत्तर देर से है :)। धन्यवाद
कल्याण Chavali

7

आप फैंटमज का उपयोग कर सकते हैं। एचटीएमएल-> पीडीएफ रूपांतरण सुविधा https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js का परीक्षण करने के लिए यहां डाउनलोड करें और निम्न उदाहरण का उपयोग करें

उदाहरण कोड:

phantomjs.exe examples/rasterize.js http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/xhtml/index.html sample.pdf

क्या आप इसे कमांड लाइन उपयोगिता के बजाय जावास्क्रिप्ट के साथ उपयोग कर सकते हैं?
डायनेमिक

@ डायनामिक नहीं, यह एक हेडलेस ब्राउज़र है जिसे आप जावास्क्रिप्ट के माध्यम से नियंत्रित कर सकते हैं। आप इसे जावास्क्रिप्ट के माध्यम से एक वेब पेज को पीडीएफ में प्रिंट करने के लिए कह सकते हैं लेकिन कार्यान्वयन जावास्क्रिप्ट नहीं है। हालाँकि, इस सटीक परिदृश्य के लिए इसे एक ऐप में लपेटकर उपयोग किया जाता है जो प्रिंट करने के लिए पृष्ठों की एक कतार का उपभोग करता है, और मैं कतार में प्रविष्टियों को जोड़ने के लिए जावास्क्रिप्ट का उपयोग करता हूं। इसी तरह आप इसे एक सेवा में लपेट सकते हैं। यह नियंत्रित करने के लिए कि आप कैसे चीजों को मुद्रित करते हैं, हालांकि आप क्रोम प्रिंट के समान सीमा के नीचे हैं (उदाहरण के लिए css और js एक प्रिंट फ्रेंडली दृश्य बनाने के लिए)
शेन

7

मैंने इस्तेमाल किया jsPDFऔरdom-to-image पीडीएफ को HTML निर्यात करने के लिए लाइब्रेरी ।

मैं किसकी चिंता के संदर्भ में यहां पोस्ट करता हूं।

$('#downloadPDF').click(function () {
    domtoimage.toPng(document.getElementById('content2'))
      .then(function (blob) {
          var pdf = new jsPDF('l', 'pt', [$('#content2').width(), $('#content2').height()]);
          pdf.addImage(blob, 'PNG', 0, 0, $('#content2').width(), $('#content2').height());
          pdf.save("test.pdf");
      });
});

डेमो: https://jsfiddle.net/viethien/md03wb21/27/


अगर मैं गोटो उत्तरदायी मोड और पीडीएफ डाउनलोड करता हूं, तो पीडीएफ पेज ठीक से नहीं आता है, क्या मैं उत्तरदायी मोड का उपयोग करते समय डेस्कटॉप मोड के समान परिणाम प्राप्त करने का एक तरीका है।
नैंसी

6

यहां बताया गया है कि मैं इसे कैसे करूंगा, इसका विचार बुलेटप्रूफ डिजाइन नहीं है, आपको इसे संशोधित करने की आवश्यकता है

  • उपयोगकर्ता पीडीएफ बटन के रूप में सहेजें पर क्लिक करता है
  • सर्वर को अजाक्स का उपयोग करके कॉल भेजा जाता है
  • सर्वर HTML का उपयोग करके उत्पन्न पीडीएफ के लिए एक यूआरएल के साथ प्रतिक्रिया करता है, मैंने अपाचे एफओपी का उपयोग बहुत सफलतापूर्वक किया है
  • Ajax रिस्पांस को हैंडल करने वाला js, जेएस द्वारा भेजे गए URL को इंगित करने के लिए एक स्थान देता है। और जैसे ही वह URL लोड होता है, वह फ़ाइल को डाउनलोड करने के लिए अटैचमेंट फोर्सिंग के रूप में कंटेंट डिस्पेंस हेडर का उपयोग करके फाइल भेजता है।

2

Html को pdf server साइड में कन्वर्ट करना बहुत आसान और विश्वसनीय है। हम Google Puppeteer का उपयोग कर रहे हैं। यह आपके चयन के किसी भी सर्वर साइड भाषा के लिए रैपर के साथ अच्छी तरह से बनाए रखा गया है। Puppeteer स्क्रीनशॉट और / या PDF फ़ाइलों को बनाने के लिए हेडलेस क्रोम का उपयोग करता है। यह आपको बहुत सारे सिरदर्द से बचाएगा, खासकर यदि आपको तालिकाओं, छवियों, ग्राफ़, कई पृष्ठों के साथ जटिल पीडीएफ फाइलें उत्पन्न करने की आवश्यकता है

https://developers.google.com/web/tools/puppeteer/


2

जावास्क्रिप्ट का उपयोग करके HTML को पीडीएफ में बदलने का एक और बहुत स्पष्ट तरीका है: उसके लिए एक ऑनलाइन एपीआई का उपयोग करें। यदि उपयोगकर्ता ऑफ़लाइन है तो आपको रूपांतरण करने की आवश्यकता नहीं है, यह ठीक काम करेगा।

PdfMage एक ऐसा विकल्प है जिसमें एक अच्छा एपीआई है और मुफ्त खाते प्रदान करता है। मुझे यकीन है कि आप कई विकल्प पा सकते हैं (उदाहरण के लिए, यहां )

PdfMage API के लिए आपके पास कुछ इस तरह होगा:

 $.ajax({
    url: "https://pdfmage.org/pdf-api/v1/process",
    type: "POST",
    crossDomain: true,
    data: { Html:"<html><body>Hi there!</body></html>" },
    dataType: "json",
    headers: {
        "X-Api-Key": "your-key-here" // not very secure, but a valid option for non-public domains/intranet
    },
    success: function (response) {
        window.location = response.Data.DownloadUrl;
    },
    error: function (xhr, status) {
        alert("error");
    }
});

3
Freehtmltopdf.com किसी भी लंबे समय तक नहीं लगता है
Zach Saucier

1
PDFMage अब मुक्त नहीं है, दुर्भाग्य से।
प्रोमेथियस

1

हाँ। उदाहरण के लिए आप https://grabz.it द्वारा समाधान का उपयोग कर सकते हैं ।

यह एक जावास्क्रिप्ट एपीआई है जिसे स्क्रीनशॉट को हथियाने और हेरफेर करने के लिए विभिन्न तरीकों से उपयोग किया जा सकता है। आदेश में अपने ऐप्लिकेशन में इसका इस्तेमाल करने के लिए आपको पहले एक पाने के लिए की आवश्यकता होगी एप्लिकेशन कुंजी और गोपनीयता और डाउनलोड मुक्त जावास्क्रिप्ट एसडीके।

तो, आइए इसे इस्तेमाल करने के लिए एक सरल उदाहरण देखें:

//first include the grabzit.min.js library in the web page
<script src="grabzit.min.js"></script>
//include the code below to add the screenshot to the body tag    
<script>
//use secret key to sign in. replace the url.
GrabzIt("Sign in to view your Application Key").ConvertURL("http://www.google.com").Create();
</script>

फिर बस थोड़ी देर प्रतीक्षा करें और छवि स्वचालित रूप से पृष्ठ के निचले भाग में दिखाई देगी, बिना आपको पृष्ठ को फिर से लोड करने की आवश्यकता होगी।

वह सबसे सरल है। छवि हेरफेर के साथ अधिक उदाहरणों के लिए, तत्वों को स्क्रीनशॉट संलग्न करना और आदि प्रलेखन की जांच करें ।


1

$('#cmd2').click(function() {
  	var options = {
		//'width': 800,
  	};
  	var pdf = new jsPDF('p', 'pt', 'a4');
  	pdf.addHTML($("#content2"), -1, 220, options, function() {
    	pdf.save('admit_card.pdf');
  	});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.min.js"></script>

<div id="content2" style="background: #fff;border-bottom: 1px solid #ffffff;">
                    	<div class="tokenDet" style="padding: 15px;border: 1px solid #000;width: 80%;margin: 0 auto;position: relative;overflow: hidden;">
                        	<div class="title" style="text-align: center;border-bottom: 1px solid #000;margin-bottom: 15px;">
                            	<h2>Entrance Exam Hall Ticket</h2>
                            </div>
                            <div class="parentdiv" style="display: inline-block;width: 100%;position: relative;">
                            	<div class="innerdiv" style="width: 80%;float: left;">
                            		<div class="restDet">
                                        <div class="div">
                                            <div class="label" style="width: 30%;float: left;">
                                                <strong>Name</strong>
                                            </div>
                                            <div class="data" style="width: 70%;display: inline-block;">
                                                <span>Santanu Patra</span>
                                            </div>
                                            <div class="label" style="width: 30%;float: left;">
                                                <strong>D.O.B.</strong>
                                            </div>
                                            <div class="data" style="width: 70%;display: inline-block;">
                                                <span>17th April, 1995</span>
                                            </div>
                                            <div class="label" style="width: 30%;float: left;">
                                                <strong>Address</strong>
                                            </div>
                                            <div class="data" style="width: 70%;display: inline-block;">
                                                <span>P.S. Srijan Corporate Park, Saltlake, Sector 5, Kolkata-91</span>
                                            </div>
                                            <div class="label" style="width: 30%;float: left;">
                                                <strong>Contact Number</strong>
                                            </div>
                                            <div class="data" style="width: 70%;display: inline-block;">
                                                <span>9874563210</span>
                                            </div>
                                            <div class="label" style="width: 30%;float: left;">
                                                <strong>Email Id</strong>
                                            </div>
                                            <div class="data" style="width: 70%;display: inline-block;">
                                                <span>santanu@macallied.com</span>
                                            </div>
                                            <div class="label" style="width: 30%;float: left;">
                                                <strong>Parent(s) Name</strong>
                                            </div>
                                            <div class="data" style="width: 70%;display: inline-block;">
                                                <span>S. Patra</span><br /><span>7896541230</span>
                                            </div>
                                            <div class="label" style="width: 30%;float: left;">
                                                <strong>Exam Center</strong>
                                            </div>
                                            <div class="data" style="width: 70%;display: inline-block;">
                                                <span>Institute of Engineering & Management</span>
                                            </div>
                                            <div class="label" style="width: 30%;float: left;">
                                                <strong>Hall Number</strong>
                                            </div>
                                            <div class="data" style="width: 70%;display: inline-block;">
                                                <span>COM-32</span>
                                            </div>
                                        </div>
                                    </div>
                            	</div>
                                <div class="sideDiv" style="width: 20%;float: left;">
                                	<div class="atts" style="float: left;width: 100%;">
                                    	<div class="photo" style="width: 115px;height: 150px;float: right;">
                                        	<img src="images/candidateImg.gif" style="width: 100%;"/>
                                        </div>
                                        <div class="sign" style="position: absolute;bottom: 0;right: 0;border-top: 1px dashed #000;left: 80%;text-align: right;">
                                        	<small>Self Attested</small>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <button class="btn btn-info" id="cmd2">Download Token</button>


उपरोक्त कोड मेरे द्वारा परीक्षण किए गए किसी भी ब्राउज़र में काम नहीं करता है। जब आप "डाउनलोड टोकन" बटन पर क्लिक करते हैं तो कुछ भी नहीं होता है और कोई त्रुटि लॉग नहीं होती है। क्या तुम इसे जांचोगे।
अल्मेस्टर

0

संक्षेप में: नहीं। पहली समस्या फाइल सिस्टम तक पहुंच है, जो अधिकांश ब्राउज़रों में सुरक्षा कारणों से डिफ़ॉल्ट रूप से सेट नहीं है। आधुनिक ब्राउज़र कभी-कभी डेटाबेस के रूप में न्यूनतम संग्रहण का समर्थन करते हैं, या आप उपयोगकर्ता से फ़ाइल एक्सेस को सक्षम करने के लिए कह सकते हैं।

यदि आपके पास फ़ाइल सिस्टम तक पहुंच है, तो HTML को सहेजना उतना कठिन नहीं है (जेएस प्रलेखन में फ़ाइल ऑब्जेक्ट देखें) - लेकिन पीडीएफ इतना आसान नहीं है। पीडीएफ एक बहुत ही उन्नत फ़ाइल-प्रारूप है जो वास्तव में जावास्क्रिप्ट के लिए बीमार है। यह आपको शब्द और क्वैड जैसे जावास्क्रिप्ट द्वारा सीधे समर्थित नहीं किए गए डेटाैटिप में जानकारी लिखने की आवश्यकता है। आपको एक शब्दकोश खोज प्रणाली को पूर्व-परिभाषित करने की भी आवश्यकता है जिसे फ़ाइल में सहेजा जाना चाहिए। मुझे यकीन है कि कोई इसे काम कर सकता है, लेकिन इसमें शामिल प्रयास और समय बेहतर होगा C ++ या डेल्फी सीखने में।

यदि उपयोगकर्ता आपको गैर-प्रतिबंधित पहुँच देता है तो HTML निर्यात संभव होना चाहिए


2
पीडीएफ लेखक बनाने में C ++ और डेल्फी स्वाभाविक रूप से बेहतर क्यों हैं ?
रेयानोस

2
क्योंकि उन भाषाओं को उन्नत सॉफ्टवेयर बनाने के लिए बनाया गया था। जावास्क्रिप्ट नहीं था। जावास्क्रिप्ट कभी खत्म नहीं हुआ था, यही कारण है कि प्रोटोटाइप सिस्टम लटका हुआ है। लेखक ने वास्तविक वर्गों और अधिक डेटाटिप्स के साथ इसमें एक एचएल जोड़ने की योजना बनाई थी - लेकिन उसके पास समय नहीं था। तो यह "जैसा है" प्रकाशित हुआ। यह पॉइंटर्स का समर्थन नहीं करता है, कच्ची मेमोरी आवंटन दर्दनाक है, यह कुछ देशी डेटाटिप्स का समर्थन नहीं करता है जो आप अन्य भाषाओं में पाते हैं, यह पैक्ड संरचनाओं (सी में संरचना, पास्कल में रिकॉर्ड) का समर्थन नहीं करता है ... सूची अंतहीन है। मुझे JS बहुत पसंद है, लेकिन यह एक ब्राउज़र टॉय है, असली भाषा नहीं।
जॉन लेन्नर्ट आसेंडेन

कुछ जावा आधारित लेखक हैं, और यदि आप स्रोत-कोड के आकार को देखते हैं, तो यह स्पष्ट रूप से स्पष्ट होना चाहिए कि यह जावास्क्रिप्ट के तहत भी लंबा होगा - लेकिन महत्वपूर्ण बिंदु यह है: आईओ का गठन और लुकअप टेबल । मुझे यकीन है कि कोई ऐसा कर सकता है - लेकिन यह बहुत धीमा होगा और मूल रूप से, समय की बर्बादी होगी। और आप फ़ॉन्ट डेटा कैसे एम्बेड करेंगे? आप OS से फ़ाइल प्राप्त नहीं कर सकते हैं, इसे अकेले में परिवर्तित करें (जो कि अपने आप में संपूर्ण पुस्तकालय है) और इसे एम्बेड करें। जब आप मैच कर सकते हैं, तो एक सामान्य घर का निर्माण क्यों करें?
जॉन लेन्नर्ट आसेंडेन

2
"लेकिन यह एक ब्राउज़र टॉय है, वास्तविक भाषा नहीं है।" यह कहना है कि योजना एक वास्तविक भाषा नहीं है। "यह स्पष्ट रूप से स्पष्ट होना चाहिए कि यह जावास्क्रिप्ट के तहत भी लंबा होगा", नहीं। जावा गंभीर रूप से अधिक क्रिया है तब जावास्क्रिप्ट। यह लगभग 2/3 छोटा होना चाहिए फिर जावा संस्करण। "लेकिन यह बहुत धीमी गति से और मूल रूप से होगा," बहुत धीमी गति से आपका मतलब 3 / 4x धीमा है फिर सी ++? क्या हम कृपया js को दूसरी श्रेणी के नागरिक के रूप में मानना ​​बंद कर सकते हैं। धन्यवाद।
रेयनोस

11
आपकी व्यक्तिगत राय के बावजूद, जॉन, क्या आप यह दावा करना बंद कर सकते हैं कि "जावास्क्रिप्ट एक वास्तविक भाषा नहीं है," क्योंकि बी.एस. जावास्क्रिप्ट एक अत्यंत शक्तिशाली भाषा है जो विभिन्न स्तरों के लिए निम्न स्तर की संकलित भाषा जैसे C या C ++ से अनुकूलित है। जेएस में ऐसी चीजें हैं जो आप सी या सी ++ में नहीं कर सकते हैं, लेकिन क्या इसका मतलब है कि सी और सी ++ "वास्तविक" भाषा नहीं हैं? नहीं, बस वे अलग-अलग चीजों के लिए हैं। जेएस वास्तविक प्रोग्रामिंग भाषा के रूप में किसी भी अन्य ट्यूरिंग-पूर्ण भाषा के रूप में है।
Isochronous
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.