JavaScriptまたはjqueryを使用してHTMLページをPDFとして保存することは可能ですか?
詳細に:
テーブルを含む1つのHTMLページを生成しました。「PDFとして保存」ボタンが1つあります。ユーザーがそのボタンをクリックすると、そのHTMLページはPDFファイルとして変換する必要があります。
JavaScriptまたはjqueryを使用することは可能ですか?
JavaScriptまたはjqueryを使用してHTMLページをPDFとして保存することは可能ですか?
詳細に:
テーブルを含む1つのHTMLページを生成しました。「PDFとして保存」ボタンが1つあります。ユーザーがそのボタンをクリックすると、そのHTMLページはPDFファイルとして変換する必要があります。
JavaScriptまたはjqueryを使用することは可能ですか?
回答:
はい、jspdfを使用してPDFファイルを作成します。
次に、それをデータURIに変換し、ダウンロードリンクをDOMに挿入できます。
ただし、HTMLからPDFへの変換は自分で作成する必要があります。
ページの印刷用バージョンを使用して、ユーザーがページの印刷方法を選択できるようにします。
編集:どうやらそれは最小限のサポートを持っています
したがって、答えは、独自のPDFライターを作成するか、既存のPDFライターに(サーバー上で)それを実行してもらうことです。
ええ、JavaScriptで行うのはとても簡単です。このコードがお役に立てば幸いです。
JSpdfライブラリが必要です。
<div id="content">
<h3>Hello, this is a H3 tag</h3>
<p>a pararaph</p>
</div>
<div id="editor"></div>
<button id="cmd">Generate PDF</button>
<script>
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');
});
// This code is collected but useful, click below to jsfiddle link.
</script>
これは遅い答えかもしれませんが、これは周りに最適です:https: //github.com/eKoopmans/html2pdf
純粋なJavaScriptの実装。IDで要素を1つだけ指定し、変換することができます。
Phantomjsを使用できます。ここからダウンロードし、次の例を使用してhtml-> pdf変換機能をテストしますhttps://github.com/ariya/phantomjs/blob/master/examples/rasterize.js
コード例:
phantomjs.exe examples/rasterize.js http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/xhtml/index.html sample.pdf
私はライブラリを使用jsPDF
してdom-to-image
HTMLをPDFにエクスポートしました。
関係者への参照としてここに投稿します。
$('#downloadPDF').click(function () {
domtoimage.toPng(document.getElementById('content2'))
.then(function (blob) {
var pdf = new jsPDF('l', 'pt', [$('#content2').width(), $('#content2').height()]);
pdf.addImage(blob, 'PNG', 0, 0, $('#content2').width(), $('#content2').height());
pdf.save("test.pdf");
});
});
これが私がそれを行う方法です、そのアイデアは防弾設計ではありません、あなたはそれを修正する必要があります
htmlをpdfサーバー側に変換する方がはるかに簡単で信頼性があります。GooglePuppeteerを使用しています。選択したサーバーサイド言語のラッパーで適切に管理されます。Puppeteerは、ヘッドレスChromeを使用してスクリーンショットやPDFファイルを生成します。特に表、画像、グラフ、複数のページなどを含む複雑なPDFファイルを生成する必要がある場合は、頭痛の種を大幅に減らすことができます。
JavaScriptを使用してHTMLをPDfに変換するもう1つの非常に明白な方法があります。そのために、オンラインAPIを使用します。ユーザーがオフラインのときに変換を行う必要がない場合、これは正常に機能します。
PdfMageは、優れたAPIを備え、無料のアカウントを提供する1つのオプションです。私はあなたが多くの選択肢を見つけることができると確信しています(例えば、ここに)
PdfMage APIの場合、次のようになります。
$.ajax({
url: "https://pdfmage.org/pdf-api/v1/process",
type: "POST",
crossDomain: true,
data: { Html:"<html><body>Hi there!</body></html>" },
dataType: "json",
headers: {
"X-Api-Key": "your-key-here" // not very secure, but a valid option for non-public domains/intranet
},
success: function (response) {
window.location = response.Data.DownloadUrl;
},
error: function (xhr, status) {
alert("error");
}
});
はい。たとえば、https://grabz.itでソリューションを使用できます。
スクリーンショットを取得して操作するためにさまざまな方法で使用できるJavascriptAPIがあります。アプリで使用するには、まずアプリのキーとシークレットを取得し、無料のJavascriptSDKをダウンロードする必要があります。
それで、それを使用するための簡単な例を見てみましょう:
//first include the grabzit.min.js library in the web page
<script src="grabzit.min.js"></script>
//include the code below to add the screenshot to the body tag
<script>
//use secret key to sign in. replace the url.
GrabzIt("Sign in to view your Application Key").ConvertURL("http://www.google.com").Create();
</script>
次に、しばらく待つだけで、ページをリロードしなくても、画像がページの下部に自動的に表示されます。
それが最も簡単なものです。画像操作、要素へのスクリーンショットの添付などのその他の例については、ドキュメントを確認してください。
$('#cmd2').click(function() {
var options = {
//'width': 800,
};
var pdf = new jsPDF('p', 'pt', 'a4');
pdf.addHTML($("#content2"), -1, 220, options, function() {
pdf.save('admit_card.pdf');
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.min.js"></script>
<div id="content2" style="background: #fff;border-bottom: 1px solid #ffffff;">
<div class="tokenDet" style="padding: 15px;border: 1px solid #000;width: 80%;margin: 0 auto;position: relative;overflow: hidden;">
<div class="title" style="text-align: center;border-bottom: 1px solid #000;margin-bottom: 15px;">
<h2>Entrance Exam Hall Ticket</h2>
</div>
<div class="parentdiv" style="display: inline-block;width: 100%;position: relative;">
<div class="innerdiv" style="width: 80%;float: left;">
<div class="restDet">
<div class="div">
<div class="label" style="width: 30%;float: left;">
<strong>Name</strong>
</div>
<div class="data" style="width: 70%;display: inline-block;">
<span>Santanu Patra</span>
</div>
<div class="label" style="width: 30%;float: left;">
<strong>D.O.B.</strong>
</div>
<div class="data" style="width: 70%;display: inline-block;">
<span>17th April, 1995</span>
</div>
<div class="label" style="width: 30%;float: left;">
<strong>Address</strong>
</div>
<div class="data" style="width: 70%;display: inline-block;">
<span>P.S. Srijan Corporate Park, Saltlake, Sector 5, Kolkata-91</span>
</div>
<div class="label" style="width: 30%;float: left;">
<strong>Contact Number</strong>
</div>
<div class="data" style="width: 70%;display: inline-block;">
<span>9874563210</span>
</div>
<div class="label" style="width: 30%;float: left;">
<strong>Email Id</strong>
</div>
<div class="data" style="width: 70%;display: inline-block;">
<span>santanu@macallied.com</span>
</div>
<div class="label" style="width: 30%;float: left;">
<strong>Parent(s) Name</strong>
</div>
<div class="data" style="width: 70%;display: inline-block;">
<span>S. Patra</span><br /><span>7896541230</span>
</div>
<div class="label" style="width: 30%;float: left;">
<strong>Exam Center</strong>
</div>
<div class="data" style="width: 70%;display: inline-block;">
<span>Institute of Engineering & Management</span>
</div>
<div class="label" style="width: 30%;float: left;">
<strong>Hall Number</strong>
</div>
<div class="data" style="width: 70%;display: inline-block;">
<span>COM-32</span>
</div>
</div>
</div>
</div>
<div class="sideDiv" style="width: 20%;float: left;">
<div class="atts" style="float: left;width: 100%;">
<div class="photo" style="width: 115px;height: 150px;float: right;">
<img src="images/candidateImg.gif" style="width: 100%;"/>
</div>
<div class="sign" style="position: absolute;bottom: 0;right: 0;border-top: 1px dashed #000;left: 80%;text-align: right;">
<small>Self Attested</small>
</div>
</div>
</div>
</div>
</div>
</div>
<button class="btn btn-info" id="cmd2">Download Token</button>
要するに:いいえ。最初の問題はファイルシステムへのアクセスです。ほとんどのブラウザでは、セキュリティ上の理由からデフォルトでnoに設定されています。最近のブラウザは、データベースの形で最小限のストレージをサポートする場合があります。または、ファイルアクセスを有効にするようにユーザーに依頼することもできます。
ファイルシステムにアクセスできる場合、HTMLとして保存するのはそれほど難しくありません(JSドキュメントのファイルオブジェクトを参照してください)が、PDFはそれほど簡単ではありません。PDFは非常に高度なファイル形式であり、Javascriptにはあまり適していません。単語やクワッドなど、Javascriptで直接サポートされていないデータ型で情報を記述する必要があります。また、ファイルに保存する必要のある辞書検索システムを事前に定義する必要があります。誰かがそれを機能させることができると確信していますが、それに伴う労力と時間は、C ++またはDelphiの学習に費やしたほうがよいでしょう。
ただし、ユーザーが制限なしのアクセスを許可した場合、HTMLエクスポートは可能です。