Czy można zapisać stronę HTML jako PDF za pomocą JavaScript lub jQuery?
Szczegółowo:
Wygenerowałem jedną stronę HTML zawierającą tabelę. Posiada jeden przycisk „zapisz jako PDF”. Jeśli użytkownik kliknie ten przycisk, ta strona HTML musi zostać przekonwertowana na plik PDF.
Czy jest to możliwe przy użyciu JavaScript lub jQuery?
javascript
jquery
jquery-ui
Baran
źródło
źródło
Odpowiedzi:
Tak , użyj jspdf, aby utworzyć plik pdf.
Następnie możesz przekształcić go w identyfikator URI danych i wstawić łącze pobierania do DOM
Będziesz jednak musiał samodzielnie napisać konwersję HTML do PDF.
Po prostu użyj wersji strony do druku i pozwól użytkownikowi wybrać, w jaki sposób chce wydrukować stronę.
Edycja: Najwyraźniej ma minimalne wsparcie
Zatem odpowiedzią jest napisanie własnego programu do zapisywania plików PDF lub skorzystanie z istniejącego programu do zapisywania plików PDF, który zrobi to za Ciebie (na serwerze).
źródło
Tak, bardzo łatwo to zrobić z javascriptem. Mam nadzieję, że ten kod jest dla Ciebie przydatny.
Będziesz potrzebować biblioteki 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 link tutaj
źródło
To może być późna odpowiedź, ale tak jest najlepiej: https://github.com/eKoopmans/html2pdf
Czysta implementacja javascript. Pozwala określić tylko jeden element za pomocą identyfikatora i przekonwertować go.
źródło
Możesz użyć Phantomjs. Pobierz tutaj i użyj następującego przykładu, aby przetestować funkcję konwersji html-> pdf https://github.com/ariya/phantomjs/blob/master/examples/rasterize.js
Przykładowy kod:
phantomjs.exe examples/rasterize.js http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/xhtml/index.html sample.pdf
źródło
Użyłem
jsPDF
idom-to-image
biblioteki do eksportu HTML do PDF.Piszę tutaj jako odniesienie do kogo dotyczy.
$('#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"); }); });
Demo: https://jsfiddle.net/viethien/md03wb21/27/
źródło
Oto jak bym to zrobił, to pomysł, a nie kuloodporna konstrukcja, trzeba to zmodyfikować
źródło
Konwersja html do pdf po stronie serwera jest znacznie łatwiejsza i bardziej niezawodna. Używamy Google Puppeteer. Jest dobrze utrzymany z opakowaniami dla dowolnego wybranego języka serwera. Puppeteer używa bezgłowego Chrome do generowania zrzutów ekranu i / lub plików PDF. Zaoszczędzi ci to DUŻO bólu głowy, zwłaszcza jeśli musisz wygenerować złożone pliki PDF z tabelami, obrazami, wykresami, wieloma stronami itp.
https://developers.google.com/web/tools/puppeteer/
źródło
Jest jeszcze jeden bardzo oczywisty sposób konwersji HTML na PDf przy użyciu JavaScript: użyj do tego internetowego interfejsu API. To zadziała dobrze, jeśli nie musisz wykonywać konwersji, gdy użytkownik jest offline.
PdfMage to jedna z opcji, która ma fajne API i oferuje darmowe konta. Jestem pewien, że możesz znaleźć wiele alternatyw (na przykład tutaj )
W przypadku API PdfMage miałbyś coś takiego:
$.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"); } });
źródło
Tak. Na przykład możesz skorzystać z rozwiązania https://grabz.it .
Posiada interfejs API JavaScript, którego można używać na różne sposoby, aby pobrać zrzut ekranu i manipulować nim. Aby użyć go w swojej aplikacji, musisz najpierw uzyskać klucz i tajny klucz aplikacji, a następnie pobrać bezpłatny pakiet SDK JavaScript.
Zobaczmy więc prosty przykład jego użycia:
//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>
Następnie po prostu poczekaj chwilę, a obraz automatycznie pojawi się na dole strony, bez konieczności ponownego ładowania strony.
To jest najprostsze. Więcej przykładów manipulacji obrazami, dołączania zrzutów ekranu do elementów itp. Można znaleźć w dokumentacji .
źródło
$('#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>[email protected]</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>
źródło
Krótko mówiąc: nie. Pierwszym problemem jest dostęp do systemu plików, który w większości przeglądarek jest domyślnie ustawiony na no ze względów bezpieczeństwa. Nowoczesne przeglądarki czasami obsługują minimalistyczne przechowywanie w postaci bazy danych lub można poprosić użytkownika o włączenie dostępu do plików.
Jeśli masz dostęp do systemu plików, zapisywanie jako HTML nie jest takie trudne (zobacz obiekt pliku w dokumentacji JS) - ale PDF nie jest taki łatwy. PDF to dość zaawansowany format plików, który naprawdę nie nadaje się do Javascript. Wymaga pisania informacji w typach danych, które nie są bezpośrednio obsługiwane przez Javascript, takich jak słowa i quady. Musisz także wstępnie zdefiniować system wyszukiwania w słowniku, który należy zapisać w pliku. Jestem pewien, że ktoś mógłby sprawić, że to zadziała, ale zaangażowany wysiłek i czas lepiej poświęcić na naukę C ++ lub Delphi.
Jednak eksport HTML powinien być możliwy, jeśli użytkownik zapewnia nieograniczony dostęp
źródło