Javascriptを使用してdiv内のHTMLからPDFを生成する 質問する

Javascriptを使用してdiv内のHTMLからPDFを生成する 質問する

次の HTML コードがあります:

<!DOCTYPE html>
<html>
    <body>
        <p>don't print this to pdf</p>
        <div id="pdf">
            <p><font size="3" color="red">print this to pdf</font></p>
        </div>
    </body>
</html>

私がやりたいのは、div で見つかった id が "pdf" のものを PDF に印刷することだけです。これは JavaScript を使用して行う必要があります。すると、"pdf" ドキュメントが "foobar.pdf" というファイル名で自動的にダウンロードされるはずです。

私はこれを実行するために jspdf を使用していますが、このツールが持つ唯一の機能は文字列値のみを受け入れる「text」です。テキストではなく HTML を jspdf に送信したいのです。

ベストアンサー1

jsPDF はプラグインを使用できます。HTMLを印刷できるようにするには、特定のプラグインを組み込む必要があり、そのためには次の操作を行う必要があります。

  1. へ移動https://github.com/MrRio/jsPDF最新バージョンをダウンロードしてください。
  2. プロジェクトに次のスクリプトを含めます。
  • jspdf.js
  • jspdf.plugin.from_html.js
  • jspdf.plugin.split_text_to_size.js
  • jspdf.plugin.standard_fonts_metrics.js

特定の要素を無視したい場合は、その要素に ID を付けてマークする必要があります。これにより、jsPDF の特別な要素ハンドラーで無視できるようになります。したがって、HTML は次のようになります。

<!DOCTYPE html>
<html>
  <body>
    <p id="ignorePDF">don't print this to pdf</p>
    <div>
      <p><font size="3" color="red">print this to pdf</font></p>
    </div>
  </body>
</html>

次に、次の JavaScript コードを使用して、作成した PDF をポップアップで開きます。

var doc = new jsPDF();          
var elementHandler = {
  '#ignorePDF': function (element, renderer) {
    return true;
  }
};
var source = window.document.getElementsByTagName("body")[0];
doc.fromHTML(
    source,
    15,
    15,
    {
      'width': 180,'elementHandlers': elementHandler
    });

doc.output("dataurlnewwindow");

私の場合、これにより、「これを PDF に印刷」という行のみが含まれた、きれいで整った PDF が作成されました。

特別な要素ハンドラは現在のバージョンではIDのみを扱うことに注意してください。これは、GitHub の問題それは次のように述べています。

マッチングはノード ツリー内のすべての要素に対して行われるため、できるだけ高速に実行したいと考えました。その場合、それは「要素 ID のみがマッチングされる」ことを意味します。要素 ID は引き続き jQuery スタイルの「#id」で実行されますが、すべての jQuery セレクターがサポートされているわけではありません。

したがって、「#ignorePDF」を「.ignorePDF」のようなクラスセレクターに置き換えてもうまくいきませんでした。代わりに、無視したいすべての要素に同じハンドラーを追加する必要があります。

var elementHandler = {
  '#ignoreElement': function (element, renderer) {
    return true;
  },
  '#anotherIdToBeIgnored': function (element, renderer) {
    return true;
  }
};

からまた、「a」や「li」などのタグを選択できるとも述べられています。ただし、ほとんどのユースケースでは少し制限が緩すぎるかもしれません。

特別な要素ハンドラーをサポートしています。ID またはノード名のいずれかに対して、jQuery スタイルの ID セレクターを使用してそれらを登録します。("#iAmID"、"div"、"span" など) 現時点では、他のタイプのセレクター (クラス、複合) はサポートされていません。

追加すべき非常に重要な点の 1 つは、すべてのスタイル情報 (CSS) が失われることです。幸い、jsPDF は h1、h2、h3 などをうまくフォーマットできるので、私の目的には十分でした。さらに、テキスト ノード内のテキストのみが印刷されるため、テキスト領域などの値は印刷されません。例:

<body>
  <ul>
    <!-- This is printed as the element contains a textnode -->        
    <li>Print me!</li>
  </ul>
  <div>
    <!-- This is not printed because jsPDF doesn't deal with the value attribute -->
    <input type="text" value="Please print me, too!">
  </div>
</body>

おすすめ記事