Wkhtmltopdf + Node.JS

PDFドキュメントの作成は、かなり一般的なタスクです。 ライブラリのファミリ全体で正常に処理され、文字通りpdfを部分的に「収集」したり、事前に準備されたテンプレートに基づいて入力したりできます。 このアプローチは信頼できる 1つの碑文のテキストを変更しても、一部のページのページネーションが消えないという事実に頼ることができます。 一方、新しいページをpdfに追加するには、開発者がある程度の時間を要し、視覚要素が多ければ多いほど、時間がかかります。



ただし、pdfドキュメントを作成する別の方法があります。適切なツールを使用して、あるマークアップ言語から変換します。 この方法は効果的であり、選択したツールが非常に予想どおりに機能する場合、pdfを変更するのにかかる時間は短くなります。 同様のソリューションがいくつかありますが、私たちのプロジェクトでは、HTMLからpdfドキュメントを生成するWkhtmltopdfを選択しました 。 このツールを1年使用した後、選択が正しく行われたと言えます。 すべてのニーズは頭で覆われていました。



この記事では、Node.JSのwkhtmltopdfでの作業を簡素化するライブラリを共有します。



現在、npmにはwkhtmltopdfを統合できるパッケージがいくつかあります。 ただし、次のような欠点があります。

  1. wkhtmltopdfのすべてのオプションはオブジェクトとして渡されます。 Wkhtmltopdfには本当に多くのオプションがあり、ドキュメントとコードの間を常に移動して正しいオブジェクトを作成する必要があるため、オプションを入力するときにIDEからヒントをもらいたいと思います。
  2. ほとんどのライブラリでは、すべてのwkhtmltopdf機能がカバーされているわけではありません。 たとえば、どこでも複数のHTMLソースからpdfドキュメントを生成できる可能性があるわけではなく、目次を設定する方法もありません




その結果、wkhtmltopdfパラメータのラッパーであるライブラリwkhtmltopdf-nodejs-options-wrapperと 、pdfドキュメントを作成するために設計されたwkhtmltopdf-nodejs-pdfapiが開発されました。



それらの使用例を考えてみましょう。



var wkhtmlToPdfOptions = require('wkhtmltopdf-nodejs-options-wrapper'), PdfApi = require('wkhtmltopdf-nodejs-pdfapi'); var pdfApi = new PdfApi(), request = new wkhtmlToPdfOptions.CreateRequest(); //    var googlePage = new wkhtmlToPdfOptions.Page(); googlePage.setInput('http://google.com'); //    var habrPage = new wkhtmlToPdfOptions.Page(); habrPage.setInput('http://habrahabr.ru'); habrPage.getOptions().setZoom(0.5); //   50% request.addPage(googlePage); request.addPage(habrPage); request.getGlobalOptions().setImageDpi(300); //     300dpi request.getHeadersAndFooterOptions().setFooterCenter('Footer text'); //      // createPdf    pdf   promise pdfApi.createPdf(request, 'result.pdf') .then(function(data, debug) { console.log('Pdf  '); }, function(data, debug) { console.log(' : ' + data); });
      
      







この例からわかるように、pdfドキュメントを作成するには、 CreateRequestオブジェクトを作成し、必要なデータを入力してpdfApiに転送する必要があります。



IDE(私の場合はWebStorm)は、使用できるメソッドを示します。 画像







この機能はサーバーで使用するには既に十分ですが、クライアントからpdfの作成を開始できるとさらに便利です。 これを行うには、リクエストを受け入れ、既製のpdfファイルを提供するWebサービスが必要です。



このようなサービスとして、WebSocketサーバーwkhtmltopdf-nodejs-ws-serverを使用できます 。これは、次のように簡単に起動できます。



 var WsServer = require('wkhtmltopdf-nodejs-ws-server'); var server = new WsServer(3000); // <-   ""    *:3000 server.start();
      
      





クライアントコードは次のようになります。



 //  webpack  browserify,      <b>require</b> var wkhtmlToPdf = require('wkhtmltopdf-nodejs-options-wrapper'), io = require('socket.io-client'); var socket = io('http://ip__:3000'); var page = new wkhtmlToPdf.Page(), request = new wkhtmlToPdf.CreateRequest(); page.setInput('http://google.com'); //  pdf     request.addPage(page); request.getGlobalOptions().setPageSize('Letter'); socket.on('pdf:create:success', function(response) { console.log('Pdf created: http://ip__:3000/result_' + response.handle + '.pdf'); }); socket.on('pdf:create:fail', function(response) { console.log('Pdf creation failed!'); console.log(response); }); socket.emit('create', request.toObject());
      
      







それだけです pdfドキュメントを作成するにはこれで十分です。



この記事で提供されているnpmパッケージと例が役立つことを願っています。



ご清聴ありがとうございました。



PSドキュメント: wkhtmltopdf-nodejs-options-wrapperwkhtmltopdf-nodejs-pdfapiwkhtmltopdf-nodejs-ws-server



All Articles