質問: 要件 ・typescript、もしくはjavascriptで実現できること ・コンテンツの文字がコピペできること ・コンテンツ内の文字や、画像が滲んだりせず一定以上の画質であること ・ファイルサイズが大きくなりすぎないこと ・ライブラリを使用する場合は、商用利用可能であり、無償利用可能であること 試したこと ・jsPDF + html2canvas ⇒画質が悪く、コンテンツ部分を画像に変換しているため文字をコピペできず不採用 ・jsPDFのfromHTML ⇒日本語が文字化けするため不採用 ・pdfmake ⇒HTMLを変換できないという記載を見かけたため、あまり調査せず ・ヘッドレス Chrome ⇒ライセンス関係で確信が持てなかったため保留
回答: ヘッドレス ChromeとGoogle製のnodeライブラリ puppeteer を使うのが簡単で画質もいいと思います。 ``` const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('file://C:/a.html'); await page.pdf({path: 'a.pdf', format: 'A4'}); await browser.close(); })(); ``` また、Chromeの利用規約は、以下のようにようになっているため、Chrome自体を再配布することを除いて通常の商用利用に対する制限はないものと思われます。 > > 5. ユーザーによる本サービスの利用 > > > 5.1 ユーザーは、(a)本規約および(b)関連する法域において適用される法律、規制、一般に認められる慣行およびガイドライン等(合衆国またはその他の関係国へのまたはそれらに対する、データまたはソフトウェアの輸出に関する法律を含む)により許可される目的にのみ、本サービスを利用することに同意するものとします。 > > > 5.2 ユーザーは、本サービス(または本サービスに接続されているサーバーおよびネットワーク)を妨害、中断させるいかなる行為も行わないことに同意するものとします。 > > > 5.3 ユーザーは、Google との別個の契約において明確な許可を受けた場合を除き、どのような目的であれ、本サービスの複製、複写、コピー、販売、トレードおよび再販売を行わないことに同意するものとします。 > > > 5.4 ユーザーは、ユーザーが本規約に基づく義務に違反した場合、および上記違反の結果で発生する損失や損害(Google が被る可能性がある損失、損害を含む)について、ユーザーが単独で責任を負うこと、および Google がユーザーおよびいかなる第三者に対しても何らの責任を負わないことに同意するものとします。 > > >