javascriptを使用してHTMLページのdivをpdfとしてダウンロードします


92

IDが「content」のコンテンツdivがあります。content divには、いくつかのグラフといくつかの表があります。ユーザーがダウンロードボタンをクリックしたときに、そのdivをPDFとしてダウンロードしたいと思います。javascriptまたはjQueryを使用してそれを行う方法はありますか?


1
code.google.com/p/jspdfは、私が知っている中でこれを実行できる最高のライブラリです。
AlvinArulselvan 2013年

特定のdivのコンテンツをダウンロードするためにjsPDFを使用するにはどうすればよいですか?私が彼らのサイトの例で見るものから、それはすることができません。
Midhun Mathew 2013

回答:


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 2013

15
jsPDFもテーブルを適切にフォーマットせず、td / thをdisplay:blockとして解釈するだけです。
デイブ

2
上記のコードを使用すると、PDFを1回だけ作成できます。しかし、2度目は機能していません。それを機能させるには、@ kristof-feysによるこの回答を確認してくださいdoc。クリック関数内で変数を宣言する必要があります。
Mahendran Sakkarai 2014

4
これは素晴らしいです、CSSがレンダリングされないのは残念です:/
ニコラス

1
エンコーディングの問題に直面しました
ema 2015年

20

内のコンテンツは、jspdfおよびhtml2canvas<div class='html-content'>....</div>を使用したスタイルのpdfとしてダウンロードできます。

両方の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();
    });
}

参照:htmlキャンバスおよびjspdfからのpdf生成

これは誰かを助けるかもしれません。


4
これは私にとってはうまくいきました、ありがとう。すべてのスタイリングを保持しますが、いくつかの制限があります(PDFを画像として作成するため、検索できません。また、少しぼやけているようです)。
jramm

コンテンツの半分が1ページに収まらない場合に改ページを設定するにはどうすればよいですか?
SHEKHARSHETE20年

私にはとてもうまくいきました。唯一の問題は、SVGアイコンの一部がレンダリングされなかったことです。
Felipe NMoura20年

2

ソリューションでは、html to pdf機能を備えたバックエンドサーバーにhtmlを渡し、生成されたpdf出力をブラウザーに返すためのajaxメソッドが必要です。

最初にクライアント側のコードを設定し、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 2013

同じURLを参照しても大丈夫ですか、それとも変更する必要がありますか?
Midhun Mathew 2013

2つのコンテンツを区別できるように、わずかに異なるURLが必要になります
DevZer0 2013年

そのURLはどうあるべきですか?例を挙げていただけますか?
Midhun Mathew 2013

2
ただし、CSSファイルを取得してファイル内からスタイルを適用できない限り、バックエンドプログラムはスタイルの場所を認識できないため、CSSがリンクされていると困惑します。
TheRealChx101 2016

1

AFAIKこれを行うネイティブのjquery関数はありません。最良のオプションは、サーバーで変換を処理することです。これをどのように行うかは、使用している言語(.net、phpなど)によって異なります。divのコンテンツを、変換を処理する関数に渡すことができます。これにより、ユーザーにpdfが返されます。


-1

はい、JSでdivをPDFとしてキャプチャすることは可能です。https://grabz.itで提供されているソリューションを確認できます。それらは、divやspanなどの単一のHTML要素のコンテンツをキャプチャできるようにするすてきでクリーンなJavaScriptAPIを備えています。

だから、あなたが必要とするそれを使用し、app + keyと無料の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>

機能IDの下にあるものをキャプチャするには、次のことを行う必要があります。

//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に置き換え、#featureCSSセレクターごとに置き換える必要があります。

それで全部です。これで、ページが読み込まれると、scriptタグと同じ場所に画像のスクリーンショットが作成されます。このスクリーンショットには、featuresdivのすべてのコンテンツが含まれています。

div-screenshotメカニズムに対して実行できるその他の構成とカスタマイズは、こちらで確認してください。


2
grabz.itでは、1,000回の無料キャプチャと100回の無料の「スクレイプ」しか得られないと思います。したがって、あなたがそれを支払う気がない限り、恒久的な解決策ではありません。
BrettC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.