blog

nodejsでword文書を動的に生成する

会社の新しいドキュメントを役割に応じて別のwordドキュメントを生成するのですが、重複コンテンツが多く、コンテンツの削除を増やすたびにすべてのドキュメントを更新する必要があり、メンテナンスが面倒なこと...

Mar 19, 2020 · 3 min. read
シェア

コンテキスト

会社の新しい文書は、役割に応じて別のWord文書を生成しますが、重複するコンテンツが大量にあり、コンテンツの削除を増加させるたびにすべての文書を更新する必要があり、メンテナンスがあまりにも面倒です、さらに、私は文書を書くためにマークダウンを使用したいので、私はテンプレートを介してマークダウンとWordを生成する方法を勉強しました。

機能は以下の通りです。

  • 重複コンテンツは一カ所で管理
  • markdown
  • word
  • ローカルイメージのサポート

github

新人の文書が次のようなものだとします。

管理者であれば、追加入力3が表示され、管理者+名前で歓迎されますが、一般社員は一般社員+名前のみ表示されます。

<!-- template/welcome.md -->
## 備考1
 +  1
 +  2
 <% if (admin) { %>+  3<% } %>
<% if (admin) { %>
<h2>ようこそ、管理者<%= userName %></h2>
<% } else { %>
<h3> ようこそ、ゼネラル・スタッフ<%= userName %> </h3>
<% } %> 
![ 1](./static/1.png)

マークダウン出力

/**
 * @description テンプレートファイルの変数を置き換える
 * @param {*} tempPath テンプレート魯人
 * @param {*} options 置き換える変数
 */
function renderFile(tempPath, options) {
 return new Promise((resolve, reject) => {
 ejs.renderFile(tempPath, options, function (err, result) {
 if (err) {
 reject(err);
 return;
 }
 resolve(result);
 });
 });
}
/**
 * @param {String} outputPath 出力ファイルへのパス
 */
function renderOutput(outputPath, content) {
 return new Promise((resolve, reject) => {
 fs.writeFile(outputPath, content, (err) => {
 if (err) {
 reject(err);
 return;
 }
 resolve();
 });
 });
}

さまざまなオプションを渡すことで、動的なコンテンツを実装したり、役割を区別したりすることがすでに可能であることがわかります。

ワード出力

/**
 *
 * @param {*} markdownPath markdown 
 * @param {*} outputPath 出力パス
 */
function renderMarkdownToWord(markdownPath, outputPath) {
 return new Promise((resolve, reject) => {
 fs.readFile(markdownPath, "utf8", function (err, file) {
 if (err) {
 reject(err);
 return;
 }
 const result = getHtml(marked(file));
 renderOutput(outputPath, html2Docx.asBlob(result));
 });
 });
}
/**
 * @description スタイルを変更する
 * @param {*} template コンテンツをレンダリングする
 */
function getHtml(template) {
 return `
 <!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="UTF-8">
 <title></title>
 <style>
 .markdown-body {
 box-sizing: border-box;
 min-width: 200px;
 max-width: 980px;
 margin: 0 auto;
 padding: 45px;
 }
 @media (max-width: 767px) {
 .markdown-body {
 padding: 15px;
 }
 }
 {{{style}}}
 </style>
 </head>
 <body>
 <div class="markdown-body">
 ${template}
 </div>
 </body>
 </html>
`;
}

ローカルイメージのサポート

にあるからだ。 `output/img` にアップロードされているので、生成されたマークダウンに直接アクセスすることができる。base64
/**
 *
 * @param {*} imgPath イメージパス
 */
function renderImgToBase64(imgPath) {
 let bitmap = fs.readFileSync(imgPath);
 return (
 "data:image/png;base64," + Buffer.from(bitmap, "binary").toString("base64")
 ); // base64 
}

renderMarkdownToWordメソッドを変更します。

今回の記事はここまでです。

テクニカル・セレクション

テンプレートエンジン

テンプレートエンジンの多くは、パグは現在、この会社に来た唯一の接触が、私は構文を見て非常にEjsやアンダースコアを使用することに慣れていないか、この記事では、テンプレートエンジンとしてEjsを使用しています

 let people = ['geddy', 'neil', 'alex'];
 let html = ejs.render('<%= people.join(", "); %>', {people: people}); // echo -> geddy, neil, alex

単語の生成

html-docx-jsを使った単語の生成

ギズブ

この記事の内容はすべてgithubアップロードされています。

Read next

Jenkinsの設定 gitLab ssh認証

2.Gitlabで本番用のSSHキーを設定します。

Mar 19, 2020 · 2 min read