Pobierz element DIV na stronie HTML jako plik PDF za pomocą javascript

91

Mam element div zawartości z identyfikatorem „content”. W div zawartości mam kilka wykresów i kilka tabel. Chcę pobrać ten element DIV jako plik PDF, gdy użytkownik kliknie przycisk pobierania. Czy jest na to sposób za pomocą javascript lub jQuery?

Midhun Mathew
źródło
1
code.google.com/p/jspdf to najlepsza znana mi biblioteka, która może to zrobić.
AlvinArulselvan
Jak mogę użyć jsPDF do pobrania zawartości w określonym div? z tego, co widzę w przykładach w ich witrynie, nie można tego zrobić.
Midhun Mathew

Odpowiedzi:

112

Możesz to zrobić za pomocą 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');
});
ilyes kooli
źródło
25
Mam tu problem. CSS, który tutaj dodałem, nie jest stosowany w pliku pdf. Mam też kilka wykresów… te nie pojawiają się w pdf. Co powinienem zrobić, aby je zdobyć?
Midhun Mathew
14
jsPDF również nie formatuje poprawnie tabel, po prostu interpretuje td / th jako display: block;
Dave
2
Korzystając z powyższego kodu możemy tylko raz stworzyć plik pdf. Ale po raz drugi nie działa. Aby to zadziałało, sprawdź tę odpowiedź @ kristof-feys, Musimy zadeklarować doczmienną wewnątrz funkcji click.
Mahendran Sakkarai
4
To miłe, szkoda tylko, że css nie jest renderowany: /
Nicholas
1
Miałem problem z kodowaniem
ema
19

Treść w pliku <div class='html-content'>....</div>można pobrać w formacie PDF ze stylami za pomocą jspdf i html2canvas .

Musisz odwołać się do obu bibliotek 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>

Następnie wywołaj poniżej funkcję,

//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: generacja pdf z html canvas i jspdf .

Może to komuś pomoże.

Vishnu S.
źródło
4
To zadziałało świetnie, dzięki. Zachowuje wszystkie style, ale ma pewne ograniczenia (tworzy plik PDF jako obraz, więc nie można go przeszukiwać; wydaje się również być lekko rozmyty).
jramm
jak ustawić podział strony, jeśli połowa treści nie mieści się na jednej stronie?
SHEKHAR SHETE
Dla mnie bardzo dobrze. Jedynym problemem było to, że niektóre z moich ikon SVG nie były renderowane!
Felipe N Moura
2

Twoje rozwiązanie wymaga metody AJAX, aby przekazać kod HTML do serwera zaplecza, który ma funkcję HTML do PDF, a następnie zwrócić wygenerowane wyjście PDF z powrotem do przeglądarki.

Najpierw ustawiając kod po stronie klienta, ustawimy kod jquery jako

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

Następnie przechwyć dane ze skryptu generującego html2pdf w następujący sposób

   $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;

 

DevZer0
źródło
Co miałeś na myśli, mówiąc „ma funkcję htmltopdf”?
Midhun Mathew
czy mogę odnosić się do tego samego adresu URL, czy powinienem go zmienić?
Midhun Mathew
Potrzebowałbyś
jaki powinien być ten adres URL? Czy możesz podać przykład?
Midhun Mathew
2
Będziesz miał problemy, jeśli CSS jest połączony, ponieważ twój program zaplecza nie będzie wiedział, gdzie znaleźć style, chyba że może złapać plik CSS i zastosować style z pliku.
TheRealChx101
1

AFAIK, nie ma natywnej funkcji jquery, która to robi. Najlepszą opcją byłoby przetworzenie konwersji na serwerze. Sposób, w jaki to zrobisz, zależy od używanego języka (.net, php itp.). Możesz przekazać zawartość elementu div do funkcji obsługującej konwersję, która zwróci użytkownikowi plik PDF.

reggaemahn
źródło
-1

Tak, możliwe jest przechwycenie div jako plików PDF w JS. Możesz sprawdzić rozwiązanie dostarczone przez https://grabz.it . Mają ładny i przejrzysty interfejs API JavaScript, który pozwoli ci przechwycić zawartość pojedynczego elementu HTML, takiego jak div lub span.

Tak więc, będziesz go używać, będziesz potrzebować i app + key oraz darmowego SDK . Jego użycie jest następujące:

Powiedzmy, że masz 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>

Aby uchwycić to, co znajduje się pod identyfikatorem funkcji, musisz:

//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>

Musisz zamienić na http://www.example.com/my-page.htmldocelowy adres URL i #featurezgodnie z selektorem CSS.

To wszystko. Teraz po załadowaniu strony zrzut ekranu obrazu zostanie utworzony w tym samym miejscu co tag script, który będzie zawierał całą zawartość elementu div features i nic więcej.

Są inne konfiguracje i dostosowania, które możesz zrobić w mechanizmie zrzutu ekranu div, sprawdź je tutaj

Jasio
źródło
2
Myślę, że dzięki grabz.it dostajesz tylko 1000 darmowych przechwyceń i 100 darmowych "zdrapek". Nie jest to więc trwałe rozwiązanie, chyba że jesteś gotów za to zapłacić.
BrettC