まだ維持されているために見えないいくつかのリポジトリを見つけました:
libreoffice
で アプローチ を試しましたが、PDF出力が非常に悪いため、使用できません(差分ページのテキストなど)。
可能であれば、バックグラウンドプロセスを開始したり、サーバーにファイルを保存したりしないようにします。バッファを使用できるソリューションが最適です。プライバシー上の理由から、外部サービスは利用できません。
doc buffer -> pdf buffer
Nodejsでドキュメントをpdfに変換する方法は?
Docx to pdf docxファイルをPDFに変換するライブラリ。
インストール:
npm install docx-pdf --save
使用法
var docxConverter = require('docx-pdf');
docxConverter('./input.docx','./output.pdf',function(err,result){
if(err){
console.log(err);
}
console.log('result'+result);
});
its basically docxConverter(inputPath,outPath,function(err,result){
if(err){
console.log(err);
}
console.log('result'+result);
});
出力は、指定した出力パスに生成されるoutput.pdfである必要があります
今日この質問につまずくかもしれない人のために:
Gotenberg と呼ばれるクールなツールがあります— HTML、MarkdownおよびOfficeドキュメントをPDFに変換するためのDockerを利用したステートレスAPI。 noconv によるDOCの変換をサポートしています。
そして、私はたまたまGotenbergのJS/TSクライアントの著者です— gotenberg-js-client
私はそれを使うことを歓迎します:)
ドキュメントをPDFに変換するには、 niversal Office Converter(unoconv) コマンドラインユーティリティを使用できます。
これは、任意のパッケージマネージャー(例: apt-getを使用してubuntuにインストールするには
Sudo apt-get install unoconv
Unoconvのドキュメントに従って
Unoconvを手動でインストールした場合は、必要なLibreOfficeまたはOpenOfficeパッケージがインストールされていることを確認してください
次の例は、unoconvユーティリティを呼び出す方法を示しています
unoconv -f pdf sample_document.py
PDF sample_document.pyのコンテンツを含むドキュメントを生成します
NodeJSプログラムを使用する場合は、 child process を使用してコマンドを呼び出すことができます
子プロセスを使用してPDFを作成するためのunoconvを使用する方法を示す以下のコードを見つけてください
const util = require('util');
const exec = util.promisify(require('child_process').exec);
async function createPDFExample() {
const { stdout, stderr } = await exec('unoconv -f pdf sample.js');
console.log('stdout:', stdout);
console.log('stderr:', stderr);
}
createPDFExample();
遅ればせながら、試してみてください https://www.npmjs.com/package/@nativedocuments/docx-wasm これは、リリースしたばかりです(2019年1月)。
ローカルで変換を実行します。LibreOffice、unoconvなどは必要ありません。
const fs = require('fs');
const docx = require("@nativedocuments/docx-wasm");
// init docx engine
docx.init({
// ND_DEV_ID: "XXXXXXXXXXXXXXXXXXXXXXXXXX", // goto https://developers.nativedocuments.com/ to get a dev-id/dev-secret
// ND_DEV_SECRET: "YYYYYYYYYYYYYYYYYYYYYYYYYY", // you can also set the credentials in the enviroment variables
ENVIRONMENT: "NODE", // required
LAZY_INIT: true // if set to false the WASM engine will be initialized right now, usefull pre-caching (like e.g. for AWS lambda)
}).catch( function(e) {
console.error(e);
});
async function convertHelper(document, exportFct) {
const api = await docx.engine();
await api.load(document);
const arrayBuffer = await api[exportFct]();
await api.close();
return arrayBuffer;
}
convertHelper("sample.docx", "exportPDF").then((arrayBuffer) => {
fs.writeFileSync("sample.pdf", new Uint8Array(arrayBuffer));
}).catch((e) => {
console.error(e);
});
上記のコードからわかるように、APIキー(フリーミアムモデル)が必要です。
アプリケーションの作成中に、ユーザーがアップロードしたdocまたはdocxファイルを、さらに分析するためにpdfファイルに変換する必要があります。この目的のために、npmパッケージlibreoffice-convertを使用しました。 libreoffice-convertを使用するには、Linuxマシンにlibreofficeをインストールする必要があります。ここに私が使用したサンプルコードがあります。このコードは、nodejsベースのアプリケーション用のJavaScriptで記述されています。
const libre = require('libreoffice-convert');
const path = require('path');
const fs = require('fs').promises;
let lib_convert = promisify(libre.convert)
async function convert(name="myresume.docx") {
try {
let arr = name.split('.')
const enterPath = path.join(__dirname, `/public/Resume/${name}`);
const outputPath = path.join(__dirname, `/public/Resume/${arr[0]}.pdf`);
// Read file
let data = await fs.readFile(enterPath)
let done = await lib_convert(data, '.pdf', undefined)
await fs.writeFile(outputPath, done)
return { success: true, fileName: arr[0] };
} catch (err) {
console.log(err)
return { success: false }
}
}
非常に高品質のPDFが得られます。