jsでHTMLをPDFに変換する

小云云
リリース: 2017-11-17 14:49:03
オリジナル
3398 人が閲覧しました

プロジェクト開発中に、js を使用して html ページを pdf に変換することも時折、または頻繁に問題になります。これは、ページ全体を切り取って pdf として保存するのと同じことを意味します。

実際には、HTML を PDF に変換する方法は数多くありますが、おそらく次のとおりです:

1. ほとんどのブラウザーにはこの機能があります。ただし、これはお客様が望んでいることではなく、システム内でアクティブにトリガーできる PDF へのエクスポート機能であるため、このソリューションはパスされます。

2. サードパーティのツールを使用します。 wkhtmltopdf のようなツールを使用してエクスポートする解決策を見つけました。私たちのプロジェクトで試してみましたが、効果は良くなく、svg 画像のサポートも良くありませんでした。合格。

3. もう 1 つの方法は、iText クラスを使用してバックグラウンドで Java ファイルを生成することです。ただし、エクスポートする必要があるページは動的ページであり、ページをバックエンドに直接渡すと多くのスタイルが失われるため、それでもパスします。

結局、良い解決策がなかったので、最初に HTML ページを画像に変換してから、その画像を PDF にエクスポートするという次善の策に落ち着く必要がありました。ユーザーによるエクスポートとダウンロード、およびスタイルの保持をサポートする必要があるため、純粋な JS フロントエンドを実装するのが最善です。

HTML を Canvas に変換したい場合は、html2canvas js を使用してください。これについてはオンラインで多くの紹介があるため、ここではナンセンスには立ち入りません。

さらに厄介なのは、html2canvasを直接使用するとsvgタグの内容をcanvasに変換できないことです。情報を確認した後、jsのcanvgをロックしました。 canvg は、svg タグのコンテンツを Canvas に変換できる Google プラグインです。私たちのプロジェクトに特有のもう 1 つの問題は、グリフィコン フォント アイコンをキャンバスに変換する方法です。これは、このフォント アイコンのサポートがブラウザによってまったく異なるためです。私が見つけた最後の方法は、これらのフォントアイコンを文字コードに置き換えてキャンバスに再描画することでした。キャンバスから画像を生成するときに、くだらない話をする必要はありません。画像からの PDF の生成は jsPDF を使用して実装されます。 長い間苦労した後、ようやくプロセス全体を完了し、コードを段階的に投稿しました。

ステップ 1: 対応する dom ノード内のすべての svg 要素を Canvas に置き換えます

svg2canvas: function(targetElem) {
  var svgElem = targetElem.find('svg');
  svgElem.each(function(index, node) {
    var parentNode = node.parentNode;
    //由于现在的IE不支持直接对svg标签node取内容,所以需要在当前标签外面套一层div,通过外层div的innerHTML属性来获取
    var tempNode = document.createElement('div');
    tempNode.appendChild(node);
    var svg = tempNode.innerHTML;
    var canvas = document.createElement('canvas');
    //转换
    canvg(canvas, svg);
    parentNode.appendChild(canvas);
  });
}
ログイン後にコピー

ステップ 2: グリフィコン フォントを Canvas に変換します。 glyphicons フォント アイコンがプロジェクトで使用されていない場合は、このステップを無視できます

glyphicons2canvas: function(targetElem, fontClassName, fontFamilyName) {
  var iconElems = targetElem.find('.' + fontClassName);
  iconElems.each(function(index, inconNode) {
    var fontSize = $(inconNode).css("font-size");
    var iconColor = $(inconNode).css("color");
    var styleContent = $(inconNode).attr('style');
    //去掉"px"
    fontSize = fontSize.replace("px", "");
    var charCode = getCharCodeByGlyphiconsName(iconName);
    var myCanvas = document.createElement('canvas');
    //把canva宽高各增加2是为了显示图标完整
    myCanvas.width = parseInt(fontSize) + 2;
    myCanvas.height = parseInt(fontSize) + 2;
    myCanvas.style = styleContent;
    var ctx = myCanvas.getContext('2d');
    //设置绘图内容的颜色
    ctx.fillStyle = iconColor;
    //设置绘图的字体大小以及font-family的名字
    ctx.font = fontSize + 'px ' + fontFamilyName;
    ctx.fillText(String.fromCharCode(charCode), 1, parseInt(fontSize) + 1);
    $(inconNode).replaceWith(myCanvas);
  });
}
//根据glyphicons/glyphicon图标的类名获取到对应的char code
getCharCodeByGlyphiconsName: function(iconName) {
  switch (iconName) {
  case("glyphicons-resize-full"):
    return "0xE216";
  case ("glyphicons-chevron-left"):
    return "0xE225";
  default:
    return "";
  }
  }
ログイン後にコピー

ステップ 3: HTML をキャンバスに変換し、画像を PDF に変換します。

html2canvas($("#myExportArea"), {
  onrendered: function(canvas) {
    var imgData = canvas.toDataURL('image/jpeg');
    var img = new Image();
    img.src = imgData;
    //根据图片的尺寸设置pdf的规格,要在图片加载成功时执行,之所以要*0.225是因为比例问题
    img.onload = function() {
      //此处需要注意,pdf横置和竖置两个属性,需要根据宽高的比例来调整,不然会出现显示不完全的问题
      if (this.width > this.height) {
        var doc = new jsPDF('l', 'mm', [this.width * 0.225, this.height * 0.225]);
      } else {
        var doc = new jsPDF('p', 'mm', [this.width * 0.225, this.height * 0.225]);
      }
      doc.addImage(imgData, 'jpeg', 0, 0, this.width * 0.225, this.height * 0.225);
      //根据下载保存成不同的文件名
      doc.save('report_pdf_' + new Date().getTime() + '.pdf');
    }
  },
  background: "#fff",
  //这里给生成的图片默认背景,不然的话,如果你的html根节点没设置背景的话,会用黑色填充。
  allowTaint: true //避免一些不识别的图片干扰,默认为false,遇到不识别的图片干扰则会停止处理html2canvas
});
ログイン後にコピー

この方法では HTML ページを PDF 形式に変換できますが、生成された PDF 効果は明ら​​かに通常のスクリーンショットほど鮮明ではありません。より良い方法がある場合は、アドバイスをお願いします。

関連する推奨事項:

C# で HTML を画像または PDF に変換するにはどうすればよいですか?

C#でWordをPDFに変換する方法のまとめ

HTMLを使用してPDFサンプルコードを生成する

以上がjsでHTMLをPDFに変換するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート