プロジェクト開発中に、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 に変換するにはどうすればよいですか?
以上がjsでHTMLをPDFに変換するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。